Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.
Before writing code against the Leaf API, you need to make decisions in four areas: account structure, data needs, processing rules, and sync granularity. Getting these right upfront saves significant rework later.
Account structure — how you map API owners and Leaf users to your own accounts and growers. Nearly every Leaf implementation uses one Leaf user per grower. If your use case calls for something different, talk to your Customer Success representative first.Data needs — which Leaf data products you consume. Field boundaries? Operation summaries? Point-level GeoJSON? Satellite imagery? Weather? The answer drives which APIs you call and which configurations you enable.Processing rules — how Leaf cleans, filters, and merges your data. Configurations like cleanupStandardGeojson, cleanupRules, operationsRemoveOutliers, and operationsMergeRange control the output. Defaults work for most cases, but if you need results that match an existing pipeline (like SMS exports), you’ll need to tune these.Sync granularity — which data Leaf actually pulls from providers. Configurations like customDataSync, organizationDataSync, and operationsProcessingRange control the scope. This directly affects billing, since Leaf charges by spatially unique acres.
Create your API owner(s). One per environment is typical (production, test, staging). Use clear naming — leaf-test@company.com, leaf-prod@company.com — so billing and logs are easy to distinguish.
Set API owner-level configurations. These become the defaults for every Leaf user you create. Get them right before connecting growers, because configuration changes are not retroactive.
Create a single Leaf user and connect one provider account. Start with a provider account you know well, with a small number of fields. This lets you validate your configuration choices before scaling.
Set up alerts. At minimum, subscribe to field events, field boundary events, machine file events, and field operation events. Alerts eliminate the need to poll Leaf for updates.
Validate the data. Confirm that fields, machine files, and field operations are coming through as expected. Adjust configurations if needed.
Scale. Connect more Leaf users, either through the API directly or through Magic Links / Leaf Link widgets.
Do not connect large provider accounts during development. Each connection processes fields and files, consuming your testing acre allotment. Use customDataSync to limit which fields Leaf processes, and organizationDataSync to limit which John Deere organizations are included.
Single API owner, many Leaf users — the most common pattern. One API owner per environment, one Leaf user per grower. Simple, clean billing, per-user configuration overrides when needed.Multiple API owners — useful for managed service providers who serve distinct client organizations. Each client gets its own API owner, isolating data, credentials, and billing. Each API owner then holds Leaf users for that client’s growers.Leaf does not provide a separate test environment. Create distinct API owners for test and production instead.
Configurations set at the API owner level apply to all Leaf users under that API owner by default. You can override any configuration at the Leaf user level for individual growers.One important detail: once you set a configuration on a Leaf user, it no longer inherits from the API owner for that setting. If you later change the API owner’s configuration, the Leaf user keeps its own value.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Leaf Documentation","colors":{"primary":"#00886b","light":"#07C983","dark":"#00886b"},"logo":{"light":"https://mintcdn.com/leaf-3ed5893a/to88HRn_L8ezHDrX/logo/light.png?fit=max\u0026auto=format\u0026n=to88HRn_L8ezHDrX\u0026q=85\u0026s=8ce24e422c9bf087336b65351eb51f4c","dark":"https://mintcdn.com/leaf-3ed5893a/to88HRn_L8ezHDrX/logo/dark.png?fit=max\u0026auto=format\u0026n=to88HRn_L8ezHDrX\u0026q=85\u0026s=7c5b24b746c2c02501ac6fea486c3a51","href":"https://withleaf.io/"},"favicon":"https://mintcdn.com/leaf-3ed5893a/to88HRn_L8ezHDrX/favicon.png?fit=max\u0026auto=format\u0026n=to88HRn_L8ezHDrX\u0026q=85\u0026s=a435f8f25c1ed914dc32b03c92d844cd","appearance":{"default":"light"},"background":{"color":{"light":"#ffffff","dark":"#18191a"}},"navbar":{"links":[{"icon":"github","href":"https://status.withleaf.io","label":"API Status"},{"href":"https://dashboard.withleaf.io","label":"Log In"}],"primary":{"type":"button","label":"Request Demo","href":"https://withleaf.io/account/get-a-demo"}},"footer":{"socials":{"instagram":"https://www.instagram.com/withleaf_","linkedin":"https://www.linkedin.com/company/leaf-agriculture","x":"https://twitter.com/LeafAgriculture","youtube":"https://www.youtube.com/@leafagriculture7933"}},"seo":{"metatags":{"robots":"noindex"},"indexing":"navigable"},"fonts":{"heading":{"family":"Satoshi","source":"https://cdn.fontshare.com/wf/P2LQKHE6KA6ZP4AAGN72KDWMHH6ZH3TA/ZC32TK2P7FPS5GFTL46EU6KQJA24ZYDB/7AHDUZ4A7LFLVFUIFSARGIWCRQJHISQP.woff2","format":"woff2"},"body":{"family":"Inter"}},"integrations":{"mixpanel":{"projectToken":"2aa8982706dc53402184ef7b6e555d32"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"About Us","icon":"circle-user","href":"https://withleaf.io/company"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"leaf-3ed5893a","hasAudioNarration":false,"actualSubdomain":"leaf-3ed5893a","customDomains":["docs.withleaf.io"],"gitSource":{"type":"github","owner":"leaf-agriculture","repo":"docs-v2","deployBranch":"master","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea55583593d9bacc3250df","collectionId":"c5ff0339-6713-4bbb-8aca-078af8401d84","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea55583593d9bacc3250df"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aebb176bb99e4d1e9f33f01","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"default","tag":"Documentation","count":58},{"language":"default","tag":"API Reference","count":25},{"language":"default","tag":"Guides","count":21},{"language":"default","tag":"Tutorials","count":16},{"language":"default","tag":"Connecting Providers","count":16},{"language":"default","tag":"Beta","count":10},{"language":"default","tag":"Data Hierarchy","count":9},{"language":"default","tag":"OEM and Provider Integrations","count":8},{"language":"default","tag":"Machine Data","count":6},{"language":"default","tag":"Resources","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"help@withleaf.io","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"styles/globals.css","content":".get,.post,.put,.patch,.delete{display:inline-block;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase;font-family:monospace}.get{background-color:#00866d;color:white}.post{background-color:#edc043;color:white}.patch{background-color:#edc043;color:white}.delete{background-color:#f25925;color:white}.put{background-color:#edc043;color:white}"}],"page":{"pagePath":"guides/planning/integration-planning","slug":"/guides/planning/integration-planning","pageMetadata":{"title":"Planning Your Integration","sidebarTitle":"Plan Your Integration","description":"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.","href":"/guides/planning/integration-planning"},"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: \"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\"\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];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Before writing code against the Leaf API, you need to make decisions in four areas: account structure, data needs, processing rules, and sync granularity. Getting these right upfront saves significant rework later.`}),`\n`,_jsx(Heading,{level:`2`,id:`the-four-planning-decisions`,children:`The four planning decisions`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Account structure`}),` — how you map API owners and Leaf users to your own accounts and growers. Nearly every Leaf implementation uses one Leaf user per grower. If your use case calls for something different, talk to your Customer Success representative first.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Data needs`}),` — which Leaf data products you consume. Field boundaries? Operation summaries? Point-level GeoJSON? Satellite imagery? Weather? The answer drives which APIs you call and which configurations you enable.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Processing rules`}),` — how Leaf cleans, filters, and merges your data. Configurations like `,_jsx(_components.code,{children:`cleanupStandardGeojson`}),`, `,_jsx(_components.code,{children:`cleanupRules`}),`, `,_jsx(_components.code,{children:`operationsRemoveOutliers`}),`, and `,_jsx(_components.code,{children:`operationsMergeRange`}),` control the output. Defaults work for most cases, but if you need results that match an existing pipeline (like SMS exports), you’ll need to tune these.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Sync granularity`}),` — which data Leaf actually pulls from providers. Configurations like `,_jsx(_components.code,{children:`customDataSync`}),`, `,_jsx(_components.code,{children:`organizationDataSync`}),`, and `,_jsx(_components.code,{children:`operationsProcessingRange`}),` control the scope. This directly affects billing, since Leaf charges by spatially unique acres.`]}),`\n`,_jsx(Heading,{level:`2`,id:`recommended-order-of-operations`,children:`Recommended order of operations`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Create your API owner(s).`}),` One per environment is typical (production, test, staging). Use clear naming — `,_jsx(_components.code,{children:`leaf-test@company.com`}),`, `,_jsx(_components.code,{children:`leaf-prod@company.com`}),` — so billing and logs are easy to distinguish.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Set API owner-level configurations.`}),` These become the defaults for every Leaf user you create. Get them right before connecting growers, because configuration changes are not retroactive.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Create a single Leaf user and connect one provider account.`}),` Start with a provider account you know well, with a small number of fields. This lets you validate your configuration choices before scaling.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Set up alerts.`}),` At minimum, subscribe to field events, field boundary events, machine file events, and field operation events. Alerts eliminate the need to poll Leaf for updates.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Validate the data.`}),` Confirm that fields, machine files, and field operations are coming through as expected. Adjust configurations if needed.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Scale.`}),` Connect more Leaf users, either through the API directly or through Magic Links / Leaf Link widgets.`]}),`\n`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Do not connect large provider accounts during development. Each connection processes fields and files, consuming your testing acre allotment. Use `,_jsx(_components.code,{children:`customDataSync`}),` to limit which fields Leaf processes, and `,_jsx(_components.code,{children:`organizationDataSync`}),` to limit which John Deere organizations are included.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`account-structure-patterns`,children:`Account structure patterns`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Single API owner, many Leaf users`}),` — the most common pattern. One API owner per environment, one Leaf user per grower. Simple, clean billing, per-user configuration overrides when needed.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multiple API owners`}),` — useful for managed service providers who serve distinct client organizations. Each client gets its own API owner, isolating data, credentials, and billing. Each API owner then holds Leaf users for that client’s growers.`]}),`\n`,_jsx(_components.p,{children:`Leaf does not provide a separate test environment. Create distinct API owners for test and production instead.`}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-inheritance`,children:`Configuration inheritance`}),`\n`,_jsx(_components.p,{children:`Configurations set at the API owner level apply to all Leaf users under that API owner by default. You can override any configuration at the Leaf user level for individual growers.`}),`\n`,_jsx(_components.p,{children:`One important detail: once you set a configuration on a Leaf user, it no longer inherits from the API owner for that setting. If you later change the API owner’s configuration, the Leaf user keeps its own value.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-to-read-next`,children:`What to read next`}),`\n`,_jsx(_components.p,{children:`The use-case guides cover specific configuration recommendations:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/guides/by-use-case/crop-insurance`,children:`Crop Insurance`}),` — acreage reporting, production data, claims validation`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/guides/by-use-case/fmis`,children:`FMIS`}),` — field records, operation summaries, satellite and weather data`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/guides/by-use-case/managed-service-provider`,children:`Managed Service Provider`}),` — multi-client data isolation and billing`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`For controlling what data Leaf syncs and processes, see `,_jsx(_components.a,{href:`/guides/planning/data-sync-customization`,children:`Data Sync Customization`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`For understanding how Leaf’s processing rules affect output, see the `,_jsx(_components.a,{href:`/configuration/overview`,children:`Configuration reference`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{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":"Planning Your Integration","sidebarTitle":"Plan Your Integration","description":"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.","href":"/guides/planning/integration-planning"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"The four planning decisions","slug":"the-four-planning-decisions","depth":2,"children":[]},{"title":"Recommended order of operations","slug":"recommended-order-of-operations","depth":2,"children":[]},{"title":"Account structure patterns","slug":"account-structure-patterns","depth":2,"children":[]},{"title":"Configuration inheritance","slug":"configuration-inheritance","depth":2,"children":[]},{"title":"What to read next","slug":"what-to-read-next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"leaf-3ed5893a","siteName":"Leaf Documentation","title":"Planning Your Integration - Leaf Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-03-24T13:26:21.374Z","gitLastModified":"2026-03-24T13:25:42.000Z","originalFileLocation":"guides/planning/integration-planning.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=\"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Leaf Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"noindex\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Planning Your Integration - Leaf Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Leaf Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.withleaf.io/guides/planning/integration-planning\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://leaf-3ed5893a.mintlify.app/_mintlify/api/og/v2?division=Tutorials\u0026amp;title=Planning+Your+Integration\u0026amp;description=Plan+your+Leaf+API+integration%3A+account+structure%2C+data+needs%2C+processing+rules%2C+and+sync+configuration+decisions+to+make+before+writing+code.\u0026amp;theme=df28ea0c62b563cc8e5aedca\u0026amp;signature=5c0bef2856d92c1a5ee10969962a14c1cda199e90332d6a886ae47889700c8d2\">\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=\"Planning Your Integration - Leaf Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://leaf-3ed5893a.mintlify.app/_mintlify/api/og/v2?division=Tutorials\u0026amp;title=Planning+Your+Integration\u0026amp;description=Plan+your+Leaf+API+integration%3A+account+structure%2C+data+needs%2C+processing+rules%2C+and+sync+configuration+decisions+to+make+before+writing+code.\u0026amp;theme=df28ea0c62b563cc8e5aedca\u0026amp;signature=5c0bef2856d92c1a5ee10969962a14c1cda199e90332d6a886ae47889700c8d2\">\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/leaf-3ed5893a/IA--hOPjRaQAEcyW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Leaf Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00886b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.withleaf.io/guides/planning/integration-planning\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/planning/integration-planning.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.withleaf.io/#organization\",\"name\":\"Leaf Documentation\",\"url\":\"https://docs.withleaf.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/leaf-3ed5893a/to88HRn_L8ezHDrX/logo/light.png?fit=max\u0026auto=format\u0026n=to88HRn_L8ezHDrX\u0026q=85\u0026s=8ce24e422c9bf087336b65351eb51f4c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.withleaf.io#website\",\"name\":\"Leaf Documentation\",\"url\":\"https://docs.withleaf.io\",\"publisher\":{\"@id\":\"https://docs.withleaf.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.withleaf.io/guides/planning/integration-planning#webpage\",\"url\":\"https://docs.withleaf.io/guides/planning/integration-planning\",\"name\":\"Planning Your Integration\",\"description\":\"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\",\"dateModified\":\"2026-03-24T13:25:42.000Z\",\"isPartOf\":{\"@id\":\"https://docs.withleaf.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.withleaf.io/guides/planning/integration-planning#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.withleaf.io/guides/planning/integration-planning#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Tutorials\",\"item\":\"https://docs.withleaf.io/guides/tutorials/connect-climate-fieldview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Planning Your Integration\",\"item\":\"https://docs.withleaf.io/guides/planning/integration-planning\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.withleaf.io/guides/planning/integration-planning#article\",\"headline\":\"Planning Your Integration\",\"name\":\"Planning Your Integration\",\"description\":\"Plan your Leaf API integration: account structure, data needs, processing rules, and sync configuration decisions to make before writing code.\",\"url\":\"https://docs.withleaf.io/guides/planning/integration-planning\",\"mainEntityOfPage\":{\"@id\":\"https://docs.withleaf.io/guides/planning/integration-planning#webpage\"},\"dateModified\":\"2026-03-24T13:25:42.000Z\",\"publisher\":{\"@id\":\"https://docs.withleaf.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.withleaf.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Leaf Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Leaf Documentation","nav":{"global":{"anchors":[{"anchor":"About Us","icon":"circle-user","href":"https://withleaf.io/company"}]},"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Documentation","icon":"book-open","pages":[{"title":"Documentation","href":"/getting-started/welcome"}]},{"tab":"Guides","icon":"lightbulb","groups":[{"group":"By Use Case","pages":[{"title":"Managed Service Provider","sidebarTitle":"Managed Service Provider","href":"/guides/by-use-case/managed-service-provider"},{"title":"Farm Management (FMIS)","sidebarTitle":"FMIS","href":"/guides/by-use-case/fmis"},{"title":"Crop Insurance","sidebarTitle":"Crop Insurance","href":"/guides/by-use-case/crop-insurance"}]},{"group":"AI and Agents","pages":[{"title":"Connect Leaf's MCP Server in Cursor","sidebarTitle":"Use Cursor with Leaf","href":"/guides/tutorials/cursor-mcp"},{"title":"Connect Leaf's MCP Server in Claude Code","sidebarTitle":"Use Claude Code with Leaf","href":"/guides/tutorials/claude-code-mcp"}]},{"group":"Tutorials","pages":[{"group":"OEM and Provider Integrations","pages":[{"title":"Connect to Climate FieldView API","sidebarTitle":"Connect Climate FieldView","href":"/guides/tutorials/connect-climate-fieldview"},{"title":"Connect to Stara Telemetry API","sidebarTitle":"Connect Stara","href":"/guides/tutorials/connect-stara"},{"title":"Connect to John Deere Operations Center API","sidebarTitle":"Connect John Deere","href":"/guides/tutorials/connect-john-deere"},{"title":"Connect to CNHi API (AFS Connect)","sidebarTitle":"Connect CNHI (AFS Connect - Legacy)","href":"/guides/tutorials/connect-cnhi"},{"title":"Connect to CNHI FieldOps API","sidebarTitle":"Connect CNHI FieldOps","href":"/guides/tutorials/connect-cnhi-fieldops"},{"title":"Migrate from CNHI AFS Connect to CNHI FieldOps","sidebarTitle":"Migrate CNHI to FieldOps","href":"/guides/tutorials/migrate-cnhi-to-fieldops"},{"title":"Connect to AgLeader AgFiniti API","sidebarTitle":"Connect AgLeader","href":"/guides/tutorials/connect-agleader"},{"title":"Connect to Trimble API","sidebarTitle":"Connect Trimble","description":"Connect Trimble Agriculture data to Leaf. Register a developer application, complete the OAuth flow, and attach credentials to a Leaf user.","href":"/guides/tutorials/connect-trimble"}]},{"title":"Planning Your Integration","sidebarTitle":"Plan Your Integration","href":"/guides/planning/integration-planning"},{"title":"Field Operations Quickstart","sidebarTitle":"Get started with Field Operations","description":"Create a Leaf user, connect a data provider, and retrieve standardized field operation data from planting, harvest, application, and tillage activities.","href":"/guides/tutorials/field-operations-quickstart"},{"title":"Preparing Files for Upload","sidebarTitle":"Prepare files for upload","href":"/guides/planning/file-preparation"},{"title":"Upload and Process Machine Files","sidebarTitle":"Upload files from monitors","href":"/guides/tutorials/manual-file-upload"},{"title":"Get Satellite Imagery for Your Fields","sidebarTitle":"Retrieve Satellite Imagery","href":"/guides/tutorials/satellite-imagery"},{"title":"Integrate Leaf Data with ArcGIS","sidebarTitle":"Integrate with ArcGIS","href":"/guides/tutorials/arcgis-integration"},{"title":"Customizing Data Sync","sidebarTitle":"Customizing Data Sync","href":"/guides/planning/data-sync-customization"},{"title":"Why Yield Values Differ Between Platforms","sidebarTitle":"Understanding Data Differences","href":"/guides/planning/yield-differences"}]}]},{"tab":"API Reference","icon":"code-simple","pages":[{"title":"API Reference","href":"/api-reference/authentication"}]},{"tab":"Resources","icon":"books","pages":[{"title":"Resources","href":"/resources/glossary"}]}]},"basePath":"","title":"Planning Your Integration - Leaf Documentation","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":[],"chunks":[]}