Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.
This quickstart takes you from nothing to live onchain data in your own database in about ten minutes.
You generate a sink starter pack in the Admin Panel, run it with Docker, and query your first rows. Every
template and migration guide
then follows the same pattern.
Data Feeds is a technical product: you run the infrastructure. Unlike the REST API, the data lands in a
database you own and operate: you run the Docker sink, you provision Postgres/ClickHouse (locally for this
quickstart; on your own servers in production), and you are responsible for storing, sizing, and backing up
the decompressed data. Decoded onchain data expands significantly from its compressed transport size, so budget
disk accordingly.
Docker and Docker Compose installed and running.
A Data Feeds API key (cm_live_...) from Moralis Admin.
Access to the Moralis Admin Panel, where you generate the sink config.
A machine with enough disk headroom for your backfill window: start small (tip-500) and widen once
you’ve seen the per-block footprint for your chain.
In the Admin Panel, configure a sink (pick your chain, topic, and destination database) and
download the starter pack (continuum-sink-starter.zip). Unzip it. You get:
File
What it is
sink-config.yaml
The sink config you generated: Continuum URL, namespace (chain), topic, and destination.
docker-compose.yml
Brings up the sink (moralisweb3/continuum-sink) plus a local PostgreSQL.
.env
Your API key and DB password. Do not commit or share it.
schema.sql
DDL for the destination table(s), auto-applied to Postgres on first start.
README.txt
The same steps you are reading here.
namespace is the chain, as a hex chain ID. For example 0x1 is Ethereum, 0xa4b1 is Arbitrum One. See
the chain reference below. topic (e.g. master-3) is the master block stream the sink
reads.
Open .env and confirm your key is set; the generated file sometimes ships with a blank or placeholder
key:
# .env (do not commit)MORALIS_API_KEY=cm_live_... # your full key — the sink fails with "api_key is required" if blankSINK_PG_PASSWORD=... # already set for the bundled Postgres
Keep your key private. It is a live credential. Never commit .env or paste the key into shared docs or
chat. If a key leaks, rotate it.
This starts PostgreSQL (with schema.sql applied) and the sink. The sink reads a backfill window from the
upstream S3 store, then tails live blocks. Watch it work:
docker compose logs -f sink
Querying from your own app on the host? The bundled Postgres is only reachable inside the Docker network
by default. Add a port mapping to the postgres service so you can connect from your machine:
postgres: ports: - "5544:5432"
Then connect to localhost:5544 (user/db sdf, password from .env).
Migrating an existing integration? Find your endpoint in the Migration guides.
Want a different dataset? Browse the templates: swaps, balances, holders, prices,
NFT activity. They all run the same way; swap the transform and schema.
Hit something surprising? The Troubleshooting page covers the common
first-run questions.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Moralis","colors":{"primary":"#0f7fff","light":"#0f7fff","dark":"#0f7fff"},"logo":{"light":"https://mintcdn.com/moralis/GWFD1O4mIZzaStPO/logo/light.png?fit=max\u0026auto=format\u0026n=GWFD1O4mIZzaStPO\u0026q=85\u0026s=66e6da0d81943c4679e0ba921850201d","dark":"https://mintcdn.com/moralis/GWFD1O4mIZzaStPO/logo/dark.png?fit=max\u0026auto=format\u0026n=GWFD1O4mIZzaStPO\u0026q=85\u0026s=39f72ccb7cd088ee041f49d8b76acc8c"},"favicon":"https://mintcdn.com/moralis/UBURjGZyEKeu353P/favicon.png?fit=max\u0026auto=format\u0026n=UBURjGZyEKeu353P\u0026q=85\u0026s=cd5557efb5310bf231b9dede4be7ca4d","appearance":{"default":"light"},"background":{"color":{"dark":"#191B19"}},"navbar":{"links":[{"href":"https://moralis.com/enterprise/","label":"Enterprise"},{"href":"https://status.moralis.io/","label":"Status"}],"primary":{"type":"button","label":"Try Now","href":"https://admin.moralis.com/register"}},"footer":{"socials":{"youtube":"https://www.youtube.com/channel/UCgWS9Q3P5AxCWyQLT2kQhBw","x":"https://x.com/moralisdevs","linkedin":"https://www.linkedin.com/company/moralisweb3","discord":"https://discord.gg/s3UfDvXQTc","website":"https://moralis.com/"},"links":[{"header":"AI","items":[{"label":"LLMs.txt","href":"https://docs.moralis.com/llms.txt"},{"label":"Full LLMs.txt","href":"https://docs.moralis.com/llms-full.txt"}]}]},"fonts":{"family":"sw","source":"https://mintlify-assets.b-cdn.net/fonts/sw.woff2","format":"woff2"},"contextual":{"options":["chatgpt","claude","copy","view"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"moralis","hasAudioNarration":false,"actualSubdomain":"moralis","customDomains":["docs.moralis.com"],"gitSource":{"type":"github","owner":"novnski","repo":"docs-v2","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aec67aca93f970ede8ce627","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"RPC Nodes","count":560},{"language":"default","tag":"Data API","count":204},{"language":"default","tag":"EVM API","count":96},{"language":"default","tag":"Streams","count":96},{"language":"default","tag":"Get Started","count":67},{"language":"default","tag":"Tutorials \u0026 Guides","count":62},{"language":"default","tag":"Data Feeds","count":50},{"language":"default","tag":"Token API","count":49},{"language":"default","tag":"Wallet API","count":43},{"language":"default","tag":"Solana API","count":32}]},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"data-feeds/migration/quickstart","slug":"/data-feeds/migration/quickstart","pageMetadata":{"title":"Quickstart: Run Your First Sink","description":"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.","href":"/data-feeds/migration/quickstart"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const RequestAccessButton=({href=`https://admin.moralis.com/data-feeds`,title=`Try it today`})=>{const _components={a:`a`,..._provideComponents()};return _jsxs(_components.a,{href,className:`request-access-button`,style:{display:`inline-flex`,alignItems:`center`,gap:`8px`,padding:`12px 24px`,borderRadius:`8px`,background:`linear-gradient(135deg, #0f7fff 0%, #0a5fd9 100%)`,color:`#fff`,fontSize:`15px`,fontWeight:600,textDecoration:`none`,border:`none`,boxShadow:`0 2px 8px rgba(15, 127, 255, 0.35)`,transition:`box-shadow 0.15s ease, transform 0.15s ease`,width:`fit-content`},children:[_jsx(`style`,{dangerouslySetInnerHTML:{__html:`\n .request-access-button,\n .request-access-button:hover {\n color: #fff !important;\n text-decoration: none !important;\n }\n .request-access-button:hover {\n box-shadow: 0 4px 14px rgba(15, 127, 255, 0.5);\n transform: translateY(-1px);\n }\n `}}),_jsx(`span`,{children:title}),_jsx(`span`,{\"aria-hidden\":`true`,children:`→`})]})};function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Tip,Warning,_MdxComponentBoundary}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`This quickstart takes you from nothing to `,_jsx(_components.strong,{children:`live onchain data in your own database`}),` in about ten minutes.\nYou generate a `,_jsx(_components.strong,{children:`sink starter pack`}),` in the Admin Panel, run it with Docker, and query your first rows. Every\n`,_jsx(_components.a,{href:`/data-feeds/templates/overview`,children:`template`}),` and `,_jsx(_components.a,{href:`/data-feeds/migration/overview`,children:`migration guide`}),`\nthen follows the same pattern.`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-begin`,children:`Before you begin`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Data Feeds is a technical product: you run the infrastructure.`}),` Unlike the REST API, the data lands in a\ndatabase `,_jsx(_components.strong,{children:`you own and operate`}),`: you run the Docker sink, you provision Postgres/ClickHouse (locally for this\nquickstart; on your own servers in production), and you are responsible for storing, sizing, and backing up\nthe decompressed data. Decoded onchain data expands significantly from its compressed transport size, so budget\ndisk accordingly.`]})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Docker`}),` and Docker Compose installed and running.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`Data Feeds API key`}),` (`,_jsx(_components.code,{children:`cm_live_...`}),`) from Moralis Admin.`]}),`\n`,_jsxs(_components.li,{children:[`Access to the `,_jsx(_components.strong,{children:`Moralis Admin Panel`}),`, where you generate the sink config.`]}),`\n`,_jsxs(_components.li,{children:[`A machine with enough `,_jsx(_components.strong,{children:`disk headroom`}),` for your backfill window: start small (`,_jsx(_components.code,{children:`tip-500`}),`) and widen once\nyou’ve seen the per-block footprint for your chain.`]}),`\n`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`RequestAccessButton`,children:_jsx(RequestAccessButton,{href:`https://admin.moralis.com/data-feeds`,title:`Open Data Feeds in Moralis Admin`})}),`\n`,_jsx(Heading,{level:`2`,id:`step-1-generate-your-sink-starter-pack`,children:`Step 1: generate your sink starter pack`}),`\n`,_jsxs(_components.p,{children:[`In the Admin Panel, configure a sink (pick your `,_jsx(_components.strong,{children:`chain`}),`, `,_jsx(_components.strong,{children:`topic`}),`, and `,_jsx(_components.strong,{children:`destination database`}),`) and\ndownload the `,_jsx(_components.strong,{children:`starter pack`}),` (`,_jsx(_components.code,{children:`continuum-sink-starter.zip`}),`). Unzip it. You get:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`File`}),_jsx(_components.th,{children:`What it is`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`sink-config.yaml`})}),_jsxs(_components.td,{children:[`The sink config you generated: Continuum URL, `,_jsx(_components.code,{children:`namespace`}),` (chain), `,_jsx(_components.code,{children:`topic`}),`, and destination.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`docker-compose.yml`})}),_jsxs(_components.td,{children:[`Brings up the sink (`,_jsx(_components.code,{children:`moralisweb3/continuum-sink`}),`) plus a local PostgreSQL.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`.env`})}),_jsxs(_components.td,{children:[`Your API key and DB password. `,_jsx(_components.strong,{children:`Do not commit or share it.`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`schema.sql`})}),_jsx(_components.td,{children:`DDL for the destination table(s), auto-applied to Postgres on first start.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`README.txt`})}),_jsx(_components.td,{children:`The same steps you are reading here.`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`namespace`}),` is the chain, as a hex chain ID.`]}),` For example `,_jsx(_components.code,{children:`0x1`}),` is Ethereum, `,_jsx(_components.code,{children:`0xa4b1`}),` is Arbitrum One. See\nthe `,_jsx(_components.a,{href:`#chain-reference`,children:`chain reference`}),` below. `,_jsx(_components.code,{children:`topic`}),` (e.g. `,_jsx(_components.code,{children:`master-3`}),`) is the master block stream the sink\nreads.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`step-2-add-your-api-key`,children:`Step 2: add your API key`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.code,{children:`.env`}),` and confirm your key is set; the generated file sometimes ships with a `,_jsx(_components.strong,{children:`blank or placeholder`}),`\nkey:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# .env (do not commit)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`MORALIS_API_KEY=cm_live_... `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# your full key — the sink fails with \"api_key is required\" if blank`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`SINK_PG_PASSWORD=... `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# already set for the bundled Postgres`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Keep your key private.`}),` It is a live credential. Never commit `,_jsx(_components.code,{children:`.env`}),` or paste the key into shared docs or\nchat. If a key leaks, rotate it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`step-3-start-the-stack`,children:`Step 3: start the stack`}),`\n`,_jsx(_components.p,{children:`From the unzipped directory:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` compose up -d`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`This starts PostgreSQL (with `,_jsx(_components.code,{children:`schema.sql`}),` applied) and the sink. The sink reads a backfill window from the\nupstream S3 store, then tails live blocks. Watch it work:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` compose logs -f sink`})]}),`\n`]})})}),`\n`,_jsxs(Tip,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Querying from your own app on the host?`}),` The bundled Postgres is only reachable inside the Docker network\nby default. Add a port mapping to the `,_jsx(_components.code,{children:`postgres`}),` service so you can connect from your machine:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` postgres`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` ports`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"5544:5432\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`Then connect to `,_jsx(_components.code,{children:`localhost:5544`}),` (user/db `,_jsx(_components.code,{children:`sdf`}),`, password from `,_jsx(_components.code,{children:`.env`}),`).`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`step-4-query-your-first-rows`,children:`Step 4: query your first rows`}),`\n`,_jsxs(_components.p,{children:[`The default `,_jsx(_components.code,{children:`tokenTransfers`}),` config writes to a table named after your sink (here, `,_jsx(_components.code,{children:`sdf`}),`):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`docker`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` compose exec postgres psql -U sdf -d sdf -c \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SELECT count(*), max(position) AS latest_block FROM public.sdf;\"`})}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`-- the most recent transfers`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` position, tokenaddress, fromaddress, toaddress, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`value`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` public`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`sdf`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`ORDER BY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` position `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`DESC`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`LIMIT`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`You should see the count climb as new blocks land. That is live, decoded onchain data in a store you own: no\nAPI quotas, no per-call limits.`}),`\n`,_jsx(Heading,{level:`2`,id:`if-no-rows-arrive`,children:`If no rows arrive`}),`\n`,_jsx(_components.p,{children:`The pipe has a few moving parts. Work down this list:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Cause`}),_jsx(_components.th,{children:`Fix`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`continuum.api_key is required`}),` in sink logs`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`MORALIS_API_KEY`}),` blank in `,_jsx(_components.code,{children:`.env`})]}),_jsxs(_components.td,{children:[`Paste your full `,_jsx(_components.code,{children:`cm_live_...`}),` key, `,_jsx(_components.code,{children:`docker compose up -d --force-recreate sink`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Sink logs stop after `,_jsx(_components.code,{children:`s3-proxy reachable`}),` and rows stay at 0`]}),_jsx(_components.td,{children:`Upstream S3 backfill stalled (e.g. “Partition not found”)`}),_jsx(_components.td,{children:`Not your setup. Confirm the chain/topic backfill is healthy with the team, then it resumes automatically.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Can connect but app can’t reach Postgres`}),_jsx(_components.td,{children:`No host port mapping`}),_jsxs(_components.td,{children:[`Add the `,_jsx(_components.code,{children:`ports`}),` block from Step 3.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`chain-reference`,children:`Chain reference`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`namespace`}),` in `,_jsx(_components.code,{children:`sink-config.yaml`}),` is the chain’s ID in hex:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Chain`}),_jsx(_components.th,{children:`Chain ID`}),_jsx(_components.th,{children:_jsx(_components.code,{children:`namespace`})})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Ethereum`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Optimism`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`10`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xa`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`BNB Chain`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`56`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x38`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Polygon`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`137`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x89`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Base`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`8453`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x2105`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Arbitrum One`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`42161`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xa4b1`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Avalanche`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`43114`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xa86a`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-just-happened`,children:`What just happened`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`starter pack`}),` carried a generated `,_jsx(_components.code,{children:`sink-config.yaml`}),` (chain, topic, destination) and a matching schema.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`sink`}),` (`,_jsx(_components.code,{children:`moralisweb3/continuum-sink`}),`) read the master block stream, backfilled history, then stayed live.`]}),`\n`,_jsx(_components.li,{children:`You queried a normal SQL table, yours to join and shape freely.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Migrating an existing integration?`}),` Find your endpoint in the `,_jsx(_components.a,{href:`/data-feeds/migration/overview`,children:`Migration guides`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Want a different dataset?`}),` Browse the `,_jsx(_components.a,{href:`/data-feeds/templates/overview`,children:`templates`}),`: swaps, balances, holders, prices,\nNFT activity. They all run the same way; swap the transform and schema.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Understand the model:`}),` `,_jsx(_components.a,{href:`/data-feeds/concepts/what-are-data-feeds`,children:`What are Data Feeds?`}),`,\n`,_jsx(_components.a,{href:`/data-feeds/concepts/history-and-backfill`,children:`History \u0026 backfill`}),`, and `,_jsx(_components.a,{href:`/data-feeds/concepts/destinations`,children:`Destinations`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Hit something surprising?`}),` The `,_jsx(_components.a,{href:`/data-feeds/migration/troubleshooting`,children:`Troubleshooting`}),` page covers the common\nfirst-run questions.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{RequestAccessButton,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Quickstart: Run Your First Sink","description":"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.","href":"/data-feeds/migration/quickstart"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[155,1217,")=>null;function _cr"]]},"mdxExtracts":{"tableOfContents":[{"title":"Before you begin","slug":"before-you-begin","depth":2,"children":[]},{"title":"Step 1: generate your sink starter pack","slug":"step-1-generate-your-sink-starter-pack","depth":2,"children":[]},{"title":"Step 2: add your API key","slug":"step-2-add-your-api-key","depth":2,"children":[]},{"title":"Step 3: start the stack","slug":"step-3-start-the-stack","depth":2,"children":[]},{"title":"Step 4: query your first rows","slug":"step-4-query-your-first-rows","depth":2,"children":[]},{"title":"If no rows arrive","slug":"if-no-rows-arrive","depth":2,"children":[]},{"title":"Chain reference","slug":"chain-reference","depth":2,"children":[]},{"title":"What just happened","slug":"what-just-happened","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"moralis","siteName":"Moralis","title":"Quickstart: Run Your First Sink - Moralis","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-28T14:26:54.592Z","originalFileLocation":"data-feeds/migration/quickstart.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Moralis\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Quickstart: Run Your First Sink - Moralis\">\u003cmeta data-mint-head property=\"og:description\" content=\"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Moralis\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.moralis.com/data-feeds/migration/quickstart\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://moralis.mintlify.site/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Quickstart%3A+Run+Your+First+Sink\u0026amp;description=Get+live%2C+decoded+onchain+data+flowing+into+your+own+database+in+about+ten+minutes.+Generate+a+sink+starter+pack%2C+run+it+with+Docker%2C+and+query+your+first+rows.\u0026amp;theme=3021c0945ade0560af7b28a8\u0026amp;signature=31e893a38c321259c398dad2e958b80895aaa8ff18c9a357feef7e7afa8e4ef7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Quickstart: Run Your First Sink - Moralis\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://moralis.mintlify.site/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Quickstart%3A+Run+Your+First+Sink\u0026amp;description=Get+live%2C+decoded+onchain+data+flowing+into+your+own+database+in+about+ten+minutes.+Generate+a+sink+starter+pack%2C+run+it+with+Docker%2C+and+query+your+first+rows.\u0026amp;theme=3021c0945ade0560af7b28a8\u0026amp;signature=31e893a38c321259c398dad2e958b80895aaa8ff18c9a357feef7e7afa8e4ef7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/moralis/QJZhcjaKxGIsqpqo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Moralis\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0f7fff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.moralis.com/data-feeds/migration/quickstart\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/data-feeds/migration/quickstart.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.moralis.com/#organization\",\"name\":\"Moralis\",\"url\":\"https://docs.moralis.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/moralis/GWFD1O4mIZzaStPO/logo/light.png?fit=max\u0026auto=format\u0026n=GWFD1O4mIZzaStPO\u0026q=85\u0026s=66e6da0d81943c4679e0ba921850201d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.moralis.com#website\",\"name\":\"Moralis\",\"url\":\"https://docs.moralis.com\",\"publisher\":{\"@id\":\"https://docs.moralis.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.moralis.com/data-feeds/migration/quickstart#webpage\",\"url\":\"https://docs.moralis.com/data-feeds/migration/quickstart\",\"name\":\"Quickstart: Run Your First Sink\",\"description\":\"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\",\"dateModified\":\"2026-09-28T14:26:54.592Z\",\"isPartOf\":{\"@id\":\"https://docs.moralis.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.moralis.com/data-feeds/migration/quickstart#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.moralis.com/data-feeds/migration/quickstart#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.moralis.com/data-feeds/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Quickstart: Run Your First Sink\",\"item\":\"https://docs.moralis.com/data-feeds/migration/quickstart\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.moralis.com/data-feeds/migration/quickstart#article\",\"headline\":\"Quickstart: Run Your First Sink\",\"name\":\"Quickstart: Run Your First Sink\",\"description\":\"Get live, decoded onchain data flowing into your own database in about ten minutes. Generate a sink starter pack, run it with Docker, and query your first rows.\",\"url\":\"https://docs.moralis.com/data-feeds/migration/quickstart\",\"mainEntityOfPage\":{\"@id\":\"https://docs.moralis.com/data-feeds/migration/quickstart#webpage\"},\"dateModified\":\"2026-09-28T14:26:54.592Z\",\"publisher\":{\"@id\":\"https://docs.moralis.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.moralis.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Moralis\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Moralis\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/data-feeds/migration/quickstart.md","siteName":"Moralis","nav":{"global":null,"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":""}]},{"tab":"Data API","pages":[{"title":"Data API","href":"/data-api/overview"}]},{"tab":"Streams","pages":[{"title":"Streams","href":"/streams/overview"}]},{"tab":"Data Feeds","pages":[{"group":"Getting Started","pages":[{"title":"Data Feeds","href":"/data-feeds/overview"},{"title":"What Are Data Feeds?","href":"/data-feeds/concepts/what-are-data-feeds"},{"title":"Data Feeds Features","sidebarTitle":"Features","href":"/data-feeds/features"},{"title":"How Data Feeds Works","sidebarTitle":"How It Works","description":"Understand the Data Feeds workflow: start from a template or a custom schema, configure your pipeline, and have indexed blockchain data delivered into your own database.","href":"/data-feeds/how-it-works"},{"title":"Quickstart: Run Your First Sink","href":"/data-feeds/migration/quickstart"}]},{"group":"Access Methods","pages":[{"title":"Access Methods: Databases, Streams, and Direct Reads","sidebarTitle":"Overview","description":"One data lake, many ways out. Compare the three ways to consume Data Feeds (database sinks, streaming clients, and direct reads) and pick the right path for your workload.","href":"/data-feeds/access-methods/overview"},{"title":"Database Sinks: ClickHouse, Postgres, and MySQL","sidebarTitle":"Database Sinks: ClickHouse, Postgres \u0026 MySQL","href":"/data-feeds/concepts/destinations"},{"title":"Streaming Data Feeds: Kafka, RabbitMQ, and SQS","sidebarTitle":"Streaming: Kafka, RabbitMQ \u0026 SQS","href":"/data-feeds/access-methods/streaming"},{"title":"Direct Reads: REST/HTTP and Arrow Flight","sidebarTitle":"Direct Reads: REST \u0026 Arrow Flight","href":"/data-feeds/access-methods/direct-reads"}]},{"group":"Data APIs \u0026 Migration Guides","pages":[{"title":"Data Feed Templates","sidebarTitle":"Overview - Data Feed Templates","href":"/data-feeds/templates/overview"},{"title":"Migrating from the Moralis REST API","href":"/data-feeds/migration/overview"},{"title":"Map Endpoints to Templates","href":"/data-feeds/migration/endpoints"},{"group":"Wallet API","pages":[{"title":"Wallet History","href":"/data-feeds/templates/wallet/wallet-history"},{"title":"Token Balances by Wallet","href":"/data-feeds/templates/wallet/token-balances-by-wallet"},{"title":"Native Balances","href":"/data-feeds/templates/wallet/native-balances"},{"title":"NFTs by Wallet","href":"/data-feeds/templates/wallet/nfts-by-wallet"},{"title":"Token Approvals","href":"/data-feeds/templates/wallet/token-approvals"}]},{"group":"Token API","pages":[{"title":"Token Holders","href":"/data-feeds/templates/token/token-holders"},{"title":"Historical Balances","href":"/data-feeds/templates/token/historical-balances"},{"title":"Token Balances by Token","href":"/data-feeds/templates/token/token-balances-by-token"},{"title":"Token Transfers","href":"/data-feeds/templates/token/token-transfers"},{"title":"Token Stats","href":"/data-feeds/templates/token/token-stats"},{"title":"Token Metadata","href":"/data-feeds/templates/token/token-metadata"},{"title":"Token Bonding Status (Solana Launchpads)","href":"/data-feeds/templates/token/token-bonding-status"}]},{"group":"Price API","pages":[{"title":"Token Prices","href":"/data-feeds/templates/token/token-prices"},{"title":"Pair OHLCV","href":"/data-feeds/templates/markets/pair-ohlcv"}]},{"group":"DeFi API","pages":[{"title":"Swaps by Wallet","href":"/data-feeds/templates/markets/swaps-by-wallet"},{"title":"Swaps by Token","href":"/data-feeds/templates/markets/swaps-by-token"},{"title":"Swaps by Pair","href":"/data-feeds/templates/markets/swaps-by-pair"},{"title":"Pair Reserves","href":"/data-feeds/templates/markets/pair-reserves"}]},{"group":"NFT API","pages":[{"title":"NFT Transfers","href":"/data-feeds/templates/nft/nft-transfers"},{"title":"NFT Trades","href":"/data-feeds/templates/nft/nft-trades"},{"title":"NFT Owners by Contract","href":"/data-feeds/templates/nft/nft-owners-by-contract"},{"title":"NFT Collection Metadata","href":"/data-feeds/templates/nft/nft-collection-metadata"}]},{"group":"Blockchain API","pages":[{"title":"Contract Logs","href":"/data-feeds/templates/logs/contract-logs"},{"title":"Logs by Event Signature","sidebarTitle":"Logs by Event Signature","href":"/data-feeds/templates/logs/logs-by-topic0"}]}]},{"group":"Streams","pages":[{"title":"Migrating from Moralis Streams","href":"/data-feeds/migration/streams-overview"}]},{"group":"Gotchas \u0026 Troubleshooting","pages":[{"title":"Gotchas \u0026 Troubleshooting","href":"/data-feeds/migration/troubleshooting"}]},{"group":"Concepts","pages":[{"title":"Data Feeds vs. the REST API","href":"/data-feeds/concepts/data-feeds-vs-the-rest-api"},{"title":"The `block` Array: How Transactions and Logs Are Laid Out","href":"/data-feeds/concepts/the-block-array"},{"title":"History \u0026 Backfill: How Far Back Do You Need to Index?","href":"/data-feeds/concepts/history-and-backfill"},{"title":"Modes: Historical, Realtime, and Hybrid","href":"/data-feeds/concepts/modes"},{"title":"Reorgs: How Chain Reorganizations Surface, and How Templates Correct Them","href":"/data-feeds/concepts/reorgs"}]},{"group":"Use Cases","pages":[{"title":"Accounting \u0026 Tax","href":"/data-feeds/use-cases/accounting"},{"title":"Portfolio Tracking","href":"/data-feeds/use-cases/portfolio-tracking"},{"title":"Token Analytics","href":"/data-feeds/use-cases/token-analytics"},{"title":"Trading \u0026 Charting","href":"/data-feeds/use-cases/trading-charting"},{"title":"NFT Marketplace","href":"/data-feeds/use-cases/nft-marketplace"},{"title":"Compliance \u0026 AML","href":"/data-feeds/use-cases/compliance-aml"},{"title":"Onchain Event Indexing","href":"/data-feeds/use-cases/event-indexing"}]}]},{"tab":"RPC Nodes","pages":[{"title":"RPC Nodes","href":"/rpc-nodes/overview"}]},{"tab":"Auth API","pages":[{"title":"Auth API","href":"/auth-api/overview"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Quickstart: Run Your First Sink - Moralis","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":[],"chunks":[]}