Skip to content

Bybit Easy Earn Pipeline

Bybit Easy Earn ingestion использует тот же net/http паттерн, что и существующий Bybit Launchpool, но с другим endpoint и пагинацией overview-списка.

Компоненты

  • SyncBybitEasyEarnWorkflow — вызывает Bybit Easy Earn list API, нормализует coin groups и пишет snapshots в Timescale через SQL ingest.
  • internal/worker/models/bybit_easy_earn.go
  • internal/worker/activities/sync_bybit_easy_earn.go
  • internal/worker/workflows/sync_bybit_easy_earn.go
  • internal/db/migrations/00018_bybit_easy_earn_snapshot_schema.sql
  • internal/db/migrations/00019_bybit_easy_earn_aggregates_policies.sql

API Endpoint

  • GET https://www.bybit.com/x-api/s1/byfi/get-coins
  • POST https://www.bybit.com/x-api/s1/byfi/get-easy-earn-product-list

Confirmed request body для overview:

{
  "tab": 0,
  "page": 1,
  "limit": 10,
  "fixed_saving_version": 1
}

Notes:

  • discovery показал 403 Access Denied для обычного curl из текущего окружения;
  • pipeline повторяет Bybit Launchpool pattern и поддерживает browser-like headers plus optional env overrides;
  • если endpoint требует session gate, можно передать BYBIT_EASY_EARN_COOKIE и BYBIT_EASY_EARN_TRACEPARENT.

Mapping

  • project = coin group (BTC, USDT, USDC, ...)
  • subpool = конкретный Easy Earn product (product_id:product_type)
  • project_coin <= coin resolved via get-coins
  • reward_coin <= return_coin resolved via get-coins
  • project_status агрегируется по subpool statuses
  • subpool_status:
  • future subscribe_start_at => Upcoming
  • past subscribe_end_at => Ended
  • display_status in (1,2) without ended timing => Active
  • display_status_text:
  • 1 => Invest Now
  • 2 => Sold Out

Это status mapping частично основан на confirmed page text и partially inferred from the page bundle/status behavior.

Persistence

  • ingest_bybit_easy_earn_snapshot($1::jsonb)
  • internal path /x-api/s1/byfi/get-easy-earn-product-list
  • source marker api

Tables:

  • fct_bybit_easy_earn_snapshot
  • fct_bybit_easy_earn_subpool_snapshot
  • fct_bybit_easy_earn_response_snapshot
  • fct_bybit_easy_earn_quarantine
  • fct_bybit_easy_earn_5min
  • fct_bybit_easy_earn_daily

Manual Run

docker compose exec -T temporal-admin-tools temporal workflow start \
  --address temporal:7233 --namespace default --task-queue default \
  --type SyncBybitEasyEarnWorkflow \
  --workflow-id sync-bybit-easy-earn-manual-$(date +%s) \
  --input '{}'

Verification

  • Workflow result counters: projects_seen, projects_upserted, subpools_seen, subpools_upserted, quarantine_rows
  • SQL:
  • SELECT COUNT(*) FROM fct_bybit_easy_earn_snapshot;
  • SELECT COUNT(*) FROM fct_bybit_easy_earn_subpool_snapshot;
  • SELECT reason, COUNT(*) FROM fct_bybit_easy_earn_quarantine GROUP BY reason ORDER BY COUNT(*) DESC;