Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine
Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor’s licence terms.
Keep the tools you already run. Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with imagery servers such as ArcGIS Image Server, for the steps that need GPUs, high memory or controlled access.
Every pattern on this page keeps each product inside its own licence terms.
Each product's own installer
FME Flow with Safe Software’s Helm chart, ArcGIS Enterprise on Kubernetes with Esri’s deployment tools. NIKA GeoEngine never repackages, redistributes or wraps another vendor’s software.
Your licence, your seat count
Each product runs under the licence you hold for it, and the vendor’s own engine and core limits keep applying.
Documented interfaces only
Public REST APIs, webhooks and shared storage formats such as Cloud-Optimised GeoTIFF. No private endpoints, and no automating desktop products.
Separate namespaces and nodes
Each product gets its own namespace, quota and node pool, so neither starves the other.
FME: use FME Flow for automation. Safe Software’s licence does not allow FME Form (formerly FME Desktop) to be used as a stand-alone translation service for others. Server-side automation belongs on FME Flow. Never run FME Form inside a worker. Confirm your use with Safe Software if it is unusual.
Every integration does the same three things. Only the tool that makes the calls changes.
Illustrative API shape. Paths and fields show the pattern. The released job API gives the final names; the surrounding pipeline or FME logic does not change.
1
Submit
Send the worker, exact version, machine class and inputs, plus the item list for a batch.
Anything that can make an HTTPS call can submit a job: a scheduler, a CI job, a cron entry or a script. Your tool keeps ownership of ordering, retries and triggers; NIKA GeoEngine runs the geoprocessing step. This small client uses only the Python standard library, so it runs in any step or container.
geoengine_job.py
"""Submit a NIKA GeoEngine job, wait for it, and exit non-zero if it fails.Usage: GEOENGINE_URL=https://<geoengine-host> GEOENGINE_TOKEN=... \ python geoengine_job.py payload.json [timeout_seconds]"""import json, os, sys, time, urllib.error, urllib.requestBASE = os.environ["GEOENGINE_URL"].rstrip("/")HEADERS = {"Authorization": "Bearer " + os.environ["GEOENGINE_TOKEN"], "Content-Type": "application/json"}def call(method, path, body=None): data = json.dumps(body).encode() if body is not None else None req = urllib.request.Request(BASE + path, data=data, method=method, headers=HEADERS) with urllib.request.urlopen(req, timeout=30) as resp: return json.load(resp)def run(payload, timeout_seconds=7200): job_id = call("POST", "/v1/jobs", payload)["job_id"] print("submitted " + job_id, file=sys.stderr) deadline, errors = time.time() + timeout_seconds, 0 while time.time() < deadline: try: status = call("GET", "/v1/jobs/" + job_id)["status"] except urllib.error.HTTPError as exc: if exc.code < 500: # auth or request problem: retrying will not help sys.exit("gateway returned HTTP %d for job %s" % (exc.code, job_id)) status = None # 5xx: treat like a network blip except OSError: # network blip while polling status = None if status is None: errors += 1 if errors > 5: sys.exit("lost contact with the gateway while polling job " + job_id) else: errors = 0 if status == "completed": return job_id if status == "failed": sys.exit("job " + job_id + " failed") time.sleep(15) try: # nobody is waiting any more: stop the job call("POST", "/v1/jobs/" + job_id + "/cancel") except OSError: pass sys.exit("job " + job_id + " timed out and was cancelled")if __name__ == "__main__": with open(sys.argv[1]) as f: payload = json.load(f) # worker, version, machine_class, inputs, items timeout = int(sys.argv[2]) if len(sys.argv) > 2 else 7200 print(run(payload, timeout)) # the job ID, for later steps
Pass the printed job ID to later steps, and keep the token in your tool’s secret store.
Retries submit a new job. If your tool retries a failed step, the step submits a fresh job. Retry only infrastructure errors, not a job that failed because of the worker’s own code, which would fail again and spend compute twice. Keep workers safe to rerun.
Fan out with one batch job. Send all items in one request when they share a worker and machine class, so you track one job ID and one resource record. Submit separate jobs only when items need different workers or versions.
FME Flow is strong at data integration across hundreds of formats; NIKA GeoEngine is strong at heavy imagery processing. A common shape: FME on the edges (ingest, then publish), NIKA GeoEngine in the middle.An FME Flow workspace calls NIKA GeoEngine
Step
Transformer
What it does
Submit
HTTPCaller
POST /v1/jobs with the JSON body and a bearer token from an FME Flow web connection
Read the ID
JSONExtractor
Extracts job_id
Wait
HTTPCaller in a looping custom transformer, with a Decelerator
Polls the status every few seconds
Decide
Tester, Terminator
Continues on completed, fails the workspace on failed
NIKA GeoEngine results start FME Flow work. When a batch completes, your pipeline calls FME Flow’s REST API V4 (/fmeapiv4/…) to submit a workspace, or posts to an Automation webhook to load results into an enterprise database.
Use REST API V4. V3 is removed from FME Flow 2026.1, and from 2026.1 a trailing slash on a V4 endpoint can return 404.
Both on one cluster
Deploy FME Flow with Safe Software’s official Helm chart, in its own namespace, under your FME Flow licence.
Define engine groups in its Helm values, and pin them to FME’s own nodes with nodeSelector and tolerations. Standard and CPU-usage engines stay counted by FME Flow’s own licensing.
Point both products at the same storage so data flows between them without copies.
ArcGIS Image Server publishes and analyses imagery for ArcGIS clients. NIKA GeoEngine runs the custom, GPU-heavy or restricted processing around it. They meet in shared storage, not inside each other.Pattern: NIKA GeoEngine produces, Image Server serves
Write Cloud-Optimised GeoTIFFs from your workers to an object store bucket.
Register that bucket as a cloud store in ArcGIS Enterprise, using ArcGIS’s own data store registration.
Create or refresh imagery layers from the new rasters through ArcGIS’s public REST API or ArcGIS API for Python, triggered by your pipeline when the batch completes.
ArcGIS users get the results as hosted imagery layers. OnlyMap apps can stream the same COGs directly with no extra copy.
Use ArcGIS Image Server for
Use NIKA GeoEngine for
Serving imagery to ArcGIS clients
Your own Python or R, and open-source models
ArcGIS raster functions and raster analytics your analysts already use
GPU inference that needs specific CUDA libraries
Workers restricted to cleared roles
Large fan-out across hundreds of scenes
Both on one cluster
Deploy ArcGIS Enterprise on Kubernetes with Esri’s deployment tools, into the dedicated namespace Esri requires, on a supported environment.
Image hosting and distributed raster analysis carry their own Esri licences (Image Services, Raster Analytics). They stay with your ArcGIS deployment, not with NIKA GeoEngine.
Give each product its own quota and node pool. Both autoscale independently within one cluster.
NIKA GeoEngine’s CPU, high-memory and GPU pools tainted and separate from other products’ pools
Pipeline step pods
Thin clients on a general pool, with no GPU or high-memory requests
Storage
One shared object store or volume, so outputs flow between tools without copies
Network
Explicit rules for each namespace that calls the gateway
Access
Cluster RBAC for who administers each product; roles in NIKA GeoEngine for who runs each worker
⌘I
{"docsConfig":{"theme":"linden","$schema":"https://mintlify.com/docs.json","name":"Nika","colors":{"primary":"#eba941","light":"#c5ff5a","dark":"#170d19"},"logo":{"light":"https://mintcdn.com/nika/iovx8mqbdwtaJS_G/images/nika-documentation-logo-light.svg?fit=max\u0026auto=format\u0026n=iovx8mqbdwtaJS_G\u0026q=85\u0026s=461d7a31ec6dbcee21be77688516ea6e","dark":"https://mintcdn.com/nika/iovx8mqbdwtaJS_G/images/nika-documentation-logo-dark.svg?fit=max\u0026auto=format\u0026n=iovx8mqbdwtaJS_G\u0026q=85\u0026s=bb868d511512b0d20a764974961fe9c8"},"favicon":"https://mintcdn.com/nika/Sf5kMtAKqa3lY-ZF/favicon.ico?fit=max\u0026auto=format\u0026n=Sf5kMtAKqa3lY-ZF\u0026q=85\u0026s=c984e1898bccea1ef65bea965afe646a","appearance":{"default":"dark"},"background":{"decoration":"windows","color":{"light":"#fefcf9","dark":"#0f100d"}},"navbar":{"links":[{"href":"https://www.nikaplanet.com/pricing","label":"Pricing"},{"href":"mailto:support@nikaplanet.com","label":"Support"},{"href":"https://www.nikaplanet.com/download","label":"Download Desktop"}],"primary":{"type":"button","label":"Planet Console","href":"https://planet.nika.eco"}},"footer":{"socials":{"x":"https://x.com/nikaplanet","github":"https://github.com/nikaplanet","linkedin":"https://linkedin.com/company/nikaplanet"},"links":[{"header":"Company","items":[{"label":"Blog","href":"https://www.nikaplanet.com/resources"},{"label":"Terms and Conditions","href":"https://www.nikaplanet.com/terms-conditions"}]}]},"seo":{"indexing":"navigable"},"fonts":{"family":"Space Grotesk"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Pricing","href":"https://www.nikaplanet.com/pricing"},{"anchor":"Support","icon":"question","href":"mailto:support@nikaplanet.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nika","hasAudioNarration":false,"actualSubdomain":"nika","customDomains":["docs.nikaplanet.com"],"gitSource":{"type":"github","owner":"lawrencenika","repo":"nika-doc","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6acc6994c9710b31791697b0","collectionId":"d86d4b11-e50e-4771-8945-68022b59cb0f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acc6994c9710b31791697b0"},"entitlements":{},"buildId":"6aed8d6bd0229dc309209d07","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"Product/Features","count":59},{"language":"default","tag":"Product Features","count":59},{"language":"default","tag":"NIKA Planet","count":50},{"language":"default","tag":"Developer Platform","count":30},{"language":"default","tag":"Developer Tools","count":30},{"language":"default","tag":"NIKA GeoEngine CLI","count":18},{"language":"default","tag":"NikaWorkspace","count":11},{"language":"default","tag":"NikaMap","count":11},{"language":"default","tag":"Industrial Solutions","count":10},{"language":"default","tag":"NikaNotebook","count":9}]},"assistantConfig":{},"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":"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":"vite-origin","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},{"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},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"geoengine.css","content":"#content-area:has([data-page-href=\"/geoengine/overview\"]) #page-title::after{content:\"Previously called NIKA Worker\";display:inline-block;vertical-align:middle;margin-left:14px;padding:3px 12px;border:1px solid currentColor;border-radius:999px;font-size:13px;font-weight:500;letter-spacing:0;white-space:nowrap;opacity:0.7}img.ge-v{display:none}img.ge-v.ge-wide.ge-light{display:block}.dark img.ge-v.ge-wide.ge-light{display:none}.dark img.ge-v.ge-wide.ge-dark{display:block}@media (max-width: 640px){img.ge-v.ge-wide.ge-light,.dark img.ge-v.ge-wide.ge-dark{display:none}img.ge-v.ge-tall.ge-light{display:block;max-width:460px;margin:0 auto}.dark img.ge-v.ge-tall.ge-light{display:none}.dark img.ge-v.ge-tall.ge-dark{display:block;max-width:460px;margin:0 auto}}.ge-slot{width:100%}.ge-slot-run{aspect-ratio:760 / 452}.ge-slot-hist{aspect-ratio:760 / 350}.ge-slot-bullet{aspect-ratio:760 / 262}@media (max-width: 640px){.ge-slot-run{aspect-ratio:auto;min-height:450px}.ge-slot-hist{aspect-ratio:auto;min-height:360px}.ge-slot-bullet{aspect-ratio:auto;min-height:360px}}.ge-text-cards{container-type:inline-size}.ge-text-cards .card-group{--cols: 1 !important}@container (min-width: 800px){.ge-text-cards .card-group{--cols: 2 !important}}"}],"page":{"pagePath":"geoengine/integrations","slug":"/geoengine/integrations","pageMetadata":{"title":"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine","sidebarTitle":"Integrations","description":"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor's licence terms.","href":"/geoengine/integrations"},"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: \"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor’s licence terms.\"\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={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Heading,Note,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Keep the tools you already run. Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with imagery servers such as ArcGIS Image Server, for the steps that need GPUs, high memory or controlled access.`}),`\n`,_jsx(Heading,{level:`2`,id:`integrate-the-way-each-vendor-allows`,children:`Integrate the way each vendor allows`}),`\n`,_jsx(_components.p,{children:`Every pattern on this page keeps each product inside its own licence terms.`}),`\n`,_jsx(`div`,{className:`ge-text-cards`,children:_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Each product's own installer`,icon:`box-open`,children:`FME Flow with Safe Software’s Helm chart, ArcGIS Enterprise on Kubernetes with Esri’s deployment tools. NIKA GeoEngine never repackages, redistributes or wraps another vendor’s software.`}),_jsx(Card,{title:`Your licence, your seat count`,icon:`id-card`,children:`Each product runs under the licence you hold for it, and the vendor’s own engine and core limits keep applying.`}),_jsx(Card,{title:`Documented interfaces only`,icon:`plug`,children:`Public REST APIs, webhooks and shared storage formats such as Cloud-Optimised GeoTIFF. No private endpoints, and no automating desktop products.`}),_jsx(Card,{title:`Separate namespaces and nodes`,icon:`layer-group`,children:`Each product gets its own namespace, quota and node pool, so neither starves the other.`})]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`FME: use FME Flow for automation.`}),` Safe Software’s licence does not allow FME Form (formerly FME Desktop) to be used as a stand-alone translation service for others. Server-side automation belongs on FME Flow. Never run FME Form inside a worker. Confirm your use with Safe Software if it is unusual.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`the-integration-contract`,children:`The integration contract`}),`\n`,_jsx(_components.p,{children:`Every integration does the same three things. Only the tool that makes the calls changes.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Illustrative API shape.`}),` Paths and fields show the pattern. The released job API gives the final names; the surrounding pipeline or FME logic does not change.`]})}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Submit`,children:[_jsx(_components.p,{children:`Send the worker, exact version, machine class and inputs, plus the item list for a batch.`}),_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`http`,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:`http`,children:_jsxs(_components.code,{language:`http`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`POST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` https://\u003cgeoengine-host>/v1/jobs`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`Authorization`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Bearer \u003cservice-account-token>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`Content-Type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` application/json`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_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\":`#9CDCFE`},children:` \"worker\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cloud-removal-ndvi\"`}),_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\":`#9CDCFE`},children:` \"version\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2.3.1\"`}),_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\":`#9CDCFE`},children:` \"machine_class\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"highmem\"`}),_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\":`#9CDCFE`},children:` \"inputs\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"output-dir\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3://results/2026-11/flevoland\"`}),_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\":`#9CDCFE`},children:` \"items\"`}),_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:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"scene\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3://scenes/S2B_31UFU_20261102.tif\"`}),_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:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"scene\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"s3://scenes/S2B_31UFU_20261105.tif\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,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:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"job_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"j-7q2c9xk4\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"queued\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"tasks\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})})]}),_jsx(Step,{title:`Poll`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GET /v1/jobs/j-7q2c9xk4`}),` until `,_jsx(_components.code,{children:`completed`}),` or `,_jsx(_components.code,{children:`failed`}),`.`]})}),_jsx(Step,{title:`Read the outputs`,children:_jsx(_components.p,{children:`Read results from shared storage. Later steps, maps and imagery servers read from the same place.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`rules-that-keep-integrations-robust`,children:`Rules that keep integrations robust`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Service account per pipeline,`}),` granted only the workers it needs, restricted ones included.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pin the worker version.`}),` Never “latest” in production.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Fail the step when the job fails,`}),` set a timeout longer than your longest job, and cancel the job if the step gives up waiting.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep the step thin.`}),` It submits and waits; the compute runs on NIKA GeoEngine’s pools.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep the token in a secret,`}),` never in a pipeline definition.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-your-tool`,children:`Choose your tool`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Your pipelines and scripts`,id:`your-pipelines-and-scripts`,children:[_jsx(_components.p,{children:`Anything that can make an HTTPS call can submit a job: a scheduler, a CI job, a cron entry or a script. Your tool keeps ownership of ordering, retries and triggers; NIKA GeoEngine runs the geoprocessing step. This small client uses only the Python standard library, so it runs in any step or container.`}),_jsx(CodeBlock,{filename:`geoengine_job.py`,numberOfLines:`55`,language:`python`,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:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`55`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"\"Submit a NIKA GeoEngine job, wait for it, and exit non-zero if it fails.`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Usage: GEOENGINE_URL=https://\u003cgeoengine-host> GEOENGINE_TOKEN=... `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`\\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` python geoengine_job.py payload.json [timeout_seconds]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` json, os, sys, time, urllib.error, urllib.request`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`BASE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GEOENGINE_URL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`].rstrip(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`HEADERS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer \"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GEOENGINE_TOKEN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"application/json\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` call`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`method`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`path`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`body`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`None`}),_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:` data `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` json.dumps(body).encode() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` body `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`is`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` not`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` else`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` req `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` urllib.request.Request(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`BASE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` path, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`data`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`data, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`method`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`method, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`headers`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`HEADERS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` urllib.request.urlopen(req, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timeout`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`30`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` resp:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` json.load(resp)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`payload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`timeout_seconds`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`7200`}),_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:` job_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` call(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/v1/jobs\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, payload)[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"submitted \"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`file`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`sys.stderr)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` deadline, errors `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` time.time() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` timeout_seconds, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` while`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` time.time() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` deadline:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` try`}),_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:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` call(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/v1/jobs/\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id)[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` except`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` urllib.error.HTTPError `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` exc:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` exc.code `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 500`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# auth or request problem: retrying will not help`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sys.exit(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"gateway returned HTTP `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`%d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` for job `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`%s`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` %`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (exc.code, job_id))`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 5xx: treat like a network blip`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` except`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OSError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# network blip while polling`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`is`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_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:` errors `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` errors `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 5`}),_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:` sys.exit(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"lost contact with the gateway while polling job \"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` else`}),_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:` errors `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`==`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"completed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`==`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"failed\"`}),_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:` sys.exit(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job \"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \" failed\"`}),_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:` time.sleep(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`15`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` try`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# nobody is waiting any more: stop the job`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` call(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"POST\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/v1/jobs/\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"/cancel\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` except`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OSError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` pass`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sys.exit(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job \"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` +`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` job_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \" timed out and was cancelled\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:` __name__`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ==`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"__main__\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` with`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` open`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(sys.argv[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` f:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payload `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` json.load(f) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# worker, version, machine_class, inputs, items`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` timeout `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(sys.argv[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` len`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(sys.argv) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 2`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` else`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 7200`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(run(payload, timeout)) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# the job ID, for later steps`})]}),`\n`]})})}),_jsx(_components.p,{children:`Pass the printed job ID to later steps, and keep the token in your tool’s secret store.`}),_jsxs(Warning,{children:[_jsx(_components.strong,{children:`Retries submit a new job.`}),` If your tool retries a failed step, the step submits a fresh job. Retry only infrastructure errors, not a job that failed because of the worker’s own code, which would fail again and spend compute twice. Keep workers safe to rerun.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fan out with one batch job.`}),` Send all items in one request when they share a worker and machine class, so you track one job ID and one resource record. Submit separate jobs only when items need different workers or versions.`]})]}),_jsxs(Tab,{title:`FME Flow`,id:`fme-flow`,children:[_jsx(_components.p,{children:`FME Flow is strong at data integration across hundreds of formats; NIKA GeoEngine is strong at heavy imagery processing. A common shape: FME on the edges (ingest, then publish), NIKA GeoEngine in the middle.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`An FME Flow workspace calls NIKA GeoEngine`})}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Step`}),_jsx(_components.th,{children:`Transformer`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Submit`}),_jsx(_components.td,{children:`HTTPCaller`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`POST /v1/jobs`}),` with the JSON body and a bearer token from an FME Flow web connection`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Read the ID`}),_jsx(_components.td,{children:`JSONExtractor`}),_jsxs(_components.td,{children:[`Extracts `,_jsx(_components.code,{children:`job_id`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Wait`}),_jsx(_components.td,{children:`HTTPCaller in a looping custom transformer, with a Decelerator`}),_jsx(_components.td,{children:`Polls the status every few seconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Decide`}),_jsx(_components.td,{children:`Tester, Terminator`}),_jsxs(_components.td,{children:[`Continues on `,_jsx(_components.code,{children:`completed`}),`, fails the workspace on `,_jsx(_components.code,{children:`failed`})]})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`NIKA GeoEngine results start FME Flow work.`}),` When a batch completes, your pipeline calls FME Flow’s `,_jsx(_components.strong,{children:`REST API V4`}),` (`,_jsx(_components.code,{children:`/fmeapiv4/…`}),`) to submit a workspace, or posts to an `,_jsx(_components.strong,{children:`Automation webhook`}),` to load results into an enterprise database.`]}),_jsxs(Warning,{children:[_jsx(_components.strong,{children:`Use REST API V4.`}),` V3 is removed from FME Flow 2026.1, and from 2026.1 a trailing slash on a V4 endpoint can return `,_jsx(_components.code,{children:`404`}),`.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Both on one cluster`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Deploy FME Flow with `,_jsx(_components.strong,{children:`Safe Software’s official Helm chart`}),`, in its own namespace, under your FME Flow licence.`]}),`\n`,_jsxs(_components.li,{children:[`Define engine groups in its Helm values, and pin them to FME’s own nodes with `,_jsx(_components.code,{children:`nodeSelector`}),` and `,_jsx(_components.code,{children:`tolerations`}),`. Standard and CPU-usage engines stay counted by FME Flow’s own licensing.`]}),`\n`,_jsx(_components.li,{children:`Point both products at the same storage so data flows between them without copies.`}),`\n`]})]}),_jsxs(Tab,{title:`ArcGIS Image Server`,id:`arcgis-image-server`,children:[_jsx(_components.p,{children:`ArcGIS Image Server publishes and analyses imagery for ArcGIS clients. NIKA GeoEngine runs the custom, GPU-heavy or restricted processing around it. They meet in shared storage, not inside each other.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Pattern: NIKA GeoEngine produces, Image Server serves`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Write Cloud-Optimised GeoTIFFs`}),` from your workers to an object store bucket.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Register that bucket`}),` as a cloud store in ArcGIS Enterprise, using ArcGIS’s own data store registration.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Create or refresh imagery layers`}),` from the new rasters through ArcGIS’s public REST API or ArcGIS API for Python, triggered by your pipeline when the batch completes.`]}),`\n`]}),_jsx(_components.p,{children:`ArcGIS users get the results as hosted imagery layers. OnlyMap apps can stream the same COGs directly with no extra copy.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Use ArcGIS Image Server for`}),_jsx(_components.th,{children:`Use NIKA GeoEngine for`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Serving imagery to ArcGIS clients`}),_jsx(_components.td,{children:`Your own Python or R, and open-source models`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`ArcGIS raster functions and raster analytics your analysts already use`}),_jsx(_components.td,{children:`GPU inference that needs specific CUDA libraries`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{}),_jsx(_components.td,{children:`Workers restricted to cleared roles`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{}),_jsx(_components.td,{children:`Large fan-out across hundreds of scenes`})]})]})]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Both on one cluster`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Deploy ArcGIS Enterprise on Kubernetes with `,_jsx(_components.strong,{children:`Esri’s deployment tools`}),`, into the dedicated namespace Esri requires, on a supported environment.`]}),`\n`,_jsx(_components.li,{children:`Image hosting and distributed raster analysis carry their own Esri licences (Image Services, Raster Analytics). They stay with your ArcGIS deployment, not with NIKA GeoEngine.`}),`\n`,_jsx(_components.li,{children:`Give each product its own quota and node pool. Both autoscale independently within one cluster.`}),`\n`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`sharing-one-cluster`,children:`Sharing one cluster`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Concern`}),_jsx(_components.th,{children:`Recommendation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Namespaces`})}),_jsx(_components.td,{children:`One per product, each with its own quota`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Node pools`})}),_jsx(_components.td,{children:`NIKA GeoEngine’s CPU, high-memory and GPU pools tainted and separate from other products’ pools`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Pipeline step pods`})}),_jsx(_components.td,{children:`Thin clients on a general pool, with no GPU or high-memory requests`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Storage`})}),_jsx(_components.td,{children:`One shared object store or volume, so outputs flow between tools without copies`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Network`})}),_jsx(_components.td,{children:`Explicit rules for each namespace that calls the gateway`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Access`})}),_jsx(_components.td,{children:`Cluster RBAC for who administers each product; roles in NIKA GeoEngine for who runs each worker`})]})]})]})]})}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":"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine","sidebarTitle":"Integrations","description":"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor's licence terms.","href":"/geoengine/integrations"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Integrate the way each vendor allows","slug":"integrate-the-way-each-vendor-allows","depth":2,"children":[]},{"title":"The integration contract","slug":"the-integration-contract","depth":2,"children":[{"title":"Rules that keep integrations robust","slug":"rules-that-keep-integrations-robust","depth":3,"children":[]}]},{"title":"Choose your tool","slug":"choose-your-tool","depth":2,"children":[]},{"title":"Sharing one cluster","slug":"sharing-one-cluster","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/nika/8129945477164018/floating-cta.js","/_mintlify/custom/nika/fdc79a95262be4a8/platform-detect.js","/_mintlify/custom/nika/47ada1a5ef57fc0d/nika-background-theme.js","/_mintlify/custom/nika/dd388fe82517b4bf/topbar-actions.js","/_mintlify/custom/nika/e39093d8998e47f3/memory-core-chat-theme.js"],"subdomain":"nika","siteName":"Nika","title":"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine - Nika","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-06T08:19:00.458Z","originalFileLocation":"geoengine/integrations.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=\"dark\"}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=\"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor\u0026#x27;s licence terms.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nika\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_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/nika/ZdVuE3w5PrQQ4Fjr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine - Nika\">\u003cmeta data-mint-head property=\"og:description\" content=\"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor\u0026#x27;s licence terms.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nika\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.nikaplanet.com/geoengine/integrations\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nika.mintlify.site/_mintlify/api/og/v2?division=NIKA+GeoEngine\u0026amp;title=Connect+Pipelines%2C+FME+Flow+and+ArcGIS+to+NIKA+GeoEngine\u0026amp;description=Call+NIKA+GeoEngine+from+your+pipelines%2C+scripts+or+FME+Flow%2C+and+share+results+with+ArcGIS+Image+Server+within+each+vendor%27s+licence+terms.\u0026amp;theme=9c2d71edf4dc16e460d50242\u0026amp;signature=368c7bf77641e042e85857a712a9e9b3d5de693fc9f7bef6d3920ddf6056f780\">\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=\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine - Nika\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor\u0026#x27;s licence terms.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nika.mintlify.site/_mintlify/api/og/v2?division=NIKA+GeoEngine\u0026amp;title=Connect+Pipelines%2C+FME+Flow+and+ArcGIS+to+NIKA+GeoEngine\u0026amp;description=Call+NIKA+GeoEngine+from+your+pipelines%2C+scripts+or+FME+Flow%2C+and+share+results+with+ArcGIS+Image+Server+within+each+vendor%27s+licence+terms.\u0026amp;theme=9c2d71edf4dc16e460d50242\u0026amp;signature=368c7bf77641e042e85857a712a9e9b3d5de693fc9f7bef6d3920ddf6056f780\">\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/nika/ZdVuE3w5PrQQ4Fjr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nika\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#eba941\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.nikaplanet.com/geoengine/integrations\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/geoengine/integrations.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.nikaplanet.com/#organization\",\"name\":\"Nika\",\"url\":\"https://docs.nikaplanet.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nika/iovx8mqbdwtaJS_G/images/nika-documentation-logo-light.svg?fit=max\u0026auto=format\u0026n=iovx8mqbdwtaJS_G\u0026q=85\u0026s=461d7a31ec6dbcee21be77688516ea6e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.nikaplanet.com#website\",\"name\":\"Nika\",\"url\":\"https://docs.nikaplanet.com\",\"publisher\":{\"@id\":\"https://docs.nikaplanet.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.nikaplanet.com/geoengine/integrations#webpage\",\"url\":\"https://docs.nikaplanet.com/geoengine/integrations\",\"name\":\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine\",\"description\":\"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor's licence terms.\",\"dateModified\":\"2026-11-06T08:19:00.458Z\",\"isPartOf\":{\"@id\":\"https://docs.nikaplanet.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.nikaplanet.com/geoengine/integrations#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.nikaplanet.com/geoengine/integrations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"NIKA GeoEngine\",\"item\":\"https://docs.nikaplanet.com/geoengine/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine\",\"item\":\"https://docs.nikaplanet.com/geoengine/integrations\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.nikaplanet.com/geoengine/integrations#article\",\"headline\":\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine\",\"name\":\"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine\",\"description\":\"Call NIKA GeoEngine from your pipelines, scripts or FME Flow, and share results with ArcGIS Image Server within each vendor's licence terms.\",\"url\":\"https://docs.nikaplanet.com/geoengine/integrations\",\"mainEntityOfPage\":{\"@id\":\"https://docs.nikaplanet.com/geoengine/integrations#webpage\"},\"dateModified\":\"2026-11-06T08:19:00.458Z\",\"publisher\":{\"@id\":\"https://docs.nikaplanet.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.nikaplanet.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nika\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nika","nav":{"global":{"anchors":[{"anchor":"Pricing","href":"https://www.nikaplanet.com/pricing"},{"anchor":"Support","icon":"question","href":"mailto:support@nikaplanet.com"}]},"tabs":[{"tab":"Product/Features","pages":[{"title":"Product/Features","href":"/nika-desktop/overview"}]},{"tab":"Developer Platform","anchors":[{"anchor":"Welcome","icon":"house","href":"/developer-platform/overview"},{"anchor":"Developer Tools","groups":[{"group":"OnlyMap JS","icon":"map","pages":[{"title":"Overview","icon":"map","href":"/onlymap/overview"},{"title":"Authoring Model","icon":"code","href":"/onlymap/authoring"},{"title":"Cartographs \u0026 Atlases","icon":"print","href":"/onlymap/cartographs"},{"title":"React Native","icon":"mobile","href":"/onlymap/react-native"},{"title":"Remotion","icon":"clapperboard","href":"/onlymap/remotion"},{"title":"Licensing \u0026 Telemetry","icon":"scale-balanced","href":"/onlymap/licensing-and-telemetry"}]},{"group":"NIKA GeoEngine","icon":"server","pages":[{"title":"NIKA GeoEngine for Kubernetes","sidebarTitle":"Overview","mode":"wide","href":"/geoengine/overview"},{"title":"Deploy NIKA GeoEngine on Kubernetes: Plan, Install, Operate","sidebarTitle":"Deploy and operate","href":"/geoengine/deploy"},{"title":"Build Geoprocessing Workers and Batch Jobs on Kubernetes","sidebarTitle":"Workers and jobs","href":"/geoengine/workers"},{"title":"Right-Size GPU, CPU and RAM per Geoprocessing Worker","sidebarTitle":"Observability","mode":"wide","description":"Every NIKA GeoEngine run records runtime and CPU, memory and GPU use over time, so you can pick the right machine class for each worker from evidence.","href":"/geoengine/observability"},{"title":"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine","sidebarTitle":"Integrations","href":"/geoengine/integrations"},{"title":"Build fullstack map processing with OnlyMapJS","sidebarTitle":"Build fullstack map processing with OnlyMapJS","mode":"wide","description":"Pair OnlyMap JS in the browser with NIKA GeoEngine on Kubernetes: run satellite imagery batch jobs from a map and stream COG results with no tile server.","href":"/geoengine/onlymap-fullstack"}]},{"group":"NIKA GeoEngine CLI","icon":"terminal","pages":[{"title":"Overview","href":"/nika-geoengine/overview"},{"group":"Start Here","pages":[{"title":"Installation \u0026 Setup","href":"/guides/custom-geoprocess-deployment/installation"},{"title":"Your First Worker: Step-by-Step","href":"/guides/custom-geoprocess-deployment/step-by-step"},{"title":"Your Second Worker: AI-assisted","href":"/guides/custom-geoprocess-deployment/ai-coder-worker"}]},{"group":"Build \u0026 Release","pages":[{"title":"Designing Worker Tests","href":"/guides/custom-geoprocess-deployment/test-designing"},{"title":"Version Workers","href":"/guides/custom-geoprocess-deployment/versioning"},{"title":"Cloud Push","href":"/guides/custom-geoprocess-deployment/cloud-push"},{"title":"Collaborate on Workers","href":"/guides/custom-geoprocess-deployment/worker-collaboration"}]},{"group":"Run in GIS","pages":[{"title":"Run Workers in ArcGIS Pro or QGIS","href":"/guides/custom-geoprocess-deployment/running-in-gis"},{"title":"Setup the Plugin in GIS","href":"/guides/custom-geoprocess-usage/setup-plugin-in-gis"},{"title":"Submit a Job","href":"/guides/custom-geoprocess-usage/submitting-a-job"},{"title":"Access Job Outputs","href":"/guides/custom-geoprocess-usage/access-job-outputs"},{"title":"Use with QGIS","icon":"plug","href":"/nika-geoengine/qgis"},{"title":"Use with ArcGIS Pro","icon":"plug","href":"/nika-geoengine/arcgis"}]},{"group":"Maintain \u0026 Reference","pages":[{"title":"Debug \u0026 Troubleshoot","href":"/guides/custom-geoprocess-deployment/debugging"},{"title":"Maintain GeoEngine CLI Files","href":"/guides/custom-geoprocess-deployment/maintenance"},{"title":"CLI Reference","href":"/guides/custom-geoprocess-deployment/cli-reference"},{"title":"NIKA GeoEngine CLI Releases","href":"/nika-geoengine/releases"}]}]}]}]},{"tab":"Industrial Solutions","pages":[{"title":"Industrial Solutions","href":"/industrial-solutions/river-ecology-stress-hotspot"}]}]},"basePath":"","title":"Connect Pipelines, FME Flow and ArcGIS to NIKA GeoEngine - Nika","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":[],"chunks":[]}