Ingestion is the process by which external data is added into Open Data Fabric’s . Kamu supports a wide variety of sources including resources on the web and blockchains. Below we will describe why this process is necessary and how it works.
When interacting with data on the web we usually cannot make any assumptions about guarantees that its publisher provides:
Just by looking at the data we cannot tell if it is mutable or preserves history of changes
We often can’t tell where it originates from and who can be held accountable for its validity
We can’t be sure that it’s sufficiently replicated, so that if the server that hosts it today disappears tomorrow - all our data science projects will not be left non-reproducible.
Data on the web is in a state of a constant churn where data is often updated in destructive ways and even important medical datasets disappear over night. Any guarantees do exist are hidden behind many layers of service agreements, yet still provide us no strong assurance that they won’t be violated (on purpose or by accident). This is why step #1 of every data science project is to copy and version the data.Open Data Fabric was created to avoid excessive copying and harmful versioning of data, and instead embed these guarantees into the data format itself, making them impossible to violate.Ingestion step is about getting the external data from this “churning world” into strict ledgers of , where properties like clear ownership, reproducibility, accountability, and complete historical account can be guaranteed and made explicit.
Push sources - for cases when external actor actively sends data into a dataset. This is suitable e.g. for IoT devices that periodically write data, business processes that can report events directly into ODF dataset, or for ingesting data from streaming data APIs and event queues like Apache Kafka.
Polling source - for cases when external data is stored somewhere in bulk and we want to synchronize its state with ODF dataset periodically. This is suitable e.g. for datasets that exist as files on the web or for reading data from bulk APIs.
Ingestion process has several well-defined phases:These phases are directly reflected in the event:
fetch - specifies how to download the data from some external source (e.g. HTTP/FTP) and how to cache it efficiently
prepare (optional) - specifies how to prepare raw binary data for reading (e.g. extracting an archive or converting between formats)
read - specifies how to read the data into structured form (e.g. as CSV or Parquet)
preprocess (optional) - allows to shape the structured data with queries (e.g. to parse and convert types into best suited form wit SQL)
merge - specifies how to combine the read data with the history of previously seen data (this step is extremely important as it performs “ledgerization” / “historization” of the evolving state of data - see Merge Strategies section for explanation).
If you are confused about what SetPollingSource event is - please refer to First Steps section that explains dataset creation.
The phases of push ingest are defined by the event and are very similar, except for omitting fetch and prepare steps.For more information refer to Polling Sources and Push Sources sections.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Kamu Docs","colors":{"primary":"#ec6e2a","light":"#ec6e2a","dark":"#ec6e2a"},"logo":{"light":"https://mintcdn.com/kamu/j1tx5fgzyFHd1DYS/images/kamu-logo-light.svg?fit=max\u0026auto=format\u0026n=j1tx5fgzyFHd1DYS\u0026q=85\u0026s=a09261b617da6e1515dea3d28495f633","dark":"https://mintcdn.com/kamu/j1tx5fgzyFHd1DYS/images/kamu-logo-dark.svg?fit=max\u0026auto=format\u0026n=j1tx5fgzyFHd1DYS\u0026q=85\u0026s=8c6d0d7ffa23ef050859453f64354192"},"favicon":"https://mintcdn.com/kamu/j1tx5fgzyFHd1DYS/images/favicon.svg?fit=max\u0026auto=format\u0026n=j1tx5fgzyFHd1DYS\u0026q=85\u0026s=a7b01f8f352427f5a4afe3aef1f8a9d3","background":{"color":{"dark":"#050C1E"}},"navbar":{"links":[{"href":"https://discord.gg/nU6TXRQNXC","label":"Get Help"}],"primary":{"type":"button","label":"Install","href":"/cli/install/"}},"footer":{"socials":{"github":"https://github.com/kamu-data","discord":"https://discord.gg/nU6TXRQNXC","youtube":"https://www.youtube.com/@kamudata","linkedin":"https://www.linkedin.com/company/kamu-data","medium":"https://medium.com/kamu-data","bluesky":"https://bsky.app/profile/kamu.dev","x":"https://x.com/kamu_data"},"links":[{"header":"Company","items":[{"label":"Blog","href":"https://kamu.dev/blog"},{"label":"Careers","href":"https://kamu.dev/jobs"}]}]},"seo":{"metatags":{"canonical":"https://docs.kamu.dev"}},"styling":{"eyebrows":"breadcrumbs","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"kamu","hasAudioNarration":false,"actualSubdomain":"kamu","customDomains":["docs.kamu.dev"],"gitSource":{"type":"github","owner":"kamu-data","repo":"kamu-docs","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad05633011b02bffcb4463d","collectionId":"0127742b-6059-4668-b046-f443923b1bdd","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad05633011b02bffcb4463d"},"entitlements":{},"buildId":"6ad05633011b02bffcb4463d","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Guides","count":75},{"language":"default","tag":"Reference","count":42},{"language":"default","tag":"Open Data Fabric","count":39},{"language":"default","tag":"Kamu CLI","count":31},{"language":"default","tag":"RFCs","count":22},{"language":"default","tag":"Kamu Node","count":17},{"language":"default","tag":"Specification","count":15},{"language":"default","tag":"APIs","count":13},{"language":"default","tag":"Get Started","count":12},{"language":"default","tag":"Datasets","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"a.card:is(.dark *),div.card:is(.dark *){background:#09162d}a.card:is(.light *),div.card:is(.light *){background:#fafafa}a:has(svg[style*=\"wrench.svg\"]){pointer-events:none;opacity:.7}button:has(svg[style*=\"wrench.svg\"]){opacity:.7}a:has(svg[style*=\"wrench.svg\"])>div:first-child,button:has(svg[style*=\"wrench.svg\"])>svg[style*=\"wrench.svg\"]{order:2;margin-left:auto}.prose a.glossary-term:is(.dark *, .light *){color:inherit;font-weight:inherit;border-bottom:2px dotted #325495}.prose a.schema-object:is(.dark *, .light *){color:inherit;font-weight:inherit;border-bottom:2px dotted #2c802c}h4.project-title:is(.dark *, .light *){display:block;text-align:center}div.badges a,h4.project-title a{border-bottom:0}a.project-quicklink:is(.dark *, .light *){font-size:15px;font-weight:300;color:#ec6e2a;border-bottom:0}.prose div img:is(\n [src*=\"projects/odf.svg\"],\n [src*=\"projects/kamu-cli.svg\"],\n [src*=\"projects/kamu-node.svg\"],\n [src*=\"projects/kamu-platform.svg\"]\n ){display:block;margin:30px auto 0;height:100px;width:auto}div.badges{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;gap:10px;margin:20px}div.badges img{display:inline;margin:0}"}],"page":{"pagePath":"cli/ingest/index","slug":"/cli/ingest/index","pageMetadata":{"title":"Ingesting Data","description":null,"href":"/cli/ingest/index"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const Diagram=({src,alt})=>{return _jsxs(`div`,{style:{display:`flex`,\"flex-direction\":`column`,\"align-items\":`center`},children:[_jsx(`img`,{src,alt,style:{background:`#dddddd`,\"margin-bottom\":0}}),_jsx(`span`,{children:alt})]})};const YouTubeList=({id})=>{const src=`https://www.youtube.com/embed/videoseries?list=${id}`;return _jsx(`iframe`,{className:`mint-w-full mint-aspect-video mint-rounded-xl`,src,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:true})};const YouTube=({id,width})=>{const src=`https://www.youtube.com/embed/${id}`;return _jsx(`iframe`,{className:`mint-w-full mint-aspect-video mint-rounded-xl`,src,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:true,width})};const Schema=({t,id})=>{const _components={a:`a`,..._provideComponents()};const anchor=id?id:t.toLowerCase().replace(/\\s+/g,`-`);const link=`/odf/schemas#${anchor}`;return _jsx(_components.a,{class:`schema-object`,href:link,children:t})};const Term=({t,id})=>{const _components={a:`a`,..._provideComponents()};const anchor=id?id:t.toLowerCase().replace(/\\s+/g,`-`);const link=`/general/glossary#${anchor}`;return _jsx(_components.a,{class:`glossary-term`,href:link,children:t})};function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Tip,_MdxComponentBoundary}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Ingestion is the process by which external data is added into Open Data Fabric’s `,_jsx(_MdxComponentBoundary,{name:`Term`,children:_jsx(Term,{t:`root datasets`,id:`root-dataset`})}),`. Kamu supports a wide variety of sources including resources on the web and `,_jsx(_components.a,{href:`/cli/ingest/blockchain-source`,children:`blockchains`}),`. Below we will describe why this process is necessary and how it works.`]}),`\n`,_jsx(Heading,{level:`2`,id:`motivation`,children:`Motivation`}),`\n`,_jsx(_components.p,{children:`When interacting with data on the web we usually cannot make any assumptions about guarantees that its publisher provides:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Just by looking at the data we cannot tell if it is `,_jsx(_components.strong,{children:`mutable`}),` or preserves `,_jsx(_components.strong,{children:`history of changes`})]}),`\n`,_jsxs(_components.li,{children:[`We often can’t tell where it `,_jsx(_components.strong,{children:`originates`}),` from and who can be held `,_jsx(_components.strong,{children:`accountable`}),` for its `,_jsx(_components.strong,{children:`validity`})]}),`\n`,_jsxs(_components.li,{children:[`We can’t be sure that it’s sufficiently `,_jsx(_components.strong,{children:`replicated`}),`, so that if the server that hosts it today disappears tomorrow - all our data science projects will not be left `,_jsx(_components.strong,{children:`non-reproducible`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Data on the web is in a state of a `,_jsx(_components.em,{children:`constant churn`}),` where data is often updated in destructive ways and even important medical datasets disappear over night. Any guarantees do exist are hidden behind many layers of service agreements, yet still provide us no strong assurance that they won’t be violated (on purpose or by accident). This is why step #1 of every data science project is to `,_jsx(_components.strong,{children:`copy and version`}),` the data.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/odf/spec/overview`,children:`Open Data Fabric`}),` was created to `,_jsx(_components.strong,{children:`avoid excessive copying and harmful versioning`}),` of data, and instead embed these guarantees into the data format itself, making them `,_jsx(_components.strong,{children:`impossible to violate`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Ingestion step is about getting the external data from this `,_jsx(_components.em,{children:`“churning world”`}),` into strict ledgers of `,_jsx(_MdxComponentBoundary,{name:`Term`,children:_jsx(Term,{t:`root datasets`,id:`root-dataset`})}),`, where properties like clear ownership, reproducibility, accountability, and complete historical account can be guaranteed and made explicit.`]}),`\n`,_jsx(Heading,{level:`2`,id:`sources`,children:`Sources`}),`\n`,_jsx(_components.p,{children:`There are two types of ingestion sources:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Push sources`}),` - for cases when external actor actively sends data into a dataset. This is suitable e.g. for IoT devices that periodically write data, business processes that can report events directly into ODF dataset, or for ingesting data from streaming data APIs and event queues like `,_jsx(_components.a,{href:`https://kafka.apache.org/`,children:`Apache Kafka`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Polling source`}),` - for cases when external data is stored somewhere in bulk and we want to synchronize its state with ODF dataset periodically. This is suitable e.g. for datasets that exist as files on the web or for reading data from bulk APIs.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`phases`,children:`Phases`}),`\n`,_jsx(_components.p,{children:`Ingestion process has several well-defined phases:`}),`\n`,_jsx(`div`,{align:`center`,children:_jsx(_MdxComponentBoundary,{name:`Diagram`,children:_jsx(Diagram,{src:`/images/cli/ingest/ingest.png`,alt:`Ingest flow`})})}),`\n`,_jsxs(_components.p,{children:[`These phases are directly reflected in the `,_jsx(_MdxComponentBoundary,{name:`Schema`,children:_jsx(Schema,{t:`SetPollingSource`})}),` event:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`fetch`}),` - specifies how to download the data from some external source (e.g. HTTP/FTP) and how to cache it efficiently`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`prepare`}),` (optional) - specifies how to prepare raw binary data for reading (e.g. extracting an archive or converting between formats)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`read`}),` - specifies how to read the data into structured form (e.g. as CSV or Parquet)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`preprocess`}),` (optional) - allows to shape the structured data with queries (e.g. to parse and convert types into best suited form wit SQL)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`merge`}),` - specifies how to `,_jsx(_components.strong,{children:`combine the read data with the history of previously seen data`}),` (this step is extremely important as it performs “ledgerization” / “historization” of the evolving state of data - see `,_jsx(_components.a,{href:`/cli/ingest/merge-strategies`,children:`Merge Strategies`}),` section for explanation).`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`If you are confused about what `,_jsx(_components.code,{children:`SetPollingSource`}),` event is - please refer to `,_jsx(_components.a,{href:`/cli/quick-start`,children:`First Steps`}),` section that explains dataset creation.`]})}),`\n`,_jsxs(_components.p,{children:[`The phases of push ingest are defined by the `,_jsx(_MdxComponentBoundary,{name:`Schema`,children:_jsx(Schema,{t:`AddPushSource`})}),` event and are very similar, except for omitting `,_jsx(_components.code,{children:`fetch`}),` and `,_jsx(_components.code,{children:`prepare`}),` steps.`]}),`\n`,_jsxs(_components.p,{children:[`For more information refer to `,_jsx(_components.a,{href:`/cli/ingest/polling-source`,children:`Polling Sources`}),` and `,_jsx(_components.a,{href:`/cli/ingest/push-source`,children:`Push Sources`}),` sections.`]}),`\n`,_jsx(Heading,{level:`2`,id:`further-reading`,children:`Further Reading`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`For more information about defining data sources refer to `,_jsx(_components.a,{href:`/cli/ingest/polling-source`,children:`Polling Sources`}),` and `,_jsx(_components.a,{href:`/cli/ingest/push-source`,children:`Push Sources`}),` sections.`]}),`\n`,_jsxs(_components.li,{children:[`For examples of dealing with various types of data refer to `,_jsx(_components.a,{href:`/cli/ingest/input-formats`,children:`Input Formats`}),` section.`]}),`\n`,_jsxs(_components.li,{children:[`For detailed explanation of “ledgerization” process see `,_jsx(_components.a,{href:`/cli/ingest/merge-strategies`,children:`Merge Strategies`}),` section.`]}),`\n`,_jsxs(_components.li,{children:[`For more inspiration on creating `,_jsx(_MdxComponentBoundary,{name:`Term`,children:_jsx(Term,{t:`root datasets`,id:`root-dataset`})}),` see `,_jsx(_components.a,{href:`/examples`,children:`Examples`}),` and `,_jsx(_components.a,{href:`https://github.com/kamu-data/kamu-contrib/`,children:_jsx(_components.code,{children:`kamu-contrib`})}),` repo.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{Diagram,YouTubeList,YouTube,Schema,Term,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":"Ingesting Data","description":null,"href":"/cli/ingest/index"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[143,1423,")=>null;const YouTubeList=()=>null;const YouTube=()=>null;const Schema=()=>null;const Term=()=>null;"]]},"mdxExtracts":{"tableOfContents":[{"title":"Motivation","slug":"motivation","depth":2,"children":[]},{"title":"Sources","slug":"sources","depth":2,"children":[]},{"title":"Phases","slug":"phases","depth":2,"children":[]},{"title":"Further Reading","slug":"further-reading","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"dynamicCss":".mint-aspect-video {\n aspect-ratio: 16 / 9\n}\n.mint-w-full {\n width: 100%\n}\n.mint-rounded-xl {\n border-radius: 0.75rem\n}","subdomain":"kamu","siteName":"Kamu Docs","title":"Ingesting Data - Kamu Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T04:13:51.722Z","gitLastModified":"2026-10-15T04:13:20.000Z","originalFileLocation":"cli/ingest/index.md"},"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=\"system\"}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=\"application-name\" content=\"Kamu Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_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/kamu/FxhmdHpAfy0cwcpV/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Ingesting Data - Kamu Docs\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Kamu Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.kamu.dev/cli/ingest\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://kamu.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Ingesting+Data\u0026amp;theme=4425de33767c8dc7c1d6072e\u0026amp;signature=5ea08fe44c2d8db0119bd17e54d12e551999accbbea0f7119fbccd037f046c9f\">\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=\"Ingesting Data - Kamu Docs\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://kamu.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Ingesting+Data\u0026amp;theme=4425de33767c8dc7c1d6072e\u0026amp;signature=5ea08fe44c2d8db0119bd17e54d12e551999accbbea0f7119fbccd037f046c9f\">\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/kamu/FxhmdHpAfy0cwcpV/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Kamu Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#ec6e2a\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.kamu.dev/cli/ingest\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/cli/ingest/index.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.kamu.dev/#organization\",\"name\":\"Kamu Docs\",\"url\":\"https://docs.kamu.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/kamu/j1tx5fgzyFHd1DYS/images/kamu-logo-light.svg?fit=max\u0026auto=format\u0026n=j1tx5fgzyFHd1DYS\u0026q=85\u0026s=a09261b617da6e1515dea3d28495f633\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.kamu.dev#website\",\"name\":\"Kamu Docs\",\"url\":\"https://docs.kamu.dev\",\"publisher\":{\"@id\":\"https://docs.kamu.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.kamu.dev/cli/ingest#webpage\",\"url\":\"https://docs.kamu.dev/cli/ingest\",\"name\":\"Ingesting Data\",\"dateModified\":\"2026-10-15T04:13:20.000Z\",\"isPartOf\":{\"@id\":\"https://docs.kamu.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.kamu.dev/cli/ingest#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.kamu.dev/cli/ingest#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Kamu CLI\",\"item\":\"https://docs.kamu.dev/cli/about\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ingesting Data\",\"item\":\"https://docs.kamu.dev/cli/ingest/index\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ingesting Data\",\"item\":\"https://docs.kamu.dev/cli/ingest\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.kamu.dev/cli/ingest#article\",\"headline\":\"Ingesting Data\",\"name\":\"Ingesting Data\",\"url\":\"https://docs.kamu.dev/cli/ingest\",\"mainEntityOfPage\":{\"@id\":\"https://docs.kamu.dev/cli/ingest#webpage\"},\"dateModified\":\"2026-10-15T04:13:20.000Z\",\"publisher\":{\"@id\":\"https://docs.kamu.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.kamu.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Kamu Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Kamu Docs","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Guides","icon":"person-chalkboard","groups":[{"group":"Get Started","pages":[{"title":"Welcome to Kamu!","sidebarTitle":"Welcome","icon":"hand-spock","mode":"wide","href":"/start/welcome"},{"title":"Frequently asked questions","sidebarTitle":"FAQ","icon":"circle-question","href":"/start/faq"},{"title":"First Steps","icon":"list-ol","href":"/start/first-steps"},{"title":"Learning Materials","icon":"person-chalkboard","mode":"wide","href":"/start/learning-materials"},{"title":"Online Tutorial","icon":"play","href":"/start/tutorial"},{"group":"Examples","icon":"book-open","root":{"title":"Examples","href":"/examples/index"},"pages":[{"title":"COVID-19 Daily Cases","href":"/examples/covid19"},{"title":"Currency Conversion","href":"/examples/currency-conversion"},{"title":null,"href":"/examples/housing-prices"},{"title":null,"href":"/examples/leaderboard"},{"title":"Overdue Order Shipments","href":"/examples/overdue-shipments"},{"title":null,"href":"/examples/stock-trading"},{"title":null,"href":"/examples/web3-data"}]}]},{"group":"Kamu CLI","pages":[{"title":"About","href":"/cli/about"},{"title":"Install","href":"/cli/install"},{"title":"Quick Start","description":"A quick rundown of the key features to get a feel for the tool","href":"/cli/quick-start"},{"group":"Ingesting Data","root":{"title":"Ingesting Data","href":"/cli/ingest/index"},"pages":[{"title":"Input Formats","description":"Examples of handling tricky formats during ingestion","href":"/cli/ingest/input-formats"},{"title":"Polling Sources","description":null,"href":"/cli/ingest/polling-source"},{"title":"Push Sources","description":null,"href":"/cli/ingest/push-source"},{"title":"Merge Strategies","description":"Describes the process of historization used depending on the nature of source data","href":"/cli/ingest/merge-strategies"},{"title":"Blockchain Sources","description":null,"href":"/cli/ingest/blockchain-source"}]},{"group":"Transforming Data","root":{"title":"Transforming Data","href":"/cli/transform/index"},"pages":[{"title":"Projections","icon":"wrench","href":"/cli/transform/projections"},{"title":"Retractions \u0026 Corrections","href":"/cli/transform/retractions-corrections"},{"title":"Streaming Aggregations","icon":"wrench","href":"/cli/transform/aggregations"},{"title":"Stream-to-Stream Joins","icon":"wrench","href":"/cli/transform/joins-s2s"},{"title":"Temporal Table Joins","icon":"wrench","href":"/cli/transform/joins-tt"},{"title":"Watermarks","icon":"wrench","href":"/cli/transform/watermarks"},{"title":"Geospatial Data","icon":"wrench","href":"/cli/transform/gis-data"}]},{"title":"Exploring Data","href":"/cli/explore"},{"group":"Sharing \u0026 Collaboration","root":{"title":"Sharing \u0026 Collaboration","href":"/cli/collab/index"},"pages":[{"title":"Repositories","href":"/cli/collab/repositories"},{"title":"Privacy and Permissions","icon":"wrench","href":"/cli/collab/privacy-and-permissions"},{"title":"Sharing datasets with IPFS","href":"/cli/collab/ipfs"},{"title":"Validity of Data","href":"/cli/collab/validity"},{"title":"Provenance","icon":"wrench","href":"/cli/collab/provenance"}]},{"group":"Dataset Evolution","icon":"wrench","pages":[{"title":"Schema Evolution","icon":"wrench","href":"/cli/evolve/schema"},{"title":"Root Dataset Evolution","icon":"wrench","href":"/cli/evolve/root"},{"title":"Derivative Dataset Evolution","icon":"wrench","href":"/cli/evolve/deriv"}]},{"group":"Handling Bad Data","icon":"wrench","pages":[{"title":"Retractions \u0026 Corrections","icon":"wrench","href":"/cli/bad-data/retractions-corrections"},{"title":"Bad Data on Ingestion","icon":"wrench","href":"/cli/bad-data/ingest-errors"},{"title":"Bad Data in Upstream Datasets","icon":"wrench","href":"/cli/bad-data/upstream"},{"title":"PII and Sensitive Data","icon":"wrench","href":"/cli/bad-data/pii"}]},{"title":"Troubleshooting","href":"/cli/troubleshooting"}]},{"group":"Kamu Node","pages":[{"title":"About","href":"/node/about"},{"title":"Quick Start","href":"/node/quick-start"},{"title":"Architecture","href":"/node/architecture"},{"group":"Deployment","pages":[{"title":"Deployment Manual","href":"/node/deploy/manual"},{"title":"Kubernetes Setup","icon":"wrench","href":"/node/deploy/k8s"},{"title":"Artifacts","href":"/node/deploy/artifacts"},{"title":"Auth","icon":"wrench","href":"/node/deploy/auth"},{"title":"Storage","href":"/node/deploy/storage"},{"title":"Capacity Planning","icon":"wrench","href":"/node/deploy/capacity"},{"title":"Security","icon":"wrench","href":"/node/deploy/security"},{"title":"Customization","icon":"wrench","href":"/node/deploy/customization"}]},{"group":"Operations","icon":"wrench","pages":[{"title":"Monitoring","icon":"wrench","href":"/node/operator/monitoring"},{"title":"Upgrades","icon":"wrench","href":"/node/operator/upgrades"},{"title":"Performance Tips","icon":"wrench","href":"/node/operator/performance"}]},{"title":"Verifiable Queries","href":"/node/commitments"},{"title":"Troubleshooting","icon":"wrench","href":"/node/troubleshoot"}]},{"group":"Kamu Web Platform","pages":[{"title":"About","href":"/platform/about"},{"title":"Accounts \u0026 Organizations","icon":"wrench","href":"/platform/accounts"},{"group":"Datasets","icon":"wrench","pages":[{"title":"Attachments","icon":"wrench","href":"/platform/datasets/attachments"},{"title":"Licenses","icon":"wrench","href":"/platform/datasets/licenses"}]},{"group":"Data Exploration","icon":"wrench","pages":[{"title":"Querying","icon":"wrench","href":"/platform/data/querying"},{"title":"Notebooks","icon":"wrench","href":"/platform/data/notebooks"}]},{"title":"Privacy","icon":"wrench","href":"/platform/privacy"},{"group":"Flow System","icon":"wrench","pages":[{"title":"Overview","icon":"wrench","href":"/platform/flows/overview"}]},{"group":"Administration","icon":"wrench","pages":[{"title":"Monitoring","icon":"wrench","href":"/platform/admin/monitoring"},{"title":"Tasks \u0026 Executors","icon":"wrench","href":"/platform/admin/tasks-executors"}]}]},{"group":"General","pages":[{"title":"Project Status","icon":"temperature-full","href":"/general/project-status"},{"title":"Supported Data Engines","icon":"database","href":"/general/supported-engines"},{"title":"Community","icon":"user-group","href":"/general/community"},{"title":"Contributing","icon":"heart","href":"/general/contrib"},{"title":"Licensing Terms","icon":"scroll","href":"/general/licensing"},{"title":"Terms of Service","icon":"scale-balanced","href":"/general/terms"},{"title":"Glossary","icon":"arrow-down-a-z","href":"/general/glossary"},{"icon":"pen","title":null,"href":"/general/typography"}]}]},{"tab":"Reference","icon":"book-open-cover","pages":[{"title":"Reference","href":"/odf/about"}]},{"tab":"APIs","icon":"code","pages":[{"title":"APIs","href":"/api/overview"}]},{"tab":"Integrations","icon":"network-wired","pages":[{"title":"Integrations","href":"/integrations/overview"}]}]},"basePath":"","title":"Ingesting Data - Kamu Docs","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}