The artifacts a settled job's sealed journal records
Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job’s receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt’s chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent’s harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal’s; the download route checks the bytes against them. No filesystem path of the server is exposed.
GET
/
v1
/
jobs
/
{id}
/
artifacts
The artifacts a settled job's sealed journal records
A settled job's artifacts, as its sealed journal records them, bound to its receipt: receipt is the job's own (trace id and chain head included), verdict the tier its journal attained. At most 1024 entries are listed, in journal order; truncated says more exist (a download still finds every recorded name).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Nika","description":"Nika turns repeatable AI work into a .nika file you keep: checked before it runs, run with the model you choose, proven afterwards.","colors":{"primary":"#2f6bff","light":"#8db4ff","dark":"#2f6bff"},"logo":{"light":"https://mintcdn.com/supernovae-acdf3706/3ObRrFNWymK8fsLG/images/logo-light.svg?fit=max\u0026auto=format\u0026n=3ObRrFNWymK8fsLG\u0026q=85\u0026s=73b2f60862ed01f97cfa045151df991e","dark":"https://mintcdn.com/supernovae-acdf3706/3ObRrFNWymK8fsLG/images/logo-dark.svg?fit=max\u0026auto=format\u0026n=3ObRrFNWymK8fsLG\u0026q=85\u0026s=ae6d5ed9959c0ecb505ee6dd3bf66fe1","href":"/introduction"},"favicon":"https://mintcdn.com/supernovae-acdf3706/3ObRrFNWymK8fsLG/images/favicon.svg?fit=max\u0026auto=format\u0026n=3ObRrFNWymK8fsLG\u0026q=85\u0026s=e2b5356160334944fea5bc30352f8b97","appearance":{"default":"dark"},"background":{"decoration":"gradient","color":{"light":"#F4F6FC","dark":"#08090b"}},"navbar":{"links":[{"href":"/getting-started/installation","label":"Install"},{"href":"https://nika.sh","label":"nika.sh"},{"href":"https://github.com/supernovae-st/nika","type":"github"}],"primary":{"type":"button","label":"Build with the SDK","href":"/sdk/start/quickstart"}},"footer":{"socials":{"github":"https://github.com/supernovae-st/nika","x":"https://x.com/ThibautMelen"},"links":[{"header":"Nika","items":[{"label":"Site","href":"https://nika.sh"},{"label":"Current status","href":"/reference/status"},{"label":"Constellation","href":"/reference/constellation"}]},{"header":"Build","items":[{"label":"Language spec (Apache-2.0)","href":"https://github.com/supernovae-st/nika-spec"},{"label":"Source (AGPL)","href":"https://github.com/supernovae-st/nika"},{"label":"TypeScript SDK","href":"/sdk/overview"},{"label":"Homebrew tap","href":"https://github.com/supernovae-st/homebrew-tap"}]},{"header":"Studio","items":[{"label":"SuperNovae","href":"https://supernovae.studio"}]}]},"search":{"prompt":"Search Nika docs…"},"seo":{"metatags":{"og:image":"https://docs.nika.sh/images/og-card.png","twitter:card":"summary_large_image"}},"fonts":{"family":"Inter"},"styling":{"eyebrows":"section","codeblocks":"system","latex":true},"banner":{"content":"New here? Write a workflow, run it, inspect a real result. No account or API key. [Start here →](/introduction)","dismissible":true},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"supernovae-acdf3706","hasAudioNarration":false,"actualSubdomain":"supernovae-acdf3706","customDomains":["docs.nika.sh"],"gitSource":{"type":"github","owner":"supernovae-st","repo":"nika-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae1e0448ead5bbc3c1c8f55","collectionId":"6273a903-37d8-4d59-82f8-106da69c6101","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae1e0448ead5bbc3c1c8f55"},"feedback":{"thumbs":true,"agentFeedback":true,"edits":true,"issues":true},"entitlements":{},"buildId":"6ae1e0448ead5bbc3c1c8f55","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"Reference","count":157},{"language":"default","tag":"Language fields","count":108},{"language":"default","tag":"Guide","count":63},{"language":"default","tag":"SDK","count":54},{"language":"default","tag":"Examples","count":33},{"language":"default","tag":"Tool contracts","count":30},{"language":"default","tag":"Verbs and models","count":29},{"language":"default","tag":"Agents \u0026 integrations","count":28},{"language":"default","tag":"Remote API","count":24},{"language":"default","tag":"Tasks and dependencies","count":22}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"global.css","content":"@keyframes sdk-doc-particles{to{transform:translate3d(.4rem,-.55rem,0);opacity:.42}}.mermaid svg,.prose .mermaid svg,[data-mermaid] svg,div.mermaid,pre.mermaid{background:0 0!important}.mermaid .edgeLabel{background-color:transparent!important;color:#b8b2aa!important}.mermaid .edgePaths path,.mermaid .flowchart-link{stroke:#4a4540!important}.mermaid{display:flex;justify-content:center;padding:.75rem 0}.card,[class*=card] a{transition:border-color .2s ease,transform .2s ease}.card:hover{border-color:rgba(159,208,255,.45)!important;transform:translateY(-1px)}.dark pre{background-color:#0a1226!important}#banner,[data-component=banner]{background:linear-gradient(90deg,#0a1226,#04050d)!important;color:#cfe6ff!important}#banner a,[data-component=banner] a{color:#9fd0ff!important}.sdk-flight{--sdk-flight-ink:#cfe6ff;--sdk-flight-signal:#8db4ff;position:relative;isolation:isolate;overflow:hidden;margin:1.75rem 0;border:1px solid rgb(141 180 255/.24);border-radius:.55rem;background:radial-gradient(80% 120% at 92% -18%,rgb(47 107 255/.14),transparent 58%),linear-gradient(180deg,transparent 0 94%,rgb(141 180 255/.055) 94% 94.5%,transparent 94.5%),linear-gradient(90deg,rgb(141 180 255/.035) 1px,transparent 1px) 0 0/2rem 2rem,linear-gradient(rgb(141 180 255/.035) 1px,transparent 1px) 0 0/2rem 2rem,linear-gradient(145deg,rgb(10 18 38/.96),rgb(4 5 13/.98));box-shadow:inset 0 1px 0 rgb(255 255 255/.055),inset 0 0 5rem rgb(47 107 255/.06),0 2rem 5rem -3.4rem rgb(47 107 255/.62)}.sdk-flight::before{content:\"\";position:absolute;z-index:-1;inset:0;pointer-events:none;background:radial-gradient(circle at 9% 24%,rgb(159 208 255/.7) 0 1px,transparent 1.4px),radial-gradient(circle at 23% 78%,rgb(159 208 255/.38) 0 1px,transparent 1.4px),radial-gradient(circle at 34% 47%,rgb(159 208 255/.3) 0 .8px,transparent 1.3px),radial-gradient(circle at 46% 19%,rgb(159 208 255/.5) 0 1px,transparent 1.4px),radial-gradient(circle at 57% 88%,rgb(159 208 255/.34) 0 .8px,transparent 1.3px),radial-gradient(circle at 68% 68%,rgb(159 208 255/.42) 0 1px,transparent 1.4px),radial-gradient(circle at 77% 16%,rgb(159 208 255/.32) 0 .8px,transparent 1.3px),radial-gradient(circle at 88% 31%,rgb(159 208 255/.62) 0 1px,transparent 1.4px),radial-gradient(circle at 94% 82%,rgb(159 208 255/.36) 0 .8px,transparent 1.3px);opacity:.7;animation:sdk-doc-particles 9s ease-in-out infinite alternate}.sdk-flight::after{content:\"\";position:absolute;top:.8rem;right:.8rem;width:.55rem;height:.55rem;border-top:1px solid rgb(159 208 255/.52);border-right:1px solid rgb(159 208 255/.52)}.sdk-flight>span{display:block;padding:.72rem 1rem .68rem;border-bottom:1px solid rgb(141 180 255/.16);background:linear-gradient(90deg,rgb(47 107 255/.055),transparent 58%);font:.66rem/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.17em;color:var(--sdk-flight-signal);text-transform:uppercase}.sdk-flight>span::before{content:\"[ SYS ]\";margin-right:.7rem;color:rgb(207 230 255/.46)}.dark .sdk-flight pre,.sdk-flight pre{overflow-x:auto;margin:0!important;padding:clamp(1.15rem,3vw,2rem)!important;border:0!important;background:0 0!important;scrollbar-color:rgb(141 180 255/.32) transparent;color:var(--sdk-flight-ink)!important;font-size:clamp(.71rem,1.5vw,.84rem)!important;line-height:1.75!important;text-shadow:0 0 1.25rem rgb(141 180 255/.18)}.sdk-flight pre:focus-visible{outline:1px solid rgb(141 180 255/.72)!important;outline-offset:-.25rem}.dark .sdk-flight-compact pre,.sdk-flight-compact pre{padding-block:1.15rem!important}@media (prefers-reduced-motion:reduce){.sdk-flight::before{animation:none}}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.prose{line-height:1.6}.prose p{max-width:72ch;text-wrap:pretty}.prose li,.prose p{overflow-wrap:break-word}.prose :is(h1, h2, h3){line-height:1.15;letter-spacing:-.018em;text-wrap:balance;scroll-margin-top:13.5rem}.prose :is(h4, h5, h6){line-height:1.25;scroll-margin-top:13.5rem}@media (min-width:768px){.prose :is(h1, h2, h3, h4, h5, h6){scroll-margin-top:10rem}}.prose table{font-variant-numeric:tabular-nums}.prose a{text-underline-position:from-font;text-decoration-thickness:from-font}.card:focus-visible,.prose a:focus-visible,[class*=card] a:focus-visible,button:focus-visible,pre:focus-visible{outline:2px solid #2f6bff;outline-offset:2px}.dark .card:focus-visible,.dark .prose a:focus-visible,.dark [class*=card] a:focus-visible,.dark button:focus-visible,.dark pre:focus-visible{outline-color:#8db4ff}.dark pre,pre{line-height:1.65}@media (max-width:640px){input,select,textarea{font-size:16px}.card:hover{transform:none}}@media (prefers-reduced-motion:reduce){.card,[class*=card] a{transition:none}.card:hover{transform:none}}::selection{background:rgb(47 107 255/.22);color:#08090b}.dark ::selection{background:rgb(47 107 255/.38);color:#cfe6ff}"}],"page":{"pagePath":"api-reference/the-artifacts-a-settled-jobs-sealed-journal-records","slug":"/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records","pageMetadata":{"title":"The artifacts a settled job's sealed journal records","description":"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 `artifact_journal_unavailable`. The manifest is read from the journal the job's receipt names, judged by the one verifier `nika trace verify` runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit `NIKA_RUN_KEY_FILE` · `NIKA_RUN_PUB_FILE` pair, `~/.nika/keys/run-signing.pub`, the retired-key ledger), and the head must be the receipt's `chain_head`. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (`nika:chart`, `nika:image_generate`, `nika:tts_generate`, `nika:image_fx`, `nika:image_compose`) at a relative path inside the project and outside its `.nika` (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent's harness sent, kept under `.nika/blobs`. `nika:write` and `nika:edit` journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal's; the download route checks the bytes against them. No filesystem path of the server is exposed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/artifacts","href":"/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 \", _jsx(_components.code, {\n children: \"artifact_journal_unavailable\"\n }), \". The manifest is read from the journal the job’s receipt names, judged by the one verifier \", _jsx(_components.code, {\n children: \"nika trace verify\"\n }), \" runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit \", _jsx(_components.code, {\n children: \"NIKA_RUN_KEY_FILE\"\n }), \" · \", _jsx(_components.code, {\n children: \"NIKA_RUN_PUB_FILE\"\n }), \" pair, \", _jsx(_components.code, {\n children: \"~/.nika/keys/run-signing.pub\"\n }), \", the retired-key ledger), and the head must be the receipt’s \", _jsx(_components.code, {\n children: \"chain_head\"\n }), \". Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (\", _jsx(_components.code, {\n children: \"nika:chart\"\n }), \", \", _jsx(_components.code, {\n children: \"nika:image_generate\"\n }), \", \", _jsx(_components.code, {\n children: \"nika:tts_generate\"\n }), \", \", _jsx(_components.code, {\n children: \"nika:image_fx\"\n }), \", \", _jsx(_components.code, {\n children: \"nika:image_compose\"\n }), \") at a relative path inside the project and outside its \", _jsx(_components.code, {\n children: \".nika\"\n }), \" (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent’s harness sent, kept under \", _jsx(_components.code, {\n children: \".nika/blobs\"\n }), \". \", _jsx(_components.code, {\n children: \"nika:write\"\n }), \" and \", _jsx(_components.code, {\n children: \"nika:edit\"\n }), \" journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal’s; the download route checks the bytes against them. No filesystem path of the server is exposed.\"]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"The artifacts a settled job's sealed journal records","description":"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 `artifact_journal_unavailable`. The manifest is read from the journal the job's receipt names, judged by the one verifier `nika trace verify` runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit `NIKA_RUN_KEY_FILE` · `NIKA_RUN_PUB_FILE` pair, `~/.nika/keys/run-signing.pub`, the retired-key ledger), and the head must be the receipt's `chain_head`. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (`nika:chart`, `nika:image_generate`, `nika:tts_generate`, `nika:image_fx`, `nika:image_compose`) at a relative path inside the project and outside its `.nika` (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent's harness sent, kept under `.nika/blobs`. `nika:write` and `nika:edit` journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal's; the download route checks the bytes against them. No filesystem path of the server is exposed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/artifacts","href":"/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 `artifact_journal_unavailable`. The manifest is read from the journal the job's receipt names, judged by the one verifier `nika trace verify` runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit `NIKA_RUN_KEY_FILE` · `NIKA_RUN_PUB_FILE` pair, `~/.nika/keys/run-signing.pub`, the retired-key ledger), and the head must be the receipt's `chain_head`. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (`nika:chart`, `nika:image_generate`, `nika:tts_generate`, `nika:image_fx`, `nika:image_compose`) at a relative path inside the project and outside its `.nika` (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent's harness sent, kept under `.nika/blobs`. `nika:write` and `nika:edit` journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal's; the download route checks the bytes against them. No filesystem path of the server is exposed.","parameters":["dd2dc0ee-bbf5-4268-8cdf-9fc7fc4599fd"],"responses":{"200":"41bc12cb-3046-4b15-92bb-49555d64f5a3","401":"b50a62e4-2862-4439-b5a1-f4c149ab6a37","404":"e5da7503-c575-4c1a-bce6-0321487fe4b2","408":"2016517f-1d17-4380-beed-743667257f2d","409":"d09567c0-6b81-4c5e-8c38-1dddcb980da8","500":"549c0d76-07e8-44ce-9151-7f78a47e367e","503":"86e8ef54-34af-4b1f-bf04-0249b63eba8d"},"summary":"The artifacts a settled job's sealed journal records","method":"get","type":"path","servers":["878b58fd-1897-43b5-b844-719a7d9a4bd1"],"security":["3bc7d619-e3f3-461f-ba4e-93a626e72764"],"path":"/v1/jobs/{id}/artifacts","baseUrlOptions":["http://127.0.0.1"],"title":"The artifacts a settled job's sealed journal records","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"dd2dc0ee-bbf5-4268-8cdf-9fc7fc4599fd":{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"41bc12cb-3046-4b15-92bb-49555d64f5a3":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"A settled job's artifacts, as its sealed journal records them, bound to its receipt: `receipt` is the job's own (trace id and chain head included), `verdict` the tier its journal attained. At most 1024 entries are listed, in journal order; `truncated` says more exist (a download still finds every recorded name).","properties":{"artifacts":{"items":{"additionalProperties":false,"properties":{"event_id":{"description":"The id of that journal event","format":"uuid","type":"string","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].event_id","typeLabel":"string\u003cuuid>"},"kind":{"enum":["file","agent_image"],"type":"string","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"mime":{"description":"The recorded media type, else one derived from the extension, else application/octet-stream","minLength":3,"type":"string","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].mime","typeLabel":"string"},"name":{"description":"Unique within the job: `file/\u003cpath>` or `agent_image/\u003cn>.\u003cext>` (the n-th image the job's agents sent that the blob store kept). The download route's `{name}`.","minLength":1,"type":"string","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].name","typeLabel":"string"},"sha256":{"description":"SHA-256 of the recorded bytes, as journaled","pattern":"^[0-9a-f]{64}$","type":"string","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].sha256","typeLabel":"string"},"size":{"description":"Bytes, as journaled","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"artifacts.items.[INDEX].size","typeLabel":"integer"},"path":{"description":"A file's project-relative path, as the workflow wrote it (normalized). Absent for an agent image.","minLength":1,"type":"string","uniqueKey":"artifacts.items.[INDEX].path","typeLabel":"string"},"task":{"description":"The task whose event records it","type":"string","uniqueKey":"artifacts.items.[INDEX].task","typeLabel":"string"}},"required":["name","kind","size","sha256","mime","event_id"],"type":"object","uniqueKey":"artifacts.items.[INDEX]","typeLabel":"object"},"maxItems":1024,"type":"array","isRequired":true,"uniqueKey":"artifacts","typeLabel":"object[]"},"max_artifact_bytes":{"description":"The largest artifact this server downloads (256 MiB by default)","examples":[268435456],"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"max_artifact_bytes","typeLabel":"integer"},"receipt":{"additionalProperties":false,"description":"Terminal binding to the exact immutable admitted execution","properties":{"execution_id":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"receipt.execution_id","typeLabel":"string"},"job_id":{"format":"uuid","type":"string","isRequired":true,"uniqueKey":"receipt.job_id","typeLabel":"string\u003cuuid>"},"snapshot_digest":{"pattern":"^[0-9a-f]{64}$","type":"string","isRequired":true,"uniqueKey":"receipt.snapshot_digest","typeLabel":"string"},"trace_id":{"minLength":1,"type":"string","isRequired":true,"uniqueKey":"receipt.trace_id","typeLabel":"string"},"chain_head":{"minLength":1,"type":"string","uniqueKey":"receipt.chain_head","typeLabel":"string"},"origin":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"manual","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.0.kind","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"receipt.origin.oneOf.0","typeLabel":"object"},{"type":"object","required":["kind","schedule_origin","schedule_id","schedule_revision","slot_id","decision","scheduled_for","fired_at","arm_generation"],"properties":{"arm_generation":{"pattern":"^[0-9a-f]{64}$","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.arm_generation","typeLabel":"string"},"decision":{"enum":["scheduled","catch_up"],"type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.decision","typeLabel":"enum\u003cstring>"},"fired_at":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.fired_at","typeLabel":"string\u003cdate-time>"},"kind":{"const":"schedule","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.kind","typeLabel":"string"},"schedule_id":{"description":"Origin-local identifier, bounded to 255 UTF-8 bytes by the server","maxLength":255,"minLength":1,"type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.schedule_id","typeLabel":"string"},"schedule_origin":{"enum":["project","api"],"type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.schedule_origin","typeLabel":"enum\u003cstring>"},"schedule_revision":{"pattern":"^sha256:[0-9a-f]{64}$","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.schedule_revision","typeLabel":"string"},"scheduled_for":{"format":"date-time","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.scheduled_for","typeLabel":"string\u003cdate-time>"},"slot_id":{"pattern":"^[0-9a-f]{64}$","type":"string","isRequired":true,"uniqueKey":"receipt.origin.oneOf.1.slot_id","typeLabel":"string"},"missed_count":{"description":"How many slots that silence holds","minimum":1,"type":"integer","uniqueKey":"receipt.origin.oneOf.1.missed_count","typeLabel":"integer"},"missed_first":{"description":"First slot of the silence a catch-up-once run answers for, on a catch_up firing only; scheduled_for is its last slot","format":"date-time","type":"string","uniqueKey":"receipt.origin.oneOf.1.missed_first","typeLabel":"string\u003cdate-time>"}},"additionalProperties":false,"uniqueKey":"receipt.origin.oneOf.1","typeLabel":"object"}],"uniqueKey":"receipt.origin","typeLabel":"object"}},"required":["job_id","execution_id","trace_id","snapshot_digest"],"type":"object","isRequired":true,"uniqueKey":"receipt","typeLabel":"object"},"truncated":{"type":"boolean","isRequired":true,"uniqueKey":"truncated","typeLabel":"boolean"},"verdict":{"enum":["sealed","anchored"],"type":"string","isRequired":true,"uniqueKey":"verdict","typeLabel":"enum\u003cstring>"}},"required":["receipt","verdict","max_artifact_bytes","truncated","artifacts"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"artifacts":[{"event_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","kind":"file","mime":"\u003cstring>","name":"\u003cstring>","sha256":"\u003cstring>","size":1,"path":"\u003cstring>","task":"\u003cstring>"}],"max_artifact_bytes":268435456,"receipt":{"execution_id":"\u003cstring>","job_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","snapshot_digest":"\u003cstring>","trace_id":"\u003cstring>","chain_head":"\u003cstring>","origin":{"kind":"manual"}},"truncated":true,"verdict":"sealed"}}},"exampleType":"generated"}},"description":"The manifest, bound to the job's receipt","exampleType":"generated"},"b50a62e4-2862-4439-b5a1-f4c149ab6a37":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"Error envelope","exampleType":"generated"},"e5da7503-c575-4c1a-bce6-0321487fe4b2":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"`job_not_found`: unknown or foreign job id","exampleType":"generated"},"2016517f-1d17-4380-beed-743667257f2d":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"Request deadline","exampleType":"generated"},"d09567c0-6b81-4c5e-8c38-1dddcb980da8":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"`job_not_settled`: queued, running or paused · `artifact_journal_unavailable`: no receipt chain head, or no journal by the job's identity · `artifact_journal_unverified`: the journal is not sealed and intact with the receipt's head","exampleType":"generated"},"549c0d76-07e8-44ce-9151-7f78a47e367e":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"`internal_error`: the server could not read the journal","exampleType":"generated"},"86e8ef54-34af-4b1f-bf04-0249b63eba8d":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"type":"object","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"`store_busy`: durable job state unavailable · `artifact_capacity`: every artifact slot is busy","exampleType":"generated"}},"security":{"3bc7d619-e3f3-461f-ba4e-93a626e72764":{"bearerAuth":{"description":"Exactly one Authorization: Bearer value from the token file","scheme":"bearer","type":"http","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"878b58fd-1897-43b5-b844-719a7d9a4bd1":{"url":"http://127.0.0.1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"Exactly one Authorization: Bearer value from the token file","scheme":"bearer","type":"http","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Exactly one Authorization: Bearer value from the token file","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"supernovae-acdf3706","siteName":"Nika","title":"The artifacts a settled job's sealed journal records - Nika","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T11:02:49.130Z","originalFileLocation":"api-reference/the-artifacts-a-settled-jobs-sealed-journal-records.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=\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job\u0026#x27;s receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt\u0026#x27;s chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent\u0026#x27;s harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal\u0026#x27;s; the download route checks the bytes against them. No filesystem path of the server is exposed.\">\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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"The artifacts a settled job\u0026#x27;s sealed journal records - Nika\">\u003cmeta data-mint-head property=\"og:description\" content=\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job\u0026#x27;s receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt\u0026#x27;s chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent\u0026#x27;s harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal\u0026#x27;s; the download route checks the bytes against them. No filesystem path of the server is exposed.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nika\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.nika.sh/images/og-card.png\">\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=\"The artifacts a settled job\u0026#x27;s sealed journal records - Nika\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job\u0026#x27;s receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt\u0026#x27;s chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent\u0026#x27;s harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal\u0026#x27;s; the download route checks the bytes against them. No filesystem path of the server is exposed.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.nika.sh/images/og-card.png\">\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/supernovae-acdf3706/nNpvwcCdepgiS-MX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nika\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2f6bff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.nika.sh/#organization\",\"name\":\"Nika\",\"url\":\"https://docs.nika.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/supernovae-acdf3706/3ObRrFNWymK8fsLG/images/logo-light.svg?fit=max\u0026auto=format\u0026n=3ObRrFNWymK8fsLG\u0026q=85\u0026s=73b2f60862ed01f97cfa045151df991e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.nika.sh#website\",\"name\":\"Nika\",\"url\":\"https://docs.nika.sh\",\"publisher\":{\"@id\":\"https://docs.nika.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records#webpage\",\"url\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records\",\"name\":\"The artifacts a settled job's sealed journal records\",\"description\":\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job's receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt's chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent's harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal's; the download route checks the bytes against them. No filesystem path of the server is exposed.\",\"dateModified\":\"2026-10-28T11:02:49.130Z\",\"isPartOf\":{\"@id\":\"https://docs.nika.sh#website\"},\"breadcrumb\":{\"@id\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Remote API\",\"item\":\"https://docs.nika.sh/sdk/remote/serve-quickstart\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API Reference\",\"item\":\"https://docs.nika.sh/api-reference/public-process-liveness\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"The artifacts a settled job's sealed journal records\",\"item\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records#apireference\",\"headline\":\"The artifacts a settled job's sealed journal records\",\"name\":\"The artifacts a settled job's sealed journal records\",\"description\":\"Answers only for a settled job (succeeded, failed, cancelled, interrupted); an interrupted run never sealed its journal, so its job answers 409 artifact_journal_unavailable. The manifest is read from the journal the job's receipt names, judged by the one verifier nika trace verify runs: the chain must be intact, the seal must verify against a run key that verifier weighs on the server, in the order the server signs (the public half of an explicit NIKA_RUN_KEY_FILE · NIKA_RUN_PUB_FILE pair, ~/.nika/keys/run-signing.pub, the retired-key ledger), and the head must be the receipt's chain_head. Each entry is one journal event that records a written byte stream with its SHA-256: a file a builtin saved (nika:chart, nika:image_generate, nika:tts_generate, nika:image_fx, nika:image_compose) at a relative path inside the project and outside its .nika (refused by name in any ASCII case, and by device and inode under any other spelling the filesystem folds onto it), its last write winning, or an image an agent's harness sent, kept under .nika/blobs. nika:write and nika:edit journal no hash of what they wrote, so their files are not listed. Every size and digest is the journal's; the download route checks the bytes against them. No filesystem path of the server is exposed.\",\"url\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records\",\"mainEntityOfPage\":{\"@id\":\"https://docs.nika.sh/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records#webpage\"},\"image\":\"https://docs.nika.sh/images/og-card.png\",\"dateModified\":\"2026-10-28T11:02:49.130Z\",\"publisher\":{\"@id\":\"https://docs.nika.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.nika.sh#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":null,"tabs":[{"tab":"Guide","icon":"book-open","pages":[{"title":"Guide","href":"/introduction"}]},{"tab":"SDK","icon":"code","groups":[{"group":"Overview","pages":[{"title":"TypeScript SDK","sidebarTitle":"Overview","icon":"code","href":"/sdk/overview"},{"title":"How the SDK works","sidebarTitle":"How it works","icon":"diagram-project","href":"/sdk/how-it-works"}]},{"group":"Start","pages":[{"title":"TypeScript quickstart","sidebarTitle":"Quickstart","icon":"play","href":"/sdk/start/quickstart"},{"title":"Project setup","sidebarTitle":"Project setup","icon":"folder-tree","href":"/sdk/start/project-setup"}]},{"group":"Project","pages":[{"title":"nika.yaml project file","sidebarTitle":"nika.yaml","icon":"file-code","href":"/sdk/project/nika-yaml"},{"title":"CWD and monorepos","sidebarTitle":"CWD and monorepos","icon":"folder-tree","href":"/sdk/project/cwd-and-monorepos"},{"title":"Arm registry","sidebarTitle":"Arm registry","icon":"clock","href":"/sdk/project/arm-registry"},{"title":"Project policy ladders","sidebarTitle":"Policy ladders","icon":"stairs","href":"/sdk/project/policy-ladders"},{"title":"Project runtime state","sidebarTitle":"Runtime state","icon":"database","href":"/sdk/project/runtime-state"}]},{"group":"Local API","pages":[{"title":"Local client","sidebarTitle":"Local client","icon":"terminal","href":"/sdk/local/client"},{"title":"Check before admission","sidebarTitle":"Check","icon":"list-check","href":"/sdk/local/check-and-plan"},{"title":"Run and cancel","sidebarTitle":"Run and cancel","icon":"circle-play","href":"/sdk/local/run-and-cancel"},{"title":"Compile a workflow","sidebarTitle":"Compile","icon":"wand-magic-sparkles","href":"/sdk/local/compile"},{"title":"Test and trace","sidebarTitle":"Test and trace","icon":"vial-circle-check","href":"/sdk/local/test-and-trace"}]},{"group":"Runtime","pages":[{"title":"Results and settlement","sidebarTitle":"Results","icon":"flag-checkered","href":"/sdk/runtime/results"},{"title":"Run events","sidebarTitle":"Run events","icon":"wave-pulse","href":"/sdk/runtime/events"},{"title":"Errors","sidebarTitle":"Errors","icon":"triangle-exclamation","href":"/sdk/runtime/errors"},{"title":"Receipts and verification","sidebarTitle":"Receipts","icon":"link","href":"/sdk/runtime/receipts"},{"title":"Spend caps","sidebarTitle":"Spend caps","icon":"scale-balanced","href":"/sdk/runtime/spend"},{"title":"Permits and admission","sidebarTitle":"Permits","icon":"shield-halved","href":"/sdk/runtime/permits"}]},{"group":"Remote API","pages":[{"title":"Server quickstart","sidebarTitle":"Server quickstart","icon":"server","href":"/sdk/remote/serve-quickstart"},{"title":"Remote client","sidebarTitle":"Remote client","icon":"satellite-dish","href":"/sdk/remote/client"},{"title":"Remote jobs","sidebarTitle":"Jobs","icon":"list-check","href":"/sdk/remote/jobs"},{"title":"SSE streaming","sidebarTitle":"SSE streaming","icon":"wave-pulse","href":"/sdk/remote/streaming"},{"title":"Schedules","sidebarTitle":"Schedules","icon":"calendar","href":"/sdk/remote/schedules"},{"title":"Outputs and artifacts","sidebarTitle":"Outputs and artifacts","icon":"box-archive","href":"/sdk/remote/artifacts"},{"title":"Workflow registry","sidebarTitle":"Workflow registry","icon":"folder-open","href":"/sdk/remote/workflows"},{"title":"Application webhooks","sidebarTitle":"Application webhooks","icon":"webhook","href":"/sdk/remote/webhooks"},{"group":"API Reference","pages":[{"title":"Public process liveness","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /health","href":"/api-reference/public-process-liveness"},{"title":"Judge a workflow without creating a job — by served name, or as immutable snapshot bytes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/check","href":"/api-reference/judge-a-workflow-without-creating-a-job-—-by-served-name-or-as-immutable-snapshot-bytes"},{"title":"Author a candidate workflow without running it (stateless · source-only)","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/compile","href":"/api-reference/author-a-candidate-workflow-without-running-it-stateless-·-source-only"},{"title":"Admit a workflow as a durable job — by served name, or as immutable snapshot bytes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/jobs","href":"/api-reference/admit-a-workflow-as-a-durable-job-—-by-served-name-or-as-immutable-snapshot-bytes"},{"title":"Job identity and status","description":null,"deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}","href":"/api-reference/job-identity-and-status"},{"title":"The artifacts a settled job's sealed journal records","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/artifacts","href":"/api-reference/the-artifacts-a-settled-jobs-sealed-journal-records"},{"title":"Stream one artifact's bytes, verified against its journaled SHA-256","description":"`{name}` is an entry's `name` from GET /v1/jobs/{id}/artifacts, never a filesystem path. Every name contains `/` (`file/out/report.pdf`, `agent_image/1.png`): send it with its `/` literal or percent-encoded (`%2F`), as one path parameter. The rest of the path is percent-decoded once and matched exactly against the manifest's names; an escape that is not two hexadecimal digits, bytes that are not UTF-8 or NUL match no entry. The server opens the recorded place below the project root it holds, refusing a symbolic link at any component, and reads every byte against the recorded size and SHA-256 before the response starts (409 `artifact_changed` on a mismatch), keeping the SHA-256 of each 256 KiB chunk. While the bytes stream, each chunk is read again and sent only if it hashes to the digest kept for it: every byte that leaves is a byte of the recorded file, and a file changed during the stream ends it before its `Content-Length`. A stream also ends short when the server stops or cannot read the file: retry a short body, and a file that really changed then answers 409 `artifact_changed`. The bound is `max_artifact_bytes`; a larger artifact stays listed and is refused 403. At most 4 journal verifications and pre-download hash passes run at once (`artifact_capacity` otherwise); a stream holds no slot once its bytes start, is bounded by the connection limit, and is not bounded by the request deadline.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/artifacts/{name}","href":"/api-reference/stream-one-artifacts-bytes-verified-against-its-journaled-sha-256"},{"title":"Request cancellation or replay an ended observation","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/jobs/{id}/cancel","href":"/api-reference/request-cancellation-or-replay-an-ended-observation"},{"title":"Job event SSE","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/events","href":"/api-reference/job-event-sse"},{"title":"Status only; diagnosis lives on GET /v1/jobs/{id} and SSE","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/status","href":"/api-reference/status-only;-diagnosis-lives-on-get-v1jobs-and-sse"},{"title":"Verify the job's trace journal","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/jobs/{id}/trace/verify","href":"/api-reference/verify-the-jobs-trace-journal"},{"title":"This document","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/openapi.json","href":"/api-reference/this-document"},{"title":"Read one declarative resident schedule","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/schedules/{id}","href":"/api-reference/read-one-declarative-resident-schedule"},{"title":"Create or revision-conditionally update one resident schedule","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json put /v1/schedules/{id}","href":"/api-reference/create-or-revision-conditionally-update-one-resident-schedule"},{"title":"Contained workflow names","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/workflows","href":"/api-reference/contained-workflow-names"},{"title":"Workflow metadata without source bytes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/workflows/{name}","href":"/api-reference/workflow-metadata-without-source-bytes"}]}]},{"group":"Operations","pages":[{"title":"CI gate","sidebarTitle":"CI gate","icon":"shield-check","href":"/sdk/operations/ci"},{"title":"Server surfaces","sidebarTitle":"Server surfaces","icon":"server","href":"/sdk/operations/server-surfaces"},{"title":"Resident server","sidebarTitle":"Resident server","icon":"server","href":"/sdk/operations/resident-server"},{"title":"Server runbook","sidebarTitle":"Server runbook","icon":"clipboard-check","href":"/sdk/operations/server-runbook"},{"title":"OS scheduler bridge","sidebarTitle":"OS schedulers","icon":"calendar","href":"/sdk/operations/os-schedulers"},{"title":"Deployment topologies","sidebarTitle":"Deployment topologies","icon":"sitemap","href":"/sdk/operations/deployment-topologies"},{"title":"Security boundary","sidebarTitle":"Security boundary","icon":"shield","href":"/sdk/operations/security"}]},{"group":"Reference","pages":[{"title":"SDK configuration","sidebarTitle":"Configuration","icon":"sliders","href":"/sdk/reference/configuration"},{"title":"SDK method index","sidebarTitle":"Method index","icon":"list","href":"/sdk/reference/methods"},{"title":"SDK type index","sidebarTitle":"Type index","icon":"brackets-curly","href":"/sdk/reference/types"}]}]},{"tab":"Examples","icon":"rocket","pages":[{"title":"Examples","href":"/examples/overview"}]},{"tab":"Architecture","icon":"layer-group","pages":[{"title":"Architecture","href":"/architecture/layers"}]},{"tab":"Reference","icon":"code","pages":[{"title":"Reference","href":"/reference/yaml-syntax"}]},{"tab":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog/releases"}]}]},"basePath":"","title":"The artifacts a settled job's sealed journal records - Nika","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["10e4515597","c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["BannerMarkdown-DIeMibn4.js","dist-DJnKvr0g.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-B2v50t8t.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","Page-Buji1S4J.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","AssistantPageLink-BHrrjR1K.js"]}