Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately.
First request
Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = "Authorization: Bearer <token>"; replace the placeholder privately. Run from your repository root:
For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data.
On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM.
Upload rules
Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format.
Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored.
Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile.
Choose an output
format
Response Content-Type
Contents
cyclonedx (default)
application/vnd.cyclonedx+json
CycloneDX 1.7 JSON
spdx
text/spdx
SPDX 2.3 tag-value, not JSON
text
text/plain
Human-readable inventory report, not a standard SBOM serialization
All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example’s query to ?format=spdx or ?format=text, or add --form 'format=spdx'; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported.
Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields.
Interpret the inventory
One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result.
In CycloneDX, find the document-level property named githits:completeness by name rather than array position:
Value
Meaning
resolved_manifest_inventory
Inventory from manifest dependency resolution
partial_manifest_inventory
Resolution is incomplete; the component list can be empty
recorded_lockfile_inventory
Inventory recorded in uploaded lockfiles
mixed_dependency_inventory
Lockfile records plus separately resolved manifests
None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value.
Analysis admission and cost
Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present.
At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation.
Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission.
Handle errors and retries
Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples.
Status / code
Caller action
400 VALIDATION_ERROR
Correct multipart fields, filenames or format values before retrying.
Resolve credential access, account eligibility or terms acceptance.
408 UPLOAD_TIMEOUT
Ensure the upload can finish within 30 seconds.
413 INPUT_TOO_LARGE
Reduce file count, path length or bytes to the documented limits.
415 UNSUPPORTED_MEDIA_TYPE
Send multipart/form-data with a valid boundary.
422 UNUSABLE_MANIFEST
Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected.
422 NO_MANIFEST_EVIDENCE
Supply a manifest with named package evidence or a supported lockfile.
422 UNREPRESENTABLE_SPDX
Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent.
422 SBOM_OUTPUT_TOO_LARGE
Reduce the requested inventory; the generated document exceeded an output limit.
A service failure prevented generation; retry later if appropriate.
504 TIMEOUT
Generation exceeded a service deadline; a retry may repeat work.
Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.
Optional caller-defined session ID: one to 64 ASCII letters, digits, underscores or hyphens, preserved exactly. Supply the header at most once. Invalid supplied IDs return 400 INVALID_SESSION_ID; no session is created.
Output format; a multipart format field overrides this value. No Accept negotiation. Duplicate values and unknown query fields are rejected.
cyclonedx returns CycloneDX 1.7 JSON (application/vnd.cyclonedx+json); spdx returns SPDX 2.3 tag-value (text/spdx); text returns a human-readable report (text/plain). All outputs use UTF-8. Accept does not select the successful output format.
Available options:
cyclonedx,
spdx,
text
Body
multipart/form-data
Send a multipart upload. The complete request, including multipart headers and boundaries, must fit within 8,000,000 bytes.
Repeat the literal field name files[] once per file, with raw UTF-8 file contents rather than base64. Set each part's filename to the file's path relative to a common repository root, for example app/package.json and app/package-lock.json. Preserve directory structure so manifests can be associated with their lockfiles.
Send 1–256 files, each at most 5,242,880 bytes. Each filename must be at most 1,024 UTF-8 bytes and must be relative, with no empty, dot (.) or parent (..) path segments, backslashes or control characters. Every file must be a supported, readable manifest or lockfile; one unusable file rejects the entire upload.
Select the response format. This value overrides the query parameter; omit both to receive CycloneDX JSON.
Available options:
cyclonedx,
spdx,
text
Response
Complete UTF-8 document, at most 16,777,216 bytes. Inventory and license evidence may be partial; save this response because no retrieval URL is created.
Extensible CycloneDX 1.7 document. This schema describes a compatible subset, not the entire standard. Additional fields are allowed at every object level; clients must preserve or ignore unfamiliar data. Inventory and license completeness must be read from evidence, not inferred from this schema.
Named project roots and dependency entries. Unresolved declarations remain in document properties rather than becoming package components. The array may be empty when no concrete packages or named roots are available. Separate lockfile occurrences may have the same name and version; do not deduplicate by those fields alone.
Document evidence. githits:completeness distinguishes resolved_manifest_inventory, partial_manifest_inventory, recorded_lockfile_inventory and mixed_dependency_inventory; none guarantees that every license is known. githits:resolution_basis distinguishes manifest_resolution, lockfile_records and lockfile_records_and_manifest_resolution. Inspect githits:resolutions for per-manifest outcomes, githits:declarations for original requirements, and githits:lockfiles and githits:manifest_associations for lockfile coverage. githits:notice summarizes limitations.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"GitHits","colors":{"primary":"#c03b83","light":"#e15b9f","dark":"#e15b9f"},"logo":{"light":"https://mintcdn.com/githits/nEuGn8_ZROo1DncD/images/githits-wordmark.svg?fit=max\u0026auto=format\u0026n=nEuGn8_ZROo1DncD\u0026q=85\u0026s=33b1a4083b1476ad8520731d35d55987","dark":"https://mintcdn.com/githits/nEuGn8_ZROo1DncD/images/githits-wordmark.svg?fit=max\u0026auto=format\u0026n=nEuGn8_ZROo1DncD\u0026q=85\u0026s=33b1a4083b1476ad8520731d35d55987","href":"/"},"favicon":"https://mintcdn.com/githits/Hm40jjPoMZp3cAjh/images/githits-favicon.svg?fit=max\u0026auto=format\u0026n=Hm40jjPoMZp3cAjh\u0026q=85\u0026s=701b144dbf93beea1351b26de5f854f1","api":{"playground":{"proxy":false,"credentials":false}},"appearance":{"default":"dark"},"background":{"color":{"light":"#ffffff","dark":"#13161a"}},"navbar":{"primary":{"type":"github","href":"https://github.com/githits-com/githits-cli"}},"fonts":{"family":"Inter"},"icons":{"library":"lucide"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"githits","hasAudioNarration":false,"actualSubdomain":"githits","customDomains":["docs.githits.com"],"gitSource":{"type":"github","owner":"githits-com","repo":"docs","deployBranch":"main","isPrivate":true,"contentDirectory":"","mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae2ed011a9143a8261c5d93","collectionId":"dbe1e113-c480-4ab9-ac3a-8f704739c29d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae2ed011a9143a8261c5d93"},"feedback":{"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae2ed28ce12460418e3d6ed","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"API","count":29},{"language":"default","tag":"Documentation","count":22},{"language":"default","tag":"v1 reference","count":22},{"language":"default","tag":"Tools","count":8},{"language":"default","tag":"Experimental","count":8},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"Get Started","count":6},{"language":"default","tag":"Packages","count":5},{"language":"default","tag":"Reference","count":4},{"language":"default","tag":"Guides","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--githits-primary-soft:#ffb8de;--githits-primary-light:#ff72be;--githits-primary:#ff4fae;--githits-primary-strong:#cc3f8b;--githits-primary-deep:#651f45;--githits-secondary-soft:#fde3d0;--githits-secondary-light:#faac72;--githits-secondary:#ff872f;--githits-secondary-strong:#ba6c33;--githits-secondary-deep:#3e2411;--githits-neutral-white:#ffffff;--githits-neutral-100:#d5d9df;--githits-neutral-200:#abb2bf;--githits-body-dark:#c4cad3;--githits-neutral-300:#7d838d;--githits-neutral-400:#4a4e56;--githits-neutral-500:#21262d;--githits-neutral-600:#13161a;--githits-light-background:var(--githits-neutral-white);--githits-light-surface:var(--githits-neutral-100);--githits-light-panel:var(--githits-neutral-white);--githits-light-border:var(--githits-neutral-200);--githits-dark-background:var(--githits-neutral-600);--githits-dark-surface:var(--githits-neutral-500);--githits-dark-border:var(--githits-neutral-400);--githits-feature-panel-light:linear-gradient(\n 135deg,\n color-mix(in srgb, var(--githits-secondary-soft) 58%, var(--githits-neutral-white)),\n color-mix(in srgb, var(--githits-primary-soft) 54%, var(--githits-neutral-white))\n );--githits-feature-panel-dark:color-mix(in srgb, var(--githits-neutral-600) 78%, var(--githits-neutral-500))}html{letter-spacing:0}code,pre{font-family:Consolas,\"SF Mono\",Menlo,Monaco,monospace}#navbar{border-bottom-color:color-mix(in srgb,var(--githits-primary) 18%,transparent);font-size-adjust:.545}#navbar a[href=\"/\"]:has(img[src*=githits-wordmark]){box-sizing:border-box;display:inline-flex;flex:0 0 9.5rem;width:9.5rem;min-width:9.5rem;align-items:center;gap:.5rem}#navbar a[href=\"/\"]:has(img[src*=githits-wordmark])::after{content:\"Beta\";display:inline-flex;align-items:center;justify-content:center;min-height:1.5rem;padding:.25rem .5rem;border:1px solid #992f68;border-radius:.25rem;color:var(--githits-primary-light);font-family:Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;font-size:.625rem;font-weight:600;line-height:1rem;text-transform:uppercase;white-space:nowrap}#navbar a[href=\"/\"] img[src*=githits-wordmark]{width:6.5rem!important;height:1.516rem!important;aspect-ratio:554/129.3;object-fit:contain;vertical-align:middle}@container navbar (max-width: 48rem){#navbar nav[aria-label=Main]{flex-shrink:0}#navbar nav[aria-label=Main] a{padding-inline:.25rem}}.githits-command-toolbar{display:flex;justify-content:flex-end;margin:1.5rem 0 -.25rem}.githits-command-toggle{display:inline-flex;align-items:center;gap:.625rem;min-height:2.5rem;padding:.5rem .875rem;border:1px solid color-mix(in srgb,var(--githits-neutral-300) 38%,transparent);border-radius:8px;background:color-mix(in srgb,var(--githits-neutral-white) 86%,transparent);color:var(--githits-neutral-500);font-size:.875rem;font-weight:600;line-height:1;cursor:pointer}.githits-command-toggle::after{content:\"\";width:.5rem;height:.5rem;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform 160ms ease}.githits-command-toggle[aria-expanded=true]::after{transform:rotate(225deg)}.githits-command-toggle:focus-visible,.githits-command-toggle:hover{border-color:var(--githits-primary);color:var(--githits-primary-deep)}html[data-current-path=\"/cli/commands\"] #content [data-component-part=accordion-title-container]{display:flex;flex-direction:column;gap:.25rem;line-height:1.35}html[data-current-path=\"/cli/commands\"] #content [data-component-part=accordion-description]{color:var(--githits-neutral-400);line-height:1.45}#content.mdx-content [data-as=p],#content.mdx-content [data-component-part=card-content],#content.mdx-content [data-component-part=card-content] *,#content.mdx-content>span{color:var(--githits-neutral-400)}.githits-beta-note{display:inline-flex;align-items:center;max-width:100%;margin:.75rem 0 1.5rem;padding:.5rem .75rem;border:1px solid color-mix(in srgb,var(--githits-primary) 34%,transparent);border-radius:8px;background:color-mix(in srgb,var(--githits-primary) 9%,transparent);color:var(--githits-neutral-500);font-size:.875rem;font-weight:500;line-height:1.5}:not(pre)>code{background:var(--githits-neutral-100);color:var(--githits-primary-deep)}[data-theme=dark],[data-theme=dark] .githits-feature-grid p,body.dark,body.dark .githits-feature-grid p,body[class~=dark],body[class~=dark] .githits-feature-grid p,html.dark,html.dark .githits-feature-grid p,html[class~=dark],html[class~=dark] .githits-feature-grid p{color:var(--githits-neutral-100)}[data-theme=dark] h1,[data-theme=dark] h2,[data-theme=dark] h3,[data-theme=dark] h4,[data-theme=dark] h5,[data-theme=dark] h6,[data-theme=dark] strong,body.dark h1,body.dark h2,body.dark h3,body.dark h4,body.dark h5,body.dark h6,body.dark strong,body[class~=dark] h1,body[class~=dark] h2,body[class~=dark] h3,body[class~=dark] h4,body[class~=dark] h5,body[class~=dark] h6,body[class~=dark] strong,html.dark h1,html.dark h2,html.dark h3,html.dark h4,html.dark h5,html.dark h6,html.dark strong,html[class~=dark] h1,html[class~=dark] h2,html[class~=dark] h3,html[class~=dark] h4,html[class~=dark] h5,html[class~=dark] h6,html[class~=dark] strong{color:var(--githits-neutral-white)}[data-theme=dark] #content.mdx-content [data-as=p],[data-theme=dark] #content.mdx-content [data-component-part=card-content],[data-theme=dark] #content.mdx-content [data-component-part=card-content] *,[data-theme=dark] #content.mdx-content>span,[data-theme=dark] blockquote,[data-theme=dark] li,[data-theme=dark] p,[data-theme=dark] td,body.dark #content.mdx-content [data-as=p],body.dark #content.mdx-content [data-component-part=card-content],body.dark #content.mdx-content [data-component-part=card-content] *,body.dark #content.mdx-content>span,body.dark blockquote,body.dark li,body.dark p,body.dark td,body[class~=dark] #content.mdx-content [data-as=p],body[class~=dark] #content.mdx-content [data-component-part=card-content],body[class~=dark] #content.mdx-content [data-component-part=card-content] *,body[class~=dark] #content.mdx-content>span,body[class~=dark] blockquote,body[class~=dark] li,body[class~=dark] p,body[class~=dark] td,html.dark #content.mdx-content [data-as=p],html.dark #content.mdx-content [data-component-part=card-content],html.dark #content.mdx-content [data-component-part=card-content] *,html.dark #content.mdx-content>span,html.dark blockquote,html.dark li,html.dark p,html.dark td,html[class~=dark] #content.mdx-content [data-as=p],html[class~=dark] #content.mdx-content [data-component-part=card-content],html[class~=dark] #content.mdx-content [data-component-part=card-content] *,html[class~=dark] #content.mdx-content>span,html[class~=dark] blockquote,html[class~=dark] li,html[class~=dark] p,html[class~=dark] td{color:var(--githits-body-dark)}[data-theme=dark] :not(pre)>code,body.dark :not(pre)>code,body[class~=dark] :not(pre)>code,html.dark :not(pre)>code,html[class~=dark] :not(pre)>code{background:var(--githits-neutral-500);color:var(--githits-primary-soft)}[data-theme=dark] pre,body.dark pre,body[class~=dark] pre,html.dark pre,html[class~=dark] pre{background:var(--githits-neutral-600);border-color:var(--githits-neutral-400)}pre code{background:0 0!important}.githits-feature-grid{container-type:inline-size;container-name:githits-features;margin-top:1.25rem}.githits-feature-grid .githits-tool-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,12.5rem),1fr));gap:1rem}.githits-feature-grid>[role=link],.githits-feature-grid>a{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:center;margin-bottom:1rem}.githits-feature-grid [role=link],.githits-feature-grid a{background:0 0!important;border:1px solid transparent!important;border-color:transparent!important;box-shadow:none!important;color:var(--githits-neutral-600);outline:0!important}.githits-feature-grid [role=link]::after,.githits-feature-grid [role=link]::before,.githits-feature-grid a::after,.githits-feature-grid a::before{border:0!important;box-shadow:none!important;outline:0!important}.githits-feature-grid [role=link]:focus,.githits-feature-grid [role=link]:focus-visible,.githits-feature-grid [role=link]:hover,.githits-feature-grid a:focus,.githits-feature-grid a:focus-visible,.githits-feature-grid a:hover{background:0 0!important;border:1px solid var(--githits-primary)!important;box-shadow:none!important;outline:0!important}[data-theme=dark] .githits-feature-grid [role=link]:focus,[data-theme=dark] .githits-feature-grid [role=link]:focus-visible,[data-theme=dark] .githits-feature-grid [role=link]:hover,[data-theme=dark] .githits-feature-grid a:focus,[data-theme=dark] .githits-feature-grid a:focus-visible,[data-theme=dark] .githits-feature-grid a:hover,body.dark .githits-feature-grid [role=link]:focus,body.dark .githits-feature-grid [role=link]:focus-visible,body.dark .githits-feature-grid [role=link]:hover,body.dark .githits-feature-grid a:focus,body.dark .githits-feature-grid a:focus-visible,body.dark .githits-feature-grid a:hover,body[class~=dark] .githits-feature-grid [role=link]:focus,body[class~=dark] .githits-feature-grid [role=link]:focus-visible,body[class~=dark] .githits-feature-grid [role=link]:hover,body[class~=dark] .githits-feature-grid a:focus,body[class~=dark] .githits-feature-grid a:focus-visible,body[class~=dark] .githits-feature-grid a:hover,html.dark .githits-feature-grid [role=link]:focus,html.dark .githits-feature-grid [role=link]:focus-visible,html.dark .githits-feature-grid [role=link]:hover,html.dark .githits-feature-grid a:focus,html.dark .githits-feature-grid a:focus-visible,html.dark .githits-feature-grid a:hover,html[class~=dark] .githits-feature-grid [role=link]:focus,html[class~=dark] .githits-feature-grid [role=link]:focus-visible,html[class~=dark] .githits-feature-grid [role=link]:hover,html[class~=dark] .githits-feature-grid a:focus,html[class~=dark] .githits-feature-grid a:focus-visible,html[class~=dark] .githits-feature-grid a:hover{border-color:var(--githits-primary-light)!important}.githits-feature-grid [role=link] :not(img),.githits-feature-grid a :not(img){border-color:transparent!important;box-shadow:none!important;outline:0!important}.githits-feature-grid img{aspect-ratio:16/9;box-sizing:border-box;object-fit:contain;padding:.375rem;background:var(--githits-feature-panel-light);border:0!important;border-radius:8px}.githits-feature-grid>[role=link] img,.githits-feature-grid>a img{max-height:17rem}.githits-feature-grid h2,.githits-feature-grid h3,.githits-feature-grid h4,.githits-feature-grid strong{color:var(--githits-neutral-600)}.githits-feature-grid [data-component-part=card-content],.githits-feature-grid [data-component-part=card-content] *,.githits-feature-grid p{color:var(--githits-neutral-400)}[data-theme=dark] .githits-feature-grid [role=link],[data-theme=dark] .githits-feature-grid a,[data-theme=dark] .githits-feature-grid h2,[data-theme=dark] .githits-feature-grid h3,[data-theme=dark] .githits-feature-grid h4,[data-theme=dark] .githits-feature-grid strong,body.dark .githits-feature-grid [role=link],body.dark .githits-feature-grid a,body.dark .githits-feature-grid h2,body.dark .githits-feature-grid h3,body.dark .githits-feature-grid h4,body.dark .githits-feature-grid strong,body[class~=dark] .githits-feature-grid [role=link],body[class~=dark] .githits-feature-grid a,body[class~=dark] .githits-feature-grid h2,body[class~=dark] .githits-feature-grid h3,body[class~=dark] .githits-feature-grid h4,body[class~=dark] .githits-feature-grid strong,html.dark .githits-feature-grid [role=link],html.dark .githits-feature-grid a,html.dark .githits-feature-grid h2,html.dark .githits-feature-grid h3,html.dark .githits-feature-grid h4,html.dark .githits-feature-grid strong,html[class~=dark] .githits-feature-grid [role=link],html[class~=dark] .githits-feature-grid a,html[class~=dark] .githits-feature-grid h2,html[class~=dark] .githits-feature-grid h3,html[class~=dark] .githits-feature-grid h4,html[class~=dark] .githits-feature-grid strong{color:var(--githits-neutral-white)}[data-theme=dark] .githits-feature-grid img,body.dark .githits-feature-grid img,body[class~=dark] .githits-feature-grid img,html.dark .githits-feature-grid img,html[class~=dark] .githits-feature-grid img{background:var(--githits-feature-panel-dark);border:0!important}[data-theme=dark] .githits-beta-note,body.dark .githits-beta-note,body[class~=dark] .githits-beta-note,html.dark .githits-beta-note,html[class~=dark] .githits-beta-note{background:color-mix(in srgb,var(--githits-primary) 16%,transparent);border-color:color-mix(in srgb,var(--githits-primary-light) 42%,transparent);color:var(--githits-neutral-100)}[data-theme=dark] .githits-command-toggle,body.dark .githits-command-toggle,body[class~=dark] .githits-command-toggle,html.dark .githits-command-toggle,html[class~=dark] .githits-command-toggle{background:color-mix(in srgb,var(--githits-neutral-500) 72%,transparent);border-color:var(--githits-neutral-400);color:var(--githits-neutral-100)}[data-theme=dark] .githits-command-toggle:focus-visible,[data-theme=dark] .githits-command-toggle:hover,body.dark .githits-command-toggle:focus-visible,body.dark .githits-command-toggle:hover,body[class~=dark] .githits-command-toggle:focus-visible,body[class~=dark] .githits-command-toggle:hover,html.dark .githits-command-toggle:focus-visible,html.dark .githits-command-toggle:hover,html[class~=dark] .githits-command-toggle:focus-visible,html[class~=dark] .githits-command-toggle:hover{border-color:var(--githits-primary-light);color:var(--githits-primary-soft)}[data-theme=dark][data-current-path=\"/cli/commands\"] #content [data-component-part=accordion-description],html.dark[data-current-path=\"/cli/commands\"] #content [data-component-part=accordion-description],html[class~=dark][data-current-path=\"/cli/commands\"] #content [data-component-part=accordion-description],html[data-current-path=\"/cli/commands\"] [data-theme=dark] #content [data-component-part=accordion-description],html[data-current-path=\"/cli/commands\"] body.dark #content [data-component-part=accordion-description],html[data-current-path=\"/cli/commands\"] body[class~=dark] #content [data-component-part=accordion-description]{color:var(--githits-neutral-200)}[data-theme=dark] .githits-feature-grid [data-component-part=card-content],[data-theme=dark] .githits-feature-grid [data-component-part=card-content] *,body.dark .githits-feature-grid [data-component-part=card-content],body.dark .githits-feature-grid [data-component-part=card-content] *,body[class~=dark] .githits-feature-grid [data-component-part=card-content],body[class~=dark] .githits-feature-grid [data-component-part=card-content] *,html.dark .githits-feature-grid [data-component-part=card-content],html.dark .githits-feature-grid [data-component-part=card-content] *,html[class~=dark] .githits-feature-grid [data-component-part=card-content],html[class~=dark] .githits-feature-grid [data-component-part=card-content] *{color:var(--githits-neutral-100)}@container githits-features (max-width: 32rem){.githits-feature-grid>[role=link],.githits-feature-grid>a{display:block}}"}],"page":{"pagePath":"api-reference/v1/experimental/generate-an-sbom-from-uploaded-files","slug":"/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files","pageMetadata":{"title":"Generate an SBOM from uploaded files","description":"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In the example, `private-auth.conf` is a caller-owned protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately. Run from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@Cargo.toml;filename=Cargo.toml' \\\n --form 'files[]=@Cargo.lock;filename=Cargo.lock' \\\n --output bom.cdx.json \\\n 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx'\n```\n\nFor npm, replace the two files with `package.json` and `package-lock.json`. For a nested project, use both the actual local path and the repository-relative filename, for example `files[]=@app/package.json;filename=app/package.json`. Repeat `files[]` for each file. Let curl set `Content-Type` and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data.\n\nOn success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM.\n\n**Upload rules**\n\nSend repeated `files[]` parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example `app/package.json` and `app/package-lock.json`. Only `files[]` and optional `format` are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format.\n\nSupported manifest examples include `Cargo.toml`, `package.json`, `pyproject.toml`, `Pipfile`, `go.mod`, `mix.exs` and `rebar.config`. This list is non-exhaustive; support depends on the contents, not just the filename. `go.sum` and `requirements.txt` are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 `UNUSABLE_MANIFEST`; companion files are not silently ignored.\n\nSupported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile.\n\n**Choose an output**\n\n| `format` | Response `Content-Type` | Contents |\n| --- | --- | --- |\n| `cyclonedx` (default) | `application/vnd.cyclonedx+json` | CycloneDX 1.7 JSON |\n| `spdx` | `text/spdx` | SPDX 2.3 tag-value, not JSON |\n| `text` | `text/plain` | Human-readable inventory report, not a standard SBOM serialization |\n\nAll outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example's query to `?format=spdx` or `?format=text`, or add `--form 'format=spdx'`; the multipart value wins. `Accept` does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No `fields` selector is supported.\n\nStandard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields.\n\n**Interpret the inventory**\n\nOne unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result.\n\nIn CycloneDX, find the document-level property named `githits:completeness` by name rather than array position:\n\n| Value | Meaning |\n| --- | --- |\n| `resolved_manifest_inventory` | Inventory from manifest dependency resolution |\n| `partial_manifest_inventory` | Resolution is incomplete; the component list can be empty |\n| `recorded_lockfile_inventory` | Inventory recorded in uploaded lockfiles |\n| `mixed_dependency_inventory` | Lockfile records plus separately resolved manifests |\n\nNone guarantees an exact installed inventory or complete license coverage. Inspect `githits:resolutions` and `githits:manifest_associations` for per-manifest evidence. Structured `githits:` property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain `bom-ref` for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value.\n\n**Analysis admission and cost**\n\nSynchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 `RATE_LIMITED` and respect `Retry-After` when present.\n\nAt current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (`githits.cost=1`) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation.\n\nGateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission.\n\n**Handle errors and retries**\n\nErrors use `application/problem+json` in every output format. Branch on `code`, not `detail`, and retain `X-Request-ID` for support. The response definitions below provide problem schemas and examples.\n\n| Status / code | Caller action |\n| --- | --- |\n| 400 `VALIDATION_ERROR` | Correct multipart fields, filenames or format values before retrying. |\n| 401 `AUTHENTICATION_REQUIRED` | Supply a valid Bearer credential. |\n| 403 `FORBIDDEN`, `ACCOUNT_INACTIVE`, `TERMS_ACCEPTANCE_REQUIRED` | Resolve credential access, account eligibility or terms acceptance. |\n| 408 `UPLOAD_TIMEOUT` | Ensure the upload can finish within 30 seconds. |\n| 413 `INPUT_TOO_LARGE` | Reduce file count, path length or bytes to the documented limits. |\n| 415 `UNSUPPORTED_MEDIA_TYPE` | Send multipart/form-data with a valid boundary. |\n| 422 `UNUSABLE_MANIFEST` | Inspect `files`: each entry identifies the original `path` and `status` (`unsupported`, `invalid_utf8` or `unparsed`). Correct or remove those inputs; the entire upload was rejected. |\n| 422 `NO_MANIFEST_EVIDENCE` | Supply a manifest with named package evidence or a supported lockfile. |\n| 422 `UNREPRESENTABLE_SPDX` | Request `cyclonedx` to preserve names or versions that SPDX tag-value cannot represent. |\n| 422 `SBOM_OUTPUT_TOO_LARGE` | Reduce the requested inventory; the generated document exceeded an output limit. |\n| 429 `RATE_LIMITED` | Respect `Retry-After` when present. |\n| 502 `UPSTREAM_ERROR`, 503 `SBOM_UNAVAILABLE` / `UPSTREAM_UNAVAILABLE` | A service failure prevented generation; retry later if appropriate. |\n| 504 `TIMEOUT` | Generation exceeded a service deadline; a retry may repeat work. |\n\nUploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/sbom","href":"/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n pre: \"pre\",\n span: \"span\",\n strong: \"strong\",\n table: \"table\",\n tbody: \"tbody\",\n td: \"td\",\n th: \"th\",\n thead: \"thead\",\n tr: \"tr\",\n ..._provideComponents(),\n ...props.components\n }, {CodeBlock} = _components;\n if (!CodeBlock) _missingMdxReference(\"CodeBlock\", true);\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"First request\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, \", _jsx(_components.code, {\n children: \"private-auth.conf\"\n }), \" is a caller-owned protected curl configuration containing \", _jsx(_components.code, {\n children: \"header = \\\"Authorization: Bearer \u003ctoken>\\\"\"\n }), \"; replace the placeholder privately. Run from your repository root:\"]\n }), \"\\n\", _jsx(CodeBlock, {\n numberOfLines: \"6\",\n language: \"shellscript\",\n children: _jsx(_components.pre, {\n className: \"shiki shiki-themes github-light-default dark-plus\",\n style: {\n backgroundColor: \"#ffffff\",\n \"--shiki-dark-bg\": \"#0B0C0E\",\n color: \"#1f2328\",\n \"--shiki-dark\": \"#D4D4D4\"\n },\n language: \"shellscript\",\n children: _jsxs(_components.code, {\n language: \"shellscript\",\n numberOfLines: \"6\",\n children: [_jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#953800\",\n \"--shiki-dark\": \"#DCDCAA\"\n },\n children: \"curl\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --config\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" /path/to/private-auth.conf\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \" \\\\\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --fail-with-body\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --silent\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --show-error\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \" \\\\\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --form\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" 'files[]=@Cargo.toml;filename=Cargo.toml'\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \" \\\\\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --form\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" 'files[]=@Cargo.lock;filename=Cargo.lock'\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \" \\\\\"\n })]\n }), \"\\n\", _jsxs(_components.span, {\n className: \"line\",\n children: [_jsx(_components.span, {\n style: {\n color: \"#0550AE\",\n \"--shiki-dark\": \"#569CD6\"\n },\n children: \" --output\"\n }), _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" bom.cdx.json\"\n }), _jsx(_components.span, {\n style: {\n color: \"#CF222E\",\n \"--shiki-dark\": \"#D7BA7D\"\n },\n children: \" \\\\\"\n })]\n }), \"\\n\", _jsx(_components.span, {\n className: \"line\",\n children: _jsx(_components.span, {\n style: {\n color: \"#0A3069\",\n \"--shiki-dark\": \"#CE9178\"\n },\n children: \" 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx'\"\n })\n }), \"\\n\"]\n })\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"For npm, replace the two files with \", _jsx(_components.code, {\n children: \"package.json\"\n }), \" and \", _jsx(_components.code, {\n children: \"package-lock.json\"\n }), \". For a nested project, use both the actual local path and the repository-relative filename, for example \", _jsx(_components.code, {\n children: \"files[]=@app/package.json;filename=app/package.json\"\n }), \". Repeat \", _jsx(_components.code, {\n children: \"files[]\"\n }), \" for each file. Let curl set \", _jsx(_components.code, {\n children: \"Content-Type\"\n }), \" and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Upload rules\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send repeated \", _jsx(_components.code, {\n children: \"files[]\"\n }), \" parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example \", _jsx(_components.code, {\n children: \"app/package.json\"\n }), \" and \", _jsx(_components.code, {\n children: \"app/package-lock.json\"\n }), \". Only \", _jsx(_components.code, {\n children: \"files[]\"\n }), \" and optional \", _jsx(_components.code, {\n children: \"format\"\n }), \" are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported manifest examples include \", _jsx(_components.code, {\n children: \"Cargo.toml\"\n }), \", \", _jsx(_components.code, {\n children: \"package.json\"\n }), \", \", _jsx(_components.code, {\n children: \"pyproject.toml\"\n }), \", \", _jsx(_components.code, {\n children: \"Pipfile\"\n }), \", \", _jsx(_components.code, {\n children: \"go.mod\"\n }), \", \", _jsx(_components.code, {\n children: \"mix.exs\"\n }), \" and \", _jsx(_components.code, {\n children: \"rebar.config\"\n }), \". This list is non-exhaustive; support depends on the contents, not just the filename. \", _jsx(_components.code, {\n children: \"go.sum\"\n }), \" and \", _jsx(_components.code, {\n children: \"requirements.txt\"\n }), \" are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 \", _jsx(_components.code, {\n children: \"UNUSABLE_MANIFEST\"\n }), \"; companion files are not silently ignored.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Choose an output\"\n })\n }), \"\\n\", _jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: _jsx(_components.code, {\n children: \"format\"\n })\n }), _jsxs(_components.th, {\n children: [\"Response \", _jsx(_components.code, {\n children: \"Content-Type\"\n })]\n }), _jsx(_components.th, {\n children: \"Contents\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [_jsx(_components.code, {\n children: \"cyclonedx\"\n }), \" (default)\"]\n }), _jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"application/vnd.cyclonedx+json\"\n })\n }), _jsx(_components.td, {\n children: \"CycloneDX 1.7 JSON\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"spdx\"\n })\n }), _jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"text/spdx\"\n })\n }), _jsx(_components.td, {\n children: \"SPDX 2.3 tag-value, not JSON\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"text\"\n })\n }), _jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"text/plain\"\n })\n }), _jsx(_components.td, {\n children: \"Human-readable inventory report, not a standard SBOM serialization\"\n })]\n })]\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example’s query to \", _jsx(_components.code, {\n children: \"?format=spdx\"\n }), \" or \", _jsx(_components.code, {\n children: \"?format=text\"\n }), \", or add \", _jsx(_components.code, {\n children: \"--form 'format=spdx'\"\n }), \"; the multipart value wins. \", _jsx(_components.code, {\n children: \"Accept\"\n }), \" does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No \", _jsx(_components.code, {\n children: \"fields\"\n }), \" selector is supported.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Interpret the inventory\"\n })\n }), \"\\n\", _jsx(_components.p, {\n children: \"One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"In CycloneDX, find the document-level property named \", _jsx(_components.code, {\n children: \"githits:completeness\"\n }), \" by name rather than array position:\"]\n }), \"\\n\", _jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: \"Value\"\n }), _jsx(_components.th, {\n children: \"Meaning\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"resolved_manifest_inventory\"\n })\n }), _jsx(_components.td, {\n children: \"Inventory from manifest dependency resolution\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"partial_manifest_inventory\"\n })\n }), _jsx(_components.td, {\n children: \"Resolution is incomplete; the component list can be empty\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"recorded_lockfile_inventory\"\n })\n }), _jsx(_components.td, {\n children: \"Inventory recorded in uploaded lockfiles\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: _jsx(_components.code, {\n children: \"mixed_dependency_inventory\"\n })\n }), _jsx(_components.td, {\n children: \"Lockfile records plus separately resolved manifests\"\n })]\n })]\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"None guarantees an exact installed inventory or complete license coverage. Inspect \", _jsx(_components.code, {\n children: \"githits:resolutions\"\n }), \" and \", _jsx(_components.code, {\n children: \"githits:manifest_associations\"\n }), \" for per-manifest evidence. Structured \", _jsx(_components.code, {\n children: \"githits:\"\n }), \" property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain \", _jsx(_components.code, {\n children: \"bom-ref\"\n }), \" for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Analysis admission and cost\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 \", _jsx(_components.code, {\n children: \"RATE_LIMITED\"\n }), \" and respect \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" when present.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (\", _jsx(_components.code, {\n children: \"githits.cost=1\"\n }), \") is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Handle errors and retries\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Errors use \", _jsx(_components.code, {\n children: \"application/problem+json\"\n }), \" in every output format. Branch on \", _jsx(_components.code, {\n children: \"code\"\n }), \", not \", _jsx(_components.code, {\n children: \"detail\"\n }), \", and retain \", _jsx(_components.code, {\n children: \"X-Request-ID\"\n }), \" for support. The response definitions below provide problem schemas and examples.\"]\n }), \"\\n\", _jsxs(_components.table, {\n children: [_jsx(_components.thead, {\n children: _jsxs(_components.tr, {\n children: [_jsx(_components.th, {\n children: \"Status / code\"\n }), _jsx(_components.th, {\n children: \"Caller action\"\n })]\n })\n }), _jsxs(_components.tbody, {\n children: [_jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"400 \", _jsx(_components.code, {\n children: \"VALIDATION_ERROR\"\n })]\n }), _jsx(_components.td, {\n children: \"Correct multipart fields, filenames or format values before retrying.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"401 \", _jsx(_components.code, {\n children: \"AUTHENTICATION_REQUIRED\"\n })]\n }), _jsx(_components.td, {\n children: \"Supply a valid Bearer credential.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"403 \", _jsx(_components.code, {\n children: \"FORBIDDEN\"\n }), \", \", _jsx(_components.code, {\n children: \"ACCOUNT_INACTIVE\"\n }), \", \", _jsx(_components.code, {\n children: \"TERMS_ACCEPTANCE_REQUIRED\"\n })]\n }), _jsx(_components.td, {\n children: \"Resolve credential access, account eligibility or terms acceptance.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"408 \", _jsx(_components.code, {\n children: \"UPLOAD_TIMEOUT\"\n })]\n }), _jsx(_components.td, {\n children: \"Ensure the upload can finish within 30 seconds.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"413 \", _jsx(_components.code, {\n children: \"INPUT_TOO_LARGE\"\n })]\n }), _jsx(_components.td, {\n children: \"Reduce file count, path length or bytes to the documented limits.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"415 \", _jsx(_components.code, {\n children: \"UNSUPPORTED_MEDIA_TYPE\"\n })]\n }), _jsx(_components.td, {\n children: \"Send multipart/form-data with a valid boundary.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"UNUSABLE_MANIFEST\"\n })]\n }), _jsxs(_components.td, {\n children: [\"Inspect \", _jsx(_components.code, {\n children: \"files\"\n }), \": each entry identifies the original \", _jsx(_components.code, {\n children: \"path\"\n }), \" and \", _jsx(_components.code, {\n children: \"status\"\n }), \" (\", _jsx(_components.code, {\n children: \"unsupported\"\n }), \", \", _jsx(_components.code, {\n children: \"invalid_utf8\"\n }), \" or \", _jsx(_components.code, {\n children: \"unparsed\"\n }), \"). Correct or remove those inputs; the entire upload was rejected.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"NO_MANIFEST_EVIDENCE\"\n })]\n }), _jsx(_components.td, {\n children: \"Supply a manifest with named package evidence or a supported lockfile.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"UNREPRESENTABLE_SPDX\"\n })]\n }), _jsxs(_components.td, {\n children: [\"Request \", _jsx(_components.code, {\n children: \"cyclonedx\"\n }), \" to preserve names or versions that SPDX tag-value cannot represent.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"SBOM_OUTPUT_TOO_LARGE\"\n })]\n }), _jsx(_components.td, {\n children: \"Reduce the requested inventory; the generated document exceeded an output limit.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"429 \", _jsx(_components.code, {\n children: \"RATE_LIMITED\"\n })]\n }), _jsxs(_components.td, {\n children: [\"Respect \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" when present.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"502 \", _jsx(_components.code, {\n children: \"UPSTREAM_ERROR\"\n }), \", 503 \", _jsx(_components.code, {\n children: \"SBOM_UNAVAILABLE\"\n }), \" / \", _jsx(_components.code, {\n children: \"UPSTREAM_UNAVAILABLE\"\n })]\n }), _jsx(_components.td, {\n children: \"A service failure prevented generation; retry later if appropriate.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"504 \", _jsx(_components.code, {\n children: \"TIMEOUT\"\n })]\n }), _jsx(_components.td, {\n children: \"Generation exceeded a service deadline; a retry may repeat work.\"\n })]\n })]\n })]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\"\n })]\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};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\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":{"config":{},"pageMetadata":{"title":"Generate an SBOM from uploaded files","description":"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In the example, `private-auth.conf` is a caller-owned protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately. Run from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@Cargo.toml;filename=Cargo.toml' \\\n --form 'files[]=@Cargo.lock;filename=Cargo.lock' \\\n --output bom.cdx.json \\\n 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx'\n```\n\nFor npm, replace the two files with `package.json` and `package-lock.json`. For a nested project, use both the actual local path and the repository-relative filename, for example `files[]=@app/package.json;filename=app/package.json`. Repeat `files[]` for each file. Let curl set `Content-Type` and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data.\n\nOn success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM.\n\n**Upload rules**\n\nSend repeated `files[]` parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example `app/package.json` and `app/package-lock.json`. Only `files[]` and optional `format` are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format.\n\nSupported manifest examples include `Cargo.toml`, `package.json`, `pyproject.toml`, `Pipfile`, `go.mod`, `mix.exs` and `rebar.config`. This list is non-exhaustive; support depends on the contents, not just the filename. `go.sum` and `requirements.txt` are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 `UNUSABLE_MANIFEST`; companion files are not silently ignored.\n\nSupported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile.\n\n**Choose an output**\n\n| `format` | Response `Content-Type` | Contents |\n| --- | --- | --- |\n| `cyclonedx` (default) | `application/vnd.cyclonedx+json` | CycloneDX 1.7 JSON |\n| `spdx` | `text/spdx` | SPDX 2.3 tag-value, not JSON |\n| `text` | `text/plain` | Human-readable inventory report, not a standard SBOM serialization |\n\nAll outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example's query to `?format=spdx` or `?format=text`, or add `--form 'format=spdx'`; the multipart value wins. `Accept` does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No `fields` selector is supported.\n\nStandard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields.\n\n**Interpret the inventory**\n\nOne unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result.\n\nIn CycloneDX, find the document-level property named `githits:completeness` by name rather than array position:\n\n| Value | Meaning |\n| --- | --- |\n| `resolved_manifest_inventory` | Inventory from manifest dependency resolution |\n| `partial_manifest_inventory` | Resolution is incomplete; the component list can be empty |\n| `recorded_lockfile_inventory` | Inventory recorded in uploaded lockfiles |\n| `mixed_dependency_inventory` | Lockfile records plus separately resolved manifests |\n\nNone guarantees an exact installed inventory or complete license coverage. Inspect `githits:resolutions` and `githits:manifest_associations` for per-manifest evidence. Structured `githits:` property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain `bom-ref` for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value.\n\n**Analysis admission and cost**\n\nSynchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 `RATE_LIMITED` and respect `Retry-After` when present.\n\nAt current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (`githits.cost=1`) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation.\n\nGateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission.\n\n**Handle errors and retries**\n\nErrors use `application/problem+json` in every output format. Branch on `code`, not `detail`, and retain `X-Request-ID` for support. The response definitions below provide problem schemas and examples.\n\n| Status / code | Caller action |\n| --- | --- |\n| 400 `VALIDATION_ERROR` | Correct multipart fields, filenames or format values before retrying. |\n| 401 `AUTHENTICATION_REQUIRED` | Supply a valid Bearer credential. |\n| 403 `FORBIDDEN`, `ACCOUNT_INACTIVE`, `TERMS_ACCEPTANCE_REQUIRED` | Resolve credential access, account eligibility or terms acceptance. |\n| 408 `UPLOAD_TIMEOUT` | Ensure the upload can finish within 30 seconds. |\n| 413 `INPUT_TOO_LARGE` | Reduce file count, path length or bytes to the documented limits. |\n| 415 `UNSUPPORTED_MEDIA_TYPE` | Send multipart/form-data with a valid boundary. |\n| 422 `UNUSABLE_MANIFEST` | Inspect `files`: each entry identifies the original `path` and `status` (`unsupported`, `invalid_utf8` or `unparsed`). Correct or remove those inputs; the entire upload was rejected. |\n| 422 `NO_MANIFEST_EVIDENCE` | Supply a manifest with named package evidence or a supported lockfile. |\n| 422 `UNREPRESENTABLE_SPDX` | Request `cyclonedx` to preserve names or versions that SPDX tag-value cannot represent. |\n| 422 `SBOM_OUTPUT_TOO_LARGE` | Reduce the requested inventory; the generated document exceeded an output limit. |\n| 429 `RATE_LIMITED` | Respect `Retry-After` when present. |\n| 502 `UPSTREAM_ERROR`, 503 `SBOM_UNAVAILABLE` / `UPSTREAM_UNAVAILABLE` | A service failure prevented generation; retry later if appropriate. |\n| 504 `TIMEOUT` | Generation exceeded a service deadline; a retry may repeat work. |\n\nUploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/sbom","href":"/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In the example, `private-auth.conf` is a caller-owned protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately. Run from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@Cargo.toml;filename=Cargo.toml' \\\n --form 'files[]=@Cargo.lock;filename=Cargo.lock' \\\n --output bom.cdx.json \\\n 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx'\n```\n\nFor npm, replace the two files with `package.json` and `package-lock.json`. For a nested project, use both the actual local path and the repository-relative filename, for example `files[]=@app/package.json;filename=app/package.json`. Repeat `files[]` for each file. Let curl set `Content-Type` and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data.\n\nOn success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM.\n\n**Upload rules**\n\nSend repeated `files[]` parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example `app/package.json` and `app/package-lock.json`. Only `files[]` and optional `format` are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format.\n\nSupported manifest examples include `Cargo.toml`, `package.json`, `pyproject.toml`, `Pipfile`, `go.mod`, `mix.exs` and `rebar.config`. This list is non-exhaustive; support depends on the contents, not just the filename. `go.sum` and `requirements.txt` are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 `UNUSABLE_MANIFEST`; companion files are not silently ignored.\n\nSupported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile.\n\n**Choose an output**\n\n| `format` | Response `Content-Type` | Contents |\n| --- | --- | --- |\n| `cyclonedx` (default) | `application/vnd.cyclonedx+json` | CycloneDX 1.7 JSON |\n| `spdx` | `text/spdx` | SPDX 2.3 tag-value, not JSON |\n| `text` | `text/plain` | Human-readable inventory report, not a standard SBOM serialization |\n\nAll outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example's query to `?format=spdx` or `?format=text`, or add `--form 'format=spdx'`; the multipart value wins. `Accept` does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No `fields` selector is supported.\n\nStandard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields.\n\n**Interpret the inventory**\n\nOne unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result.\n\nIn CycloneDX, find the document-level property named `githits:completeness` by name rather than array position:\n\n| Value | Meaning |\n| --- | --- |\n| `resolved_manifest_inventory` | Inventory from manifest dependency resolution |\n| `partial_manifest_inventory` | Resolution is incomplete; the component list can be empty |\n| `recorded_lockfile_inventory` | Inventory recorded in uploaded lockfiles |\n| `mixed_dependency_inventory` | Lockfile records plus separately resolved manifests |\n\nNone guarantees an exact installed inventory or complete license coverage. Inspect `githits:resolutions` and `githits:manifest_associations` for per-manifest evidence. Structured `githits:` property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain `bom-ref` for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value.\n\n**Analysis admission and cost**\n\nSynchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 `RATE_LIMITED` and respect `Retry-After` when present.\n\nAt current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (`githits.cost=1`) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation.\n\nGateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission.\n\n**Handle errors and retries**\n\nErrors use `application/problem+json` in every output format. Branch on `code`, not `detail`, and retain `X-Request-ID` for support. The response definitions below provide problem schemas and examples.\n\n| Status / code | Caller action |\n| --- | --- |\n| 400 `VALIDATION_ERROR` | Correct multipart fields, filenames or format values before retrying. |\n| 401 `AUTHENTICATION_REQUIRED` | Supply a valid Bearer credential. |\n| 403 `FORBIDDEN`, `ACCOUNT_INACTIVE`, `TERMS_ACCEPTANCE_REQUIRED` | Resolve credential access, account eligibility or terms acceptance. |\n| 408 `UPLOAD_TIMEOUT` | Ensure the upload can finish within 30 seconds. |\n| 413 `INPUT_TOO_LARGE` | Reduce file count, path length or bytes to the documented limits. |\n| 415 `UNSUPPORTED_MEDIA_TYPE` | Send multipart/form-data with a valid boundary. |\n| 422 `UNUSABLE_MANIFEST` | Inspect `files`: each entry identifies the original `path` and `status` (`unsupported`, `invalid_utf8` or `unparsed`). Correct or remove those inputs; the entire upload was rejected. |\n| 422 `NO_MANIFEST_EVIDENCE` | Supply a manifest with named package evidence or a supported lockfile. |\n| 422 `UNREPRESENTABLE_SPDX` | Request `cyclonedx` to preserve names or versions that SPDX tag-value cannot represent. |\n| 422 `SBOM_OUTPUT_TOO_LARGE` | Reduce the requested inventory; the generated document exceeded an output limit. |\n| 429 `RATE_LIMITED` | Respect `Retry-After` when present. |\n| 502 `UPSTREAM_ERROR`, 503 `SBOM_UNAVAILABLE` / `UPSTREAM_UNAVAILABLE` | A service failure prevented generation; retry later if appropriate. |\n| 504 `TIMEOUT` | Generation exceeded a service deadline; a retry may repeat work. |\n\nUploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\n","operationId":"generate_sbom","parameters":["f6c40e10-7adf-472c-8161-7c0528777afb","98253089-dc65-467e-a9f1-6021daec6131","c834209f-6bcd-4f23-9d9c-5cdae7abcfb0","d6a7f78a-14c4-4a95-a0a7-859a967eaa64","64a7c7d3-6279-4a2a-b3a4-31c6a2a21889"],"requestBody":"713bda61-4bfc-494b-949c-41bdcf40d171","responses":{"200":"b16057a9-c059-46df-b6e8-a9b1717597ee","400":"7df42a6b-01bd-45fd-aadb-094da08b82c1","401":"67d01dbe-8a96-4967-b389-f4ebec8ddba0","403":"9e22cbe0-5a4e-4cc6-a927-36ffa3c88154","405":"4d8399e5-2c54-48d9-b9cb-4fb1aa19d8df","408":"6663147b-668b-4b6c-bb9c-ca6190445e78","413":"8d942351-e33c-40c6-9864-8d4e65d6d57b","415":"c7e0ca48-8386-4fed-907a-628050ed7899","422":"f6b2f85d-72a2-48e8-b331-40917867498d","429":"07048bc3-6b53-4899-a69c-ca978da5bc34","500":"c9045f34-ac16-480a-836b-a75f8e9215f4","502":"7e8f5b0f-96eb-420c-b143-b290b541731f","503":"d19936ed-6520-4830-888b-73ab362966d3","504":"d0b0b716-b165-4441-9ae2-2ecf072c6d60"},"security":["38edb085-e6bc-4225-92f2-ba4e1afb5748"],"summary":"Generate an SBOM from uploaded files","tags":["Experimental"],"x-githits-cost":1,"method":"post","type":"path","servers":["078a74e7-4d25-496a-979d-4eff5db36c94"],"path":"/v1/experimental/sbom","baseUrlOptions":["https://api.githits.dev"],"title":"Generate an SBOM from uploaded files","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","disableProxy":true},"dependencies":{"parameters":{"f6c40e10-7adf-472c-8161-7c0528777afb":{"description":"Output format; a multipart format field overrides this value. No Accept negotiation. Duplicate values and unknown query fields are rejected.","in":"query","name":"format","required":false,"schema":{"default":"cyclonedx","description":"Output format; a multipart format field overrides this value. No Accept negotiation. Duplicate values and unknown query fields are rejected.\ncyclonedx returns CycloneDX 1.7 JSON (application/vnd.cyclonedx+json); spdx returns SPDX 2.3 tag-value (text/spdx); text returns a human-readable report (text/plain). All outputs use UTF-8. Accept does not select the successful output format.","enum":["cyclonedx","spdx","text"],"type":"string","isRequired":false,"uniqueKey":"","typeLabel":"enum\u003cstring>"}},"98253089-dc65-467e-a9f1-6021daec6131":{"description":"Optional client attribution: trimmed printable ASCII, at most 80 bytes. Invalid optional values are dropped.","in":"header","name":"X-GitHits-Client-Name","required":false,"schema":{"type":"string","isRequired":false,"description":"Optional client attribution: trimmed printable ASCII, at most 80 bytes. Invalid optional values are dropped.","uniqueKey":"","typeLabel":"string"}},"c834209f-6bcd-4f23-9d9c-5cdae7abcfb0":{"description":"Optional client-version attribution: trimmed printable ASCII, at most 80 bytes. Invalid optional values are dropped.","in":"header","name":"X-GitHits-Client-Version","required":false,"schema":{"type":"string","isRequired":false,"description":"Optional client-version attribution: trimmed printable ASCII, at most 80 bytes. Invalid optional values are dropped.","uniqueKey":"","typeLabel":"string"}},"d6a7f78a-14c4-4a95-a0a7-859a967eaa64":{"description":"Optional agent attribution: trimmed printable ASCII, at most 160 bytes. Invalid optional values are dropped.","in":"header","name":"X-GitHits-Agent","required":false,"schema":{"type":"string","isRequired":false,"description":"Optional agent attribution: trimmed printable ASCII, at most 160 bytes. Invalid optional values are dropped.","uniqueKey":"","typeLabel":"string"}},"64a7c7d3-6279-4a2a-b3a4-31c6a2a21889":{"description":"Optional caller-defined session ID: one to 64 ASCII letters, digits, underscores or hyphens, preserved exactly. Supply the header at most once. Invalid supplied IDs return 400 INVALID_SESSION_ID; no session is created.","in":"header","name":"X-GitHits-Session-ID","required":false,"schema":{"maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9_-]{1,64}$","type":"string","isRequired":false,"description":"Optional caller-defined session ID: one to 64 ASCII letters, digits, underscores or hyphens, preserved exactly. Supply the header at most once. Invalid supplied IDs return 400 INVALID_SESSION_ID; no session is created.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"multipart/form-data":{"encoding":{"files[]":{"contentType":"application/octet-stream"}},"schema":{"additionalProperties":false,"properties":{"files[]":{"description":"Repeat the literal field name files[] once per file, with raw UTF-8 file contents rather than base64. Set each part's filename to the file's path relative to a common repository root, for example app/package.json and app/package-lock.json. Preserve directory structure so manifests can be associated with their lockfiles.\n\nSend 1–256 files, each at most 5,242,880 bytes. Each filename must be at most 1,024 UTF-8 bytes and must be relative, with no empty, dot (.) or parent (..) path segments, backslashes or control characters. Every file must be a supported, readable manifest or lockfile; one unusable file rejects the entire upload.","items":{"format":"binary","type":"string","uniqueKey":"files[].items.[INDEX]","typeLabel":"file"},"maxItems":256,"minItems":1,"type":"array","isRequired":true,"uniqueKey":"files[]","typeLabel":"file[]"},"format":{"default":"cyclonedx","description":"Select the response format. This value overrides the query parameter; omit both to receive CycloneDX JSON.","enum":["cyclonedx","spdx","text"],"type":"string","uniqueKey":"format","typeLabel":"enum\u003cstring>"}},"required":["files[]"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"files[]":["\u003cstring>"],"format":"cyclonedx"}}},"exampleType":"generated"}},"description":"Send a multipart upload. The complete request, including multipart headers and boundaries, must fit within 8,000,000 bytes.","required":true,"exampleType":"generated"},"responses":{"b16057a9-c059-46df-b6e8-a9b1717597ee":{"content":{"application/vnd.cyclonedx+json":{"example":{"bomFormat":"CycloneDX","components":[],"compositions":[{"aggregate":"incomplete","assemblies":[]}],"metadata":{"timestamp":"2026-09-09T00:00:00Z"},"properties":[{"name":"githits:completeness","value":"partial_manifest_inventory"}],"serialNumber":"urn:uuid:00000000-0000-4000-8000-000000000001","specVersion":"1.7","version":1},"schema":{"additionalProperties":true,"description":"Extensible CycloneDX 1.7 document. This schema describes a compatible subset, not the entire standard. Additional fields are allowed at every object level; clients must preserve or ignore unfamiliar data. Inventory and license completeness must be read from evidence, not inferred from this schema.","properties":{"bomFormat":{"enum":["CycloneDX"],"type":"string","isRequired":true,"uniqueKey":"bomFormat","typeLabel":"enum\u003cstring>"},"specVersion":{"description":"Open producer CycloneDX specification version. Clients must accept unfamiliar versions and fields.","type":"string","isRequired":true,"uniqueKey":"specVersion","typeLabel":"string"},"components":{"description":"Named project roots and dependency entries. Unresolved declarations remain in document properties rather than becoming package components. The array may be empty when no concrete packages or named roots are available. Separate lockfile occurrences may have the same name and version; do not deduplicate by those fields alone.","items":{"additionalProperties":true,"description":"An uploaded project root, a resolved dependency or a recorded lockfile package. Use githits:record_kind in properties to distinguish them.","properties":{"name":{"description":"Package or project name. Names are not unique across registries, versions or lockfile occurrences.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].name","typeLabel":"string"},"type":{"description":"CycloneDX component classification, such as library, application or container. Clients must allow new standard classifications.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].type","typeLabel":"string"},"bom-ref":{"description":"Opaque component identifier used by references within this document. It is not a package URL or an artifact checksum.","type":"string","uniqueKey":"components.items.[INDEX].bom-ref","typeLabel":"string"},"licenses":{"description":"Standard license choices: SPDX expressions or licenses identified by id or name, with optional acknowledgement and additional standard evidence. Preserve the original evidence; no license conclusion is inferred.","items":{"oneOf":[{"type":"object","required":["license"],"properties":{"license":{"additionalProperties":true,"properties":{"id":{"description":"SPDX license identifier.","type":"string","uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.0.license.id","typeLabel":"string"},"name":{"description":"License name, including free-text and proprietary names.","type":"string","uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.0.license.name","typeLabel":"string"}},"type":"object","isRequired":true,"uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.0.license","typeLabel":"object"}},"additionalProperties":true,"uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["expression"],"properties":{"expression":{"description":"Recognized SPDX license expression, including a single identifier such as MIT or a compound expression such as MIT OR Apache-2.0. This is a declaration, not a legal conclusion or artifact verification.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.1.expression","typeLabel":"string"},"acknowledgement":{"description":"Standard license acknowledgement, such as declared or concluded; preserve the reported value.","type":"string","uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.1.acknowledgement","typeLabel":"string"}},"additionalProperties":true,"uniqueKey":"components.items.[INDEX].licenses.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"components.items.[INDEX].licenses.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"components.items.[INDEX].licenses","typeLabel":"object[]"},"properties":{"description":"Component evidence. githits:purl_basis=manifest_resolution identifies the basis of an emitted PURL. For resolved packages without a PURL, githits:purl_omission_reason is missing_identity_facets (required identity details unavailable), unsupported_registry (no supported PURL mapping), or invalid_coordinate (the coordinate cannot form a valid PURL). Other record kinds omit both facts. githits:record_kind distinguishes manifest, resolved_package and locked_package entries. githits:resolution_basis identifies how a dependency was selected. githits:metadata_status reports metadata availability, not license verification. Where present, githits:license_artifact_verification=not_checked means the specific source artifact or commit was not checked.","items":{"additionalProperties":true,"description":"Extensible standard property. Match by name rather than array position; ignore names your client does not recognize.","examples":[{"name":"githits:record_kind","value":"resolved_package"},{"name":"githits:manifest_paths","value":"[\"app/package.json\"]"}],"properties":{"name":{"description":"Property name. GitHits evidence uses the githits: namespace; other namespaces are also allowed.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].properties.items.[INDEX].name","typeLabel":"string"},"value":{"description":"Evidence value, always encoded as a string. Structured values such as githits:declarations, githits:resolutions, githits:lockfiles, githits:manifest_associations, githits:manifest_paths and githits:lockfile_paths contain JSON; decode those values separately when needed.","type":"string","uniqueKey":"components.items.[INDEX].properties.items.[INDEX].value","typeLabel":"string"}},"required":["name"],"type":"object","uniqueKey":"components.items.[INDEX].properties.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"components.items.[INDEX].properties","typeLabel":"object[]"},"purl":{"description":"Identifies a concrete package selected by manifest dependency resolution. Present for supported registry coordinates even when license metadata is unavailable. Omitted for uploaded roots, unresolved declarations and lockfile occurrences, and when required identity details are unavailable. Presence does not verify installed or artifact contents; it is not a download URL. Preserve bom-ref for document relationships and occurrences.","examples":["pkg:npm/%40scope/dep@1.2.3"],"minLength":1,"pattern":"^pkg:","type":"string","uniqueKey":"components.items.[INDEX].purl","typeLabel":"string"},"version":{"description":"Version declared by an uploaded project, selected during dependency resolution, or recorded in a lockfile. Omitted when unknown; omission does not mean the latest version.","type":"string","uniqueKey":"components.items.[INDEX].version","typeLabel":"string"}},"required":["type","name"],"type":"object","uniqueKey":"components.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"components","typeLabel":"object[]"},"compositions":{"description":"Completeness declaration for the listed component references.","items":{"additionalProperties":true,"properties":{"aggregate":{"description":"Reported completeness of the referenced inventory. Do not infer that additional fields establish completeness.","type":"string","isRequired":true,"uniqueKey":"compositions.items.[INDEX].aggregate","typeLabel":"string"},"assemblies":{"description":"References to entries in components, using each entry's bom-ref.","items":{"type":"string","uniqueKey":"compositions.items.[INDEX].assemblies.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"compositions.items.[INDEX].assemblies","typeLabel":"string[]"}},"required":["aggregate"],"type":"object","uniqueKey":"compositions.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"compositions","typeLabel":"object[]"},"metadata":{"additionalProperties":true,"properties":{"timestamp":{"description":"Time this document was generated.","format":"date-time","type":"string","uniqueKey":"metadata.timestamp","typeLabel":"string\u003cdate-time>"}},"type":"object","uniqueKey":"metadata","typeLabel":"object"},"properties":{"description":"Document evidence. githits:completeness distinguishes resolved_manifest_inventory, partial_manifest_inventory, recorded_lockfile_inventory and mixed_dependency_inventory; none guarantees that every license is known. githits:resolution_basis distinguishes manifest_resolution, lockfile_records and lockfile_records_and_manifest_resolution. Inspect githits:resolutions for per-manifest outcomes, githits:declarations for original requirements, and githits:lockfiles and githits:manifest_associations for lockfile coverage. githits:notice summarizes limitations.","items":{"additionalProperties":true,"description":"Extensible standard property. Match by name rather than array position; ignore names your client does not recognize.","examples":[{"name":"githits:record_kind","value":"resolved_package"},{"name":"githits:manifest_paths","value":"[\"app/package.json\"]"}],"properties":{"name":{"description":"Property name. GitHits evidence uses the githits: namespace; other namespaces are also allowed.","type":"string","isRequired":true,"uniqueKey":"properties.items.[INDEX].name","typeLabel":"string"},"value":{"description":"Evidence value, always encoded as a string. Structured values such as githits:declarations, githits:resolutions, githits:lockfiles, githits:manifest_associations, githits:manifest_paths and githits:lockfile_paths contain JSON; decode those values separately when needed.","type":"string","uniqueKey":"properties.items.[INDEX].value","typeLabel":"string"}},"required":["name"],"type":"object","uniqueKey":"properties.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"properties","typeLabel":"object[]"},"serialNumber":{"description":"Unique identifier for this generated document. This URN is not a retrieval URL.","pattern":"^urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","type":"string","uniqueKey":"serialNumber","typeLabel":"string"},"version":{"description":"Document revision, not a package version.","minimum":1,"type":"integer","uniqueKey":"version","typeLabel":"integer"}},"required":["bomFormat","specVersion"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"bomFormat":"CycloneDX","components":[],"compositions":[{"aggregate":"incomplete","assemblies":[]}],"metadata":{"timestamp":"2026-09-09T00:00:00Z"},"properties":[{"name":"githits:completeness","value":"partial_manifest_inventory"}],"serialNumber":"urn:uuid:00000000-0000-4000-8000-000000000001","specVersion":"1.7","version":1}}},"exampleType":"examples"},"text/plain":{"example":"GitHits dependency inventory report\nNotice: Recorded lockfile inventory, not an exact installed build or a compliance assertion.\nReport ID: sbom-fixture-report\nGenerated: 2026-09-09T00:00:00Z\nEntries: 1\nLocked packages: 1\nUploaded roots: 0\nStructural records: 0\nResolved packages: 0\nDocument facts:\n completeness: \"recorded_lockfile_inventory\"\nPackage: \"dep\"\n ID: locked-dep-1.2.0\n Known version: \"1.2.0\"\n License: unknown\n record_kind: \"locked_package\"\n","schema":{"pattern":"^GitHits (manifest|dependency) inventory report\\n","type":"string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"GitHits dependency inventory report\nNotice: Recorded lockfile inventory, not an exact installed build or a compliance assertion.\nReport ID: sbom-fixture-report\nGenerated: 2026-09-09T00:00:00Z\nEntries: 1\nLocked packages: 1\nUploaded roots: 0\nStructural records: 0\nResolved packages: 0\nDocument facts:\n completeness: \"recorded_lockfile_inventory\"\nPackage: \"dep\"\n ID: locked-dep-1.2.0\n Known version: \"1.2.0\"\n License: unknown\n record_kind: \"locked_package\"\n"}},"exampleType":"examples"},"text/spdx":{"example":"SPDXVersion: SPDX-2.3\nDataLicense: CC0-1.0\nSPDXID: SPDXRef-DOCUMENT\nDocumentName: GitHits dependency inventory\nDocumentNamespace: urn:uuid:24e6d898-af42-4113-b174-7388662d8648\nCreator: Tool: GitHits\nCreated: 2026-09-05T12:00:00Z\nDocumentComment: \u003ctext>{\"completeness\":\"recorded_lockfile_inventory\",\"declarations\":\"[]\",\"lockfiles\":\"[{\\\"path\\\":\\\"package-lock.json\\\",\\\"format\\\":\\\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\\\",\\\"context\\\":{\\\"categories\\\":[],\\\"requires_python\\\":\\\"\\\",\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"gradle_configurations\\\":[],\\\"supported_markers\\\":[],\\\"required_markers\\\":[],\\\"dart_sdk_constraints\\\":[],\\\"python_version\\\":\\\"\\\",\\\"bundler_platforms\\\":[],\\\"python_full_version\\\":\\\"\\\",\\\"python_targets\\\":[],\\\"nuget_targets\\\":[]},\\\"format_version\\\":0,\\\"dependency_count\\\":0,\\\"completeness\\\":\\\"LOCKFILE_COMPLETENESS_PACKAGE_ENTRIES_ONLY\\\",\\\"root_package_ids\\\":[1],\\\"format_revision\\\":null,\\\"native_format_version\\\":\\\"\\\",\\\"association_status\\\":\\\"standalone\\\",\\\"checksum_count\\\":0,\\\"manifest_lock_consistency\\\":\\\"not_checked\\\",\\\"manifest_paths\\\":[],\\\"omitted_context_counts\\\":{\\\"conflicts\\\":0,\\\"bundler_tool_checksums\\\":0,\\\"composer_platform_overrides\\\":0,\\\"conan_overrides\\\":0,\\\"conan_inventories\\\":0,\\\"composer_aliases\\\":0,\\\"conan_aliases\\\":0,\\\"poetry_checksum_sets\\\":0,\\\"dep_input_imports\\\":0},\\\"package_count\\\":3,\\\"projection_notices\\\":[\\\"relationships_not_projected\\\",\\\"integrity_not_projected\\\",\\\"resolution_context_not_projected\\\"],\\\"requirement_count\\\":0,\\\"structural_count\\\":1,\\\"structural_records\\\":[{\\\"id\\\":3,\\\"name\\\":\\\"\\\",\\\"version\\\":\\\"\\\",\\\"context\\\":{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"},\\\"role\\\":\\\"LOCKED_PACKAGE_ROLE_IMPORTER\\\",\\\"source_kind\\\":\\\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\\\"}]},{\\\"path\\\":\\\"nested/package-lock.json\\\",\\\"format\\\":\\\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\\\",\\\"context\\\":{\\\"categories\\\":[],\\\"requires_python\\\":\\\"\\\",\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"gradle_configurations\\\":[],\\\"supported_markers\\\":[],\\\"required_markers\\\":[],\\\"dart_sdk_constraints\\\":[],\\\"python_version\\\":\\\"\\\",\\\"bundler_platforms\\\":[],\\\"python_full_version\\\":\\\"\\\",\\\"python_targets\\\":[],\\\"nuget_targets\\\":[]},\\\"format_version\\\":0,\\\"dependency_count\\\":0,\\\"completeness\\\":\\\"LOCKFILE_COMPLETENESS_PACKAGE_ENTRIES_ONLY\\\",\\\"root_package_ids\\\":[1],\\\"format_revision\\\":null,\\\"native_format_version\\\":\\\"\\\",\\\"association_status\\\":\\\"standalone\\\",\\\"checksum_count\\\":0,\\\"manifest_lock_consistency\\\":\\\"not_checked\\\",\\\"manifest_paths\\\":[],\\\"omitted_context_counts\\\":{\\\"conflicts\\\":0,\\\"bundler_tool_checksums\\\":0,\\\"composer_platform_overrides\\\":0,\\\"conan_overrides\\\":0,\\\"conan_inventories\\\":0,\\\"composer_aliases\\\":0,\\\"conan_aliases\\\":0,\\\"poetry_checksum_sets\\\":0,\\\"dep_input_imports\\\":0},\\\"package_count\\\":1,\\\"projection_notices\\\":[\\\"relationships_not_projected\\\",\\\"integrity_not_projected\\\",\\\"resolution_context_not_projected\\\"],\\\"requirement_count\\\":0,\\\"structural_count\\\":0,\\\"structural_records\\\":[]}]\",\"manifest_associations\":\"{}\",\"notice\":\"Recorded conditional lockfile inventory, not an exact installed build or a compliance assertion. Manifest/lock consistency is not checked. Relationships and integrity are not projected. Licenses are uploaded-root or public-registry coordinate declarations, not source-artifact verification or legal conclusions.\",\"resolution_basis\":\"lockfile_records\",\"resolutions\":\"[]\"}\u003c/text>\n\nPackageName: dep\nSPDXID: SPDXRef-locked-42925864b1614adf48873a749eb88299882ddee203e2ac218e962986df33f40d\nPackageVersion: 1.2.0\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: MIT\nPackageLicenseComments: \u003ctext>{\"license\":\"MIT\",\"source\":\"registry_declared\"}\u003c/text>\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"license_artifact_verification\":\"not_checked\",\"license_catalog_version\":\"3.28.0\",\"license_expression\":\"MIT\",\"license_raw\":\"MIT\",\"license_source\":\"registry_declared\",\"license_status\":\"expression\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"package-lock.json\",\"metadata_status\":\"available\",\"package_id\":\"1\",\"record_kind\":\"locked_package\",\"registry\":\"npm\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\"}\u003c/text>\n\nPackageName: dep\nSPDXID: SPDXRef-locked-4d058b03a8843e670ab6222627b94be44647ce35eb7f5e824c7760a5e9b6726d\nPackageVersion: 1.2.0\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: MIT\nPackageLicenseComments: \u003ctext>{\"license\":\"MIT\",\"source\":\"registry_declared\"}\u003c/text>\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"license_artifact_verification\":\"not_checked\",\"license_catalog_version\":\"3.28.0\",\"license_expression\":\"MIT\",\"license_raw\":\"MIT\",\"license_source\":\"registry_declared\",\"license_status\":\"expression\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"nested/package-lock.json\",\"metadata_status\":\"available\",\"package_id\":\"1\",\"record_kind\":\"locked_package\",\"registry\":\"npm\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\"}\u003c/text>\n\nPackageName: local-dep\nSPDXID: SPDXRef-locked-e738e69432f53950a50dcf2514b6cefda5315365b7f94e9f661196b4e8d087dc\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: NOASSERTION\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"package-lock.json\",\"metadata_reason\":\"missing_coordinate\",\"metadata_status\":\"not_eligible\",\"package_id\":\"2\",\"record_kind\":\"locked_package\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_LOCAL\"}\u003c/text>\n\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-42925864b1614adf48873a749eb88299882ddee203e2ac218e962986df33f40d\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-4d058b03a8843e670ab6222627b94be44647ce35eb7f5e824c7760a5e9b6726d\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-e738e69432f53950a50dcf2514b6cefda5315365b7f94e9f661196b4e8d087dc\n","schema":{"pattern":"^SPDXVersion: SPDX-2\\.3\\n","type":"string","uniqueKey":"","typeLabel":"string"},"examples":{"Example":{"title":"Example","value":"SPDXVersion: SPDX-2.3\nDataLicense: CC0-1.0\nSPDXID: SPDXRef-DOCUMENT\nDocumentName: GitHits dependency inventory\nDocumentNamespace: urn:uuid:24e6d898-af42-4113-b174-7388662d8648\nCreator: Tool: GitHits\nCreated: 2026-09-05T12:00:00Z\nDocumentComment: \u003ctext>{\"completeness\":\"recorded_lockfile_inventory\",\"declarations\":\"[]\",\"lockfiles\":\"[{\\\"path\\\":\\\"package-lock.json\\\",\\\"format\\\":\\\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\\\",\\\"context\\\":{\\\"categories\\\":[],\\\"requires_python\\\":\\\"\\\",\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"gradle_configurations\\\":[],\\\"supported_markers\\\":[],\\\"required_markers\\\":[],\\\"dart_sdk_constraints\\\":[],\\\"python_version\\\":\\\"\\\",\\\"bundler_platforms\\\":[],\\\"python_full_version\\\":\\\"\\\",\\\"python_targets\\\":[],\\\"nuget_targets\\\":[]},\\\"format_version\\\":0,\\\"dependency_count\\\":0,\\\"completeness\\\":\\\"LOCKFILE_COMPLETENESS_PACKAGE_ENTRIES_ONLY\\\",\\\"root_package_ids\\\":[1],\\\"format_revision\\\":null,\\\"native_format_version\\\":\\\"\\\",\\\"association_status\\\":\\\"standalone\\\",\\\"checksum_count\\\":0,\\\"manifest_lock_consistency\\\":\\\"not_checked\\\",\\\"manifest_paths\\\":[],\\\"omitted_context_counts\\\":{\\\"conflicts\\\":0,\\\"bundler_tool_checksums\\\":0,\\\"composer_platform_overrides\\\":0,\\\"conan_overrides\\\":0,\\\"conan_inventories\\\":0,\\\"composer_aliases\\\":0,\\\"conan_aliases\\\":0,\\\"poetry_checksum_sets\\\":0,\\\"dep_input_imports\\\":0},\\\"package_count\\\":3,\\\"projection_notices\\\":[\\\"relationships_not_projected\\\",\\\"integrity_not_projected\\\",\\\"resolution_context_not_projected\\\"],\\\"requirement_count\\\":0,\\\"structural_count\\\":1,\\\"structural_records\\\":[{\\\"id\\\":3,\\\"name\\\":\\\"\\\",\\\"version\\\":\\\"\\\",\\\"context\\\":{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"},\\\"role\\\":\\\"LOCKED_PACKAGE_ROLE_IMPORTER\\\",\\\"source_kind\\\":\\\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\\\"}]},{\\\"path\\\":\\\"nested/package-lock.json\\\",\\\"format\\\":\\\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\\\",\\\"context\\\":{\\\"categories\\\":[],\\\"requires_python\\\":\\\"\\\",\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"gradle_configurations\\\":[],\\\"supported_markers\\\":[],\\\"required_markers\\\":[],\\\"dart_sdk_constraints\\\":[],\\\"python_version\\\":\\\"\\\",\\\"bundler_platforms\\\":[],\\\"python_full_version\\\":\\\"\\\",\\\"python_targets\\\":[],\\\"nuget_targets\\\":[]},\\\"format_version\\\":0,\\\"dependency_count\\\":0,\\\"completeness\\\":\\\"LOCKFILE_COMPLETENESS_PACKAGE_ENTRIES_ONLY\\\",\\\"root_package_ids\\\":[1],\\\"format_revision\\\":null,\\\"native_format_version\\\":\\\"\\\",\\\"association_status\\\":\\\"standalone\\\",\\\"checksum_count\\\":0,\\\"manifest_lock_consistency\\\":\\\"not_checked\\\",\\\"manifest_paths\\\":[],\\\"omitted_context_counts\\\":{\\\"conflicts\\\":0,\\\"bundler_tool_checksums\\\":0,\\\"composer_platform_overrides\\\":0,\\\"conan_overrides\\\":0,\\\"conan_inventories\\\":0,\\\"composer_aliases\\\":0,\\\"conan_aliases\\\":0,\\\"poetry_checksum_sets\\\":0,\\\"dep_input_imports\\\":0},\\\"package_count\\\":1,\\\"projection_notices\\\":[\\\"relationships_not_projected\\\",\\\"integrity_not_projected\\\",\\\"resolution_context_not_projected\\\"],\\\"requirement_count\\\":0,\\\"structural_count\\\":0,\\\"structural_records\\\":[]}]\",\"manifest_associations\":\"{}\",\"notice\":\"Recorded conditional lockfile inventory, not an exact installed build or a compliance assertion. Manifest/lock consistency is not checked. Relationships and integrity are not projected. Licenses are uploaded-root or public-registry coordinate declarations, not source-artifact verification or legal conclusions.\",\"resolution_basis\":\"lockfile_records\",\"resolutions\":\"[]\"}\u003c/text>\n\nPackageName: dep\nSPDXID: SPDXRef-locked-42925864b1614adf48873a749eb88299882ddee203e2ac218e962986df33f40d\nPackageVersion: 1.2.0\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: MIT\nPackageLicenseComments: \u003ctext>{\"license\":\"MIT\",\"source\":\"registry_declared\"}\u003c/text>\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"license_artifact_verification\":\"not_checked\",\"license_catalog_version\":\"3.28.0\",\"license_expression\":\"MIT\",\"license_raw\":\"MIT\",\"license_source\":\"registry_declared\",\"license_status\":\"expression\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"package-lock.json\",\"metadata_status\":\"available\",\"package_id\":\"1\",\"record_kind\":\"locked_package\",\"registry\":\"npm\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\"}\u003c/text>\n\nPackageName: dep\nSPDXID: SPDXRef-locked-4d058b03a8843e670ab6222627b94be44647ce35eb7f5e824c7760a5e9b6726d\nPackageVersion: 1.2.0\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: MIT\nPackageLicenseComments: \u003ctext>{\"license\":\"MIT\",\"source\":\"registry_declared\"}\u003c/text>\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"license_artifact_verification\":\"not_checked\",\"license_catalog_version\":\"3.28.0\",\"license_expression\":\"MIT\",\"license_raw\":\"MIT\",\"license_source\":\"registry_declared\",\"license_status\":\"expression\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"nested/package-lock.json\",\"metadata_status\":\"available\",\"package_id\":\"1\",\"record_kind\":\"locked_package\",\"registry\":\"npm\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_REGISTRY\"}\u003c/text>\n\nPackageName: local-dep\nSPDXID: SPDXRef-locked-e738e69432f53950a50dcf2514b6cefda5315365b7f94e9f661196b4e8d087dc\nPackageDownloadLocation: NOASSERTION\nFilesAnalyzed: false\nPackageLicenseConcluded: NOASSERTION\nPackageLicenseDeclared: NOASSERTION\nPackageCopyrightText: NOASSERTION\nPackageComment: \u003ctext>{\"context\":\"{\\\"peer\\\":false,\\\"source\\\":{\\\"local_kind\\\":\\\"LOCKED_LOCAL_SOURCE_KIND_UNSPECIFIED\\\"},\\\"optional\\\":false,\\\"requires_python\\\":\\\"\\\",\\\"nuget_dependency_type\\\":\\\"NUGET_DEPENDENCY_TYPE_UNSPECIFIED\\\",\\\"bundler_platform\\\":\\\"\\\",\\\"group_conditions\\\":[],\\\"dev_optional\\\":false,\\\"extraneous\\\":false,\\\"dart_dependency_kind\\\":\\\"DART_DEPENDENCY_KIND_UNSPECIFIED\\\",\\\"berry_link_kind\\\":\\\"BERRY_LINK_KIND_UNSPECIFIED\\\",\\\"dev_only\\\":false,\\\"resolution_markers\\\":[],\\\"provided_extras\\\":[],\\\"berry_patched\\\":false,\\\"conditions\\\":null,\\\"requested_extras\\\":[],\\\"otp_application_name\\\":\\\"\\\"}\",\"lockfile_format\":\"LOCKFILE_FORMAT_NPM_PACKAGE_LOCK\",\"lockfile_path\":\"package-lock.json\",\"metadata_reason\":\"missing_coordinate\",\"metadata_status\":\"not_eligible\",\"package_id\":\"2\",\"record_kind\":\"locked_package\",\"resolution_basis\":\"lockfile_record\",\"role\":\"LOCKED_PACKAGE_ROLE_PACKAGE\",\"source_kind\":\"LOCKED_PACKAGE_SOURCE_KIND_LOCAL\"}\u003c/text>\n\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-42925864b1614adf48873a749eb88299882ddee203e2ac218e962986df33f40d\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-4d058b03a8843e670ab6222627b94be44647ce35eb7f5e824c7760a5e9b6726d\nRelationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-locked-e738e69432f53950a50dcf2514b6cefda5315365b7f94e9f661196b4e8d087dc\n"}},"exampleType":"examples"}},"description":"Complete UTF-8 document, at most 16,777,216 bytes. Inventory and license evidence may be partial; save this response because no retrieval URL is created.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"7df42a6b-01bd-45fd-aadb-094da08b82c1":{"content":{"application/problem+json":{"examples":{"invalid_session_id":{"title":"invalid_session_id","value":{"code":"INVALID_SESSION_ID","detail":"X-GitHits-Session-ID must occur once and match [A-Za-z0-9_-]{1,64}.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":400,"title":"Invalid session ID","type":"about:blank"}},"upstream_validation":{"title":"upstream_validation","value":{"code":"VALIDATION_ERROR","detail":"The request is invalid.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":400,"title":"Validation error","type":"about:blank"}},"validation":{"title":"validation","value":{"code":"VALIDATION_ERROR","detail":"query: contains unknown parameters; use only the documented parameters.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":400,"title":"Validation error","type":"about:blank"}}},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"exampleType":"examples"}},"description":"VALIDATION_ERROR INVALID_SESSION_ID: a supplied session header is invalid or duplicated. Local VALIDATION_ERROR details identify the first invalid field and a client-safe reason, including zero-based batch paths and canonical-version guidance when applicable; submitted values and unknown keys are not echoed.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"67d01dbe-8a96-4967-b389-f4ebec8ddba0":{"content":{"application/problem+json":{"example":{"code":"AUTHENTICATION_REQUIRED","detail":"A bearer credential is required.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":401,"title":"Authentication required","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"AUTHENTICATION_REQUIRED","detail":"A bearer credential is required.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":401,"title":"Authentication required","type":"about:blank"}}},"exampleType":"examples"}},"description":"AUTHENTICATION_REQUIRED","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"WWW-Authenticate":{"description":"Bearer challenge.","schema":{"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"9e22cbe0-5a4e-4cc6-a927-36ffa3c88154":{"content":{"application/problem+json":{"example":{"code":"FORBIDDEN","detail":"The caller is not allowed to access this resource.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":403,"title":"Forbidden","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"FORBIDDEN","detail":"The caller is not allowed to access this resource.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":403,"title":"Forbidden","type":"about:blank"}}},"exampleType":"examples"}},"description":"FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"4d8399e5-2c54-48d9-b9cb-4fb1aa19d8df":{"content":{"application/problem+json":{"example":{"code":"METHOD_NOT_ALLOWED","detail":"The requested method is not supported for this route.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":405,"title":"Method not allowed","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"METHOD_NOT_ALLOWED","detail":"The requested method is not supported for this route.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":405,"title":"Method not allowed","type":"about:blank"}}},"exampleType":"examples"}},"description":"METHOD_NOT_ALLOWED: the route does not support this HTTP method.","headers":{"Allow":{"description":"Supported methods: POST.","schema":{"type":"string"}},"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"6663147b-668b-4b6c-bb9c-ca6190445e78":{"content":{"application/problem+json":{"example":{"code":"UPLOAD_TIMEOUT","detail":"The upload did not complete in time.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":408,"title":"SBOM request failed","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"UPLOAD_TIMEOUT","detail":"The upload did not complete in time.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":408,"title":"SBOM request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"UPLOAD_TIMEOUT","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"8d942351-e33c-40c6-9864-8d4e65d6d57b":{"content":{"application/problem+json":{"example":{"code":"INPUT_TOO_LARGE","detail":"The upload exceeds a file, path, count or body limit.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":413,"title":"SBOM request failed","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"INPUT_TOO_LARGE","detail":"The upload exceeds a file, path, count or body limit.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":413,"title":"SBOM request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"INPUT_TOO_LARGE","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"c7e0ca48-8386-4fed-907a-628050ed7899":{"content":{"application/problem+json":{"example":{"code":"UNSUPPORTED_MEDIA_TYPE","detail":"Use multipart/form-data.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":415,"title":"SBOM request failed","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"UNSUPPORTED_MEDIA_TYPE","detail":"Use multipart/form-data.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":415,"title":"SBOM request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"UNSUPPORTED_MEDIA_TYPE","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"f6b2f85d-72a2-48e8-b331-40917867498d":{"content":{"application/problem+json":{"example":{"code":"NO_MANIFEST_EVIDENCE","detail":"Supply a manifest with named package evidence or a supported lockfile.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":422,"title":"SBOM request failed","type":"about:blank"},"schema":{"oneOf":[{"type":"object","description":"The stable problem document returned for an unsuccessful public API request.","required":["type","title","status","detail","instance","code"],"properties":{"code":{"type":"string","description":"The stable uppercase API error code.","enum":["NO_MANIFEST_EVIDENCE","UNREPRESENTABLE_SPDX","SBOM_OUTPUT_TOO_LARGE"],"isRequired":true,"uniqueKey":"oneOf.0.code","typeLabel":"enum\u003cstring>"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"oneOf.0.status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"oneOf.0.acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"oneOf.0.retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"oneOf.0.terms_url","typeLabel":"string"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"File-specific diagnostics returned only when generation rejects uploaded inputs.","required":["files","type","title","status","detail","instance","code"],"properties":{"code":{"type":"string","description":"The stable uppercase API error code.","enum":["UNUSABLE_MANIFEST"],"isRequired":true,"uniqueKey":"oneOf.1.code","typeLabel":"enum\u003cstring>"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"oneOf.1.status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.type","typeLabel":"string"},"files":{"description":"Unusable uploaded files; paths refer only to this request's uploads.","items":{"description":"One rejected uploaded file, without parser diagnostics.","properties":{"path":{"description":"Original repository-relative filename supplied by the caller.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.files.items.[INDEX].path","typeLabel":"string"},"status":{"description":"Why this file could not contribute evidence.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.files.items.[INDEX].status","typeLabel":"string"}},"required":["path","status"],"type":"object","uniqueKey":"oneOf.1.files.items.[INDEX]","typeLabel":"object"},"maxItems":256,"minItems":1,"type":"array","isRequired":true,"uniqueKey":"oneOf.1.files","typeLabel":"object[]"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"oneOf.1.acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"oneOf.1.retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"oneOf.1.terms_url","typeLabel":"string"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"NO_MANIFEST_EVIDENCE","detail":"Supply a manifest with named package evidence or a supported lockfile.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":422,"title":"SBOM request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"UNUSABLE_MANIFEST, NO_MANIFEST_EVIDENCE, UNREPRESENTABLE_SPDX, SBOM_OUTPUT_TOO_LARGE","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"07048bc3-6b53-4899-a69c-ca978da5bc34":{"content":{"application/problem+json":{"example":{"code":"RATE_LIMITED","detail":"The request was rate limited.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":429,"title":"Rate limited","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"RATE_LIMITED","detail":"The request was rate limited.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":429,"title":"Rate limited","type":"about:blank"}}},"exampleType":"examples"}},"description":"RATE_LIMITED RATE_LIMITED also represents shared daily allowance exhaustion (upstream QUOTA_EXCEEDED). Retry-After uses the upstream HTTP header when supplied, otherwise an HTTP date derived from reset_at. Retry after that time.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"Retry-After":{"description":"Validated delay or HTTP-date for quota reset, when available.","schema":{"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"c9045f34-ac16-480a-836b-a75f8e9215f4":{"description":"Request identity could not be created. Empty body without X-Request-ID; no problem object is available.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}}},"x-githits-empty-identity-failure":true,"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"7e8f5b0f-96eb-420c-b143-b290b541731f":{"content":{"application/problem+json":{"example":{"code":"UPSTREAM_ERROR","detail":"The upstream service failed to provide a response.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":502,"title":"Upstream error","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"UPSTREAM_ERROR","detail":"The upstream service failed to provide a response.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":502,"title":"Upstream error","type":"about:blank"}}},"exampleType":"examples"}},"description":"UPSTREAM_ERROR","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"d19936ed-6520-4830-888b-73ab362966d3":{"content":{"application/problem+json":{"example":{"code":"SBOM_UNAVAILABLE","detail":"SBOM generation is temporarily unavailable.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":503,"title":"SBOM request failed","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"SBOM_UNAVAILABLE","detail":"SBOM generation is temporarily unavailable.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":503,"title":"SBOM request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"SBOM_UNAVAILABLE, UPSTREAM_UNAVAILABLE QUOTA_UNAVAILABLE: daily usage authorization is temporarily unavailable; retryable, retry the same request.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"d0b0b716-b165-4441-9ae2-2ecf072c6d60":{"content":{"application/problem+json":{"example":{"code":"TIMEOUT","detail":"The upstream request did not complete in time.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":504,"title":"Upstream timeout","type":"about:blank"},"schema":{"description":"The stable problem document returned for an unsuccessful public API request.","properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Client-safe explanation. Classified upstream service failures use nonempty REST-suitable guidance when available; otherwise gateway guidance is used. Internal, unclassified and transport diagnostics remain private. Wording is not stable; use code and structured fields. Local validation identifies the first invalid field (including array indices) and a reason; version-tag errors include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"The active request trace ID.","type":"string","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"status":{"description":"The HTTP status returned with this problem.","format":"int32","minimum":0,"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer\u003cint32>"},"title":{"description":"A short, stable title for the error.","type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"description":"The generic RFC 9457 problem type.","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"acceptance_url","typeLabel":"string"},"retryable":{"description":"Retryability for transient quota authorization failures, when known.","type":"boolean","uniqueKey":"retryable","typeLabel":"boolean"},"terms_url":{"description":"Link to the terms that require acceptance, when provided.","type":"string","uniqueKey":"terms_url","typeLabel":"string"}},"required":["type","title","status","detail","instance","code"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"TIMEOUT","detail":"The upstream request did not complete in time.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":504,"title":"Upstream timeout","type":"about:blank"}}},"exampleType":"examples"}},"description":"TIMEOUT","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"}},"security":{"38edb085-e6bc-4225-92f2-ba4e1afb5748":{"bearer_auth":{"scheme":"bearer","type":"http","scopes":[],"schemeName":"bearer_auth"}}},"servers":{"078a74e7-4d25-496a-979d-4eff5db36c94":{"description":"Production","url":"https://api.githits.dev"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"scheme":"bearer","type":"http","scopes":[],"schemeName":"bearer_auth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearer_auth","name":"Authorization"}],"title":"bearer_auth"}]},"originalFileLocation":"https://api.githits.dev/v1/openapi.json"},"subdomain":"githits","siteName":"GitHits","title":"Generate an SBOM from uploaded files - GitHits","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T15:08:52.059Z","originalFileLocation":"api-reference/v1/experimental/generate-an-sbom-from-uploaded-files.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=\"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@Cargo.toml;filename=Cargo.toml\u0026#x27; \\ --form \u0026#x27;files[]=@Cargo.lock;filename=Cargo.lock\u0026#x27; \\ --output bom.cdx.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/sbom?format=cyclonedx\u0026#x27; For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data. On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM. Upload rules Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format. Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored. Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile. Choose an output | format | Response Content-Type | Contents | | --- | --- | --- | | cyclonedx (default) | application/vnd.cyclonedx+json | CycloneDX 1.7 JSON | | spdx | text/spdx | SPDX 2.3 tag-value, not JSON | | text | text/plain | Human-readable inventory report, not a standard SBOM serialization | All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example\u0026#x27;s query to ?format=spdx or ?format=text, or add --form \u0026#x27;format=spdx\u0026#x27;; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported. Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields. Interpret the inventory One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result. In CycloneDX, find the document-level property named githits:completeness by name rather than array position: | Value | Meaning | | --- | --- | | resolved_manifest_inventory | Inventory from manifest dependency resolution | | partial_manifest_inventory | Resolution is incomplete; the component list can be empty | | recorded_lockfile_inventory | Inventory recorded in uploaded lockfiles | | mixed_dependency_inventory | Lockfile records plus separately resolved manifests | None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value. Analysis admission and cost Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present. At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation. Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission. Handle errors and retries Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples. | Status / code | Caller action | | --- | --- | | 400 VALIDATION_ERROR | Correct multipart fields, filenames or format values before retrying. | | 401 AUTHENTICATION_REQUIRED | Supply a valid Bearer credential. | | 403 FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED | Resolve credential access, account eligibility or terms acceptance. | | 408 UPLOAD_TIMEOUT | Ensure the upload can finish within 30 seconds. | | 413 INPUT_TOO_LARGE | Reduce file count, path length or bytes to the documented limits. | | 415 UNSUPPORTED_MEDIA_TYPE | Send multipart/form-data with a valid boundary. | | 422 UNUSABLE_MANIFEST | Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected. | | 422 NO_MANIFEST_EVIDENCE | Supply a manifest with named package evidence or a supported lockfile. | | 422 UNREPRESENTABLE_SPDX | Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent. | | 422 SBOM_OUTPUT_TOO_LARGE | Reduce the requested inventory; the generated document exceeded an output limit. | | 429 RATE_LIMITED | Respect Retry-After when present. | | 502 UPSTREAM_ERROR, 503 SBOM_UNAVAILABLE / UPSTREAM_UNAVAILABLE | A service failure prevented generation; retry later if appropriate. | | 504 TIMEOUT | Generation exceeded a service deadline; a retry may repeat work. | Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\">\u003cmeta data-mint-head name=\"application-name\" content=\"GitHits\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_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/githits/hPN3FB6to_tLCtYP/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Generate an SBOM from uploaded files - GitHits\">\u003cmeta data-mint-head property=\"og:description\" content=\"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@Cargo.toml;filename=Cargo.toml\u0026#x27; \\ --form \u0026#x27;files[]=@Cargo.lock;filename=Cargo.lock\u0026#x27; \\ --output bom.cdx.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/sbom?format=cyclonedx\u0026#x27; For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data. On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM. Upload rules Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format. Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored. Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile. Choose an output | format | Response Content-Type | Contents | | --- | --- | --- | | cyclonedx (default) | application/vnd.cyclonedx+json | CycloneDX 1.7 JSON | | spdx | text/spdx | SPDX 2.3 tag-value, not JSON | | text | text/plain | Human-readable inventory report, not a standard SBOM serialization | All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example\u0026#x27;s query to ?format=spdx or ?format=text, or add --form \u0026#x27;format=spdx\u0026#x27;; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported. Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields. Interpret the inventory One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result. In CycloneDX, find the document-level property named githits:completeness by name rather than array position: | Value | Meaning | | --- | --- | | resolved_manifest_inventory | Inventory from manifest dependency resolution | | partial_manifest_inventory | Resolution is incomplete; the component list can be empty | | recorded_lockfile_inventory | Inventory recorded in uploaded lockfiles | | mixed_dependency_inventory | Lockfile records plus separately resolved manifests | None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value. Analysis admission and cost Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present. At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation. Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission. Handle errors and retries Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples. | Status / code | Caller action | | --- | --- | | 400 VALIDATION_ERROR | Correct multipart fields, filenames or format values before retrying. | | 401 AUTHENTICATION_REQUIRED | Supply a valid Bearer credential. | | 403 FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED | Resolve credential access, account eligibility or terms acceptance. | | 408 UPLOAD_TIMEOUT | Ensure the upload can finish within 30 seconds. | | 413 INPUT_TOO_LARGE | Reduce file count, path length or bytes to the documented limits. | | 415 UNSUPPORTED_MEDIA_TYPE | Send multipart/form-data with a valid boundary. | | 422 UNUSABLE_MANIFEST | Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected. | | 422 NO_MANIFEST_EVIDENCE | Supply a manifest with named package evidence or a supported lockfile. | | 422 UNREPRESENTABLE_SPDX | Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent. | | 422 SBOM_OUTPUT_TOO_LARGE | Reduce the requested inventory; the generated document exceeded an output limit. | | 429 RATE_LIMITED | Respect Retry-After when present. | | 502 UPSTREAM_ERROR, 503 SBOM_UNAVAILABLE / UPSTREAM_UNAVAILABLE | A service failure prevented generation; retry later if appropriate. | | 504 TIMEOUT | Generation exceeded a service deadline; a retry may repeat work. | Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"GitHits\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://githits.mintlify.app/_mintlify/api/og/v2?division=Experimental\u0026amp;title=Generate+an+SBOM+from+uploaded+files\u0026amp;description=Generate+a+dependency+inventory+from+manifest+and+lockfile+uploads+without+creating+a+project.+Manifest-only+inputs+resolve+concrete+versions+and+transitives.+C\u0026amp;theme=09db3a93f8c5f10dfeb89a5d\u0026amp;signature=2f18536a659027af4e9e870a0fb793cbf9f53228082d0a307bfecfffe0f90875\">\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=\"Generate an SBOM from uploaded files - GitHits\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@Cargo.toml;filename=Cargo.toml\u0026#x27; \\ --form \u0026#x27;files[]=@Cargo.lock;filename=Cargo.lock\u0026#x27; \\ --output bom.cdx.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/sbom?format=cyclonedx\u0026#x27; For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data. On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM. Upload rules Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format. Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored. Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile. Choose an output | format | Response Content-Type | Contents | | --- | --- | --- | | cyclonedx (default) | application/vnd.cyclonedx+json | CycloneDX 1.7 JSON | | spdx | text/spdx | SPDX 2.3 tag-value, not JSON | | text | text/plain | Human-readable inventory report, not a standard SBOM serialization | All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example\u0026#x27;s query to ?format=spdx or ?format=text, or add --form \u0026#x27;format=spdx\u0026#x27;; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported. Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields. Interpret the inventory One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result. In CycloneDX, find the document-level property named githits:completeness by name rather than array position: | Value | Meaning | | --- | --- | | resolved_manifest_inventory | Inventory from manifest dependency resolution | | partial_manifest_inventory | Resolution is incomplete; the component list can be empty | | recorded_lockfile_inventory | Inventory recorded in uploaded lockfiles | | mixed_dependency_inventory | Lockfile records plus separately resolved manifests | None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value. Analysis admission and cost Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present. At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation. Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission. Handle errors and retries Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples. | Status / code | Caller action | | --- | --- | | 400 VALIDATION_ERROR | Correct multipart fields, filenames or format values before retrying. | | 401 AUTHENTICATION_REQUIRED | Supply a valid Bearer credential. | | 403 FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED | Resolve credential access, account eligibility or terms acceptance. | | 408 UPLOAD_TIMEOUT | Ensure the upload can finish within 30 seconds. | | 413 INPUT_TOO_LARGE | Reduce file count, path length or bytes to the documented limits. | | 415 UNSUPPORTED_MEDIA_TYPE | Send multipart/form-data with a valid boundary. | | 422 UNUSABLE_MANIFEST | Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected. | | 422 NO_MANIFEST_EVIDENCE | Supply a manifest with named package evidence or a supported lockfile. | | 422 UNREPRESENTABLE_SPDX | Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent. | | 422 SBOM_OUTPUT_TOO_LARGE | Reduce the requested inventory; the generated document exceeded an output limit. | | 429 RATE_LIMITED | Respect Retry-After when present. | | 502 UPSTREAM_ERROR, 503 SBOM_UNAVAILABLE / UPSTREAM_UNAVAILABLE | A service failure prevented generation; retry later if appropriate. | | 504 TIMEOUT | Generation exceeded a service deadline; a retry may repeat work. | Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://githits.mintlify.app/_mintlify/api/og/v2?division=Experimental\u0026amp;title=Generate+an+SBOM+from+uploaded+files\u0026amp;description=Generate+a+dependency+inventory+from+manifest+and+lockfile+uploads+without+creating+a+project.+Manifest-only+inputs+resolve+concrete+versions+and+transitives.+C\u0026amp;theme=09db3a93f8c5f10dfeb89a5d\u0026amp;signature=2f18536a659027af4e9e870a0fb793cbf9f53228082d0a307bfecfffe0f90875\">\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/githits/hPN3FB6to_tLCtYP/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"GitHits\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c03b83\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.githits.com/#organization\",\"name\":\"GitHits\",\"url\":\"https://docs.githits.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/githits/nEuGn8_ZROo1DncD/images/githits-wordmark.svg?fit=max\u0026auto=format\u0026n=nEuGn8_ZROo1DncD\u0026q=85\u0026s=33b1a4083b1476ad8520731d35d55987\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.githits.com#website\",\"name\":\"GitHits\",\"url\":\"https://docs.githits.com\",\"publisher\":{\"@id\":\"https://docs.githits.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files#webpage\",\"url\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files\",\"name\":\"Generate an SBOM from uploaded files\",\"description\":\"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = \\\"Authorization: Bearer \\\"; replace the placeholder privately. Run from your repository root: sh curl --config /path/to/private-auth.conf \\\\ --fail-with-body --silent --show-error \\\\ --form 'files[]=@Cargo.toml;filename=Cargo.toml' \\\\ --form 'files[]=@Cargo.lock;filename=Cargo.lock' \\\\ --output bom.cdx.json \\\\ 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx' For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data. On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM. Upload rules Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format. Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored. Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile. Choose an output | format | Response Content-Type | Contents | | --- | --- | --- | | cyclonedx (default) | application/vnd.cyclonedx+json | CycloneDX 1.7 JSON | | spdx | text/spdx | SPDX 2.3 tag-value, not JSON | | text | text/plain | Human-readable inventory report, not a standard SBOM serialization | All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example's query to ?format=spdx or ?format=text, or add --form 'format=spdx'; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported. Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields. Interpret the inventory One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result. In CycloneDX, find the document-level property named githits:completeness by name rather than array position: | Value | Meaning | | --- | --- | | resolved_manifest_inventory | Inventory from manifest dependency resolution | | partial_manifest_inventory | Resolution is incomplete; the component list can be empty | | recorded_lockfile_inventory | Inventory recorded in uploaded lockfiles | | mixed_dependency_inventory | Lockfile records plus separately resolved manifests | None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value. Analysis admission and cost Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present. At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation. Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission. Handle errors and retries Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples. | Status / code | Caller action | | --- | --- | | 400 VALIDATION_ERROR | Correct multipart fields, filenames or format values before retrying. | | 401 AUTHENTICATION_REQUIRED | Supply a valid Bearer credential. | | 403 FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED | Resolve credential access, account eligibility or terms acceptance. | | 408 UPLOAD_TIMEOUT | Ensure the upload can finish within 30 seconds. | | 413 INPUT_TOO_LARGE | Reduce file count, path length or bytes to the documented limits. | | 415 UNSUPPORTED_MEDIA_TYPE | Send multipart/form-data with a valid boundary. | | 422 UNUSABLE_MANIFEST | Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected. | | 422 NO_MANIFEST_EVIDENCE | Supply a manifest with named package evidence or a supported lockfile. | | 422 UNREPRESENTABLE_SPDX | Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent. | | 422 SBOM_OUTPUT_TOO_LARGE | Reduce the requested inventory; the generated document exceeded an output limit. | | 429 RATE_LIMITED | Respect Retry-After when present. | | 502 UPSTREAM_ERROR, 503 SBOM_UNAVAILABLE / UPSTREAM_UNAVAILABLE | A service failure prevented generation; retry later if appropriate. | | 504 TIMEOUT | Generation exceeded a service deadline; a retry may repeat work. | Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\",\"dateModified\":\"2026-10-23T15:08:52.059Z\",\"isPartOf\":{\"@id\":\"https://docs.githits.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"v1 reference\",\"item\":\"https://docs.githits.com/api-reference/v1/packages/get-a-package-or-repository-changelog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Experimental\",\"item\":\"https://docs.githits.com/api-reference/v1/experimental/compare-two-exact-source-trees\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Generate an SBOM from uploaded files\",\"item\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files#apireference\",\"headline\":\"Generate an SBOM from uploaded files\",\"name\":\"Generate an SBOM from uploaded files\",\"description\":\"Generate a dependency inventory from manifest and lockfile uploads without creating a project. Manifest-only inputs resolve concrete versions and transitives. Compatible lockfiles supply recorded versions for associated manifests; uncovered manifests resolve separately. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In the example, private-auth.conf is a caller-owned protected curl configuration containing header = \\\"Authorization: Bearer \\\"; replace the placeholder privately. Run from your repository root: sh curl --config /path/to/private-auth.conf \\\\ --fail-with-body --silent --show-error \\\\ --form 'files[]=@Cargo.toml;filename=Cargo.toml' \\\\ --form 'files[]=@Cargo.lock;filename=Cargo.lock' \\\\ --output bom.cdx.json \\\\ 'https://api.githits.dev/v1/experimental/sbom?format=cyclonedx' For npm, replace the two files with package.json and package-lock.json. For a nested project, use both the actual local path and the repository-relative filename, for example files[]=@app/package.json;filename=app/package.json. Repeat files[] for each file. Let curl set Content-Type and the multipart boundary. Send individual manifests and lockfiles, not an archive, repository URL or base64 data. On success the output file contains the document itself. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before importing it as an SBOM. Upload rules Send repeated files[] parts with repository-relative filenames and raw UTF-8 contents. Keep directories intact, for example app/package.json and app/package-lock.json. Only files[] and optional format are accepted. The complete multipart body, including framing, is limited to 8,000,000 bytes: 1–256 files, each at most 5,242,880 bytes, with filenames at most 1,024 UTF-8 bytes. Empty, dot and parent path segments, backslashes and controls are invalid. Unknown fields, missing filenames and duplicate format values in one location are rejected. A malformed query format is invalid even when multipart supplies a format. Supported manifest examples include Cargo.toml, package.json, pyproject.toml, Pipfile, go.mod, mix.exs and rebar.config. This list is non-exhaustive; support depends on the contents, not just the filename. go.sum and requirements.txt are unsupported: do not include them as companion files. One unusable file rejects the entire upload with 422 UNUSABLE_MANIFEST; companion files are not silently ignored. Supported lockfile families include Cargo, npm, pnpm, Yarn classic and Berry, uv, Poetry, PDM, Pipenv, Swift, Gradle, NuGet, Dart, Composer, Mix, Bundler, Rebar, Conan and Go dep. Filename and contents determine recognition; renaming an unsupported file does not add support. Lockfiles can be uploaded alone. A compatible same-directory lockfile supplies recorded versions for its manifest; this does not verify that the lockfile is up to date. For monorepos, preserve all relative paths; a nested manifest does not automatically inherit an ancestor lockfile. Choose an output | format | Response Content-Type | Contents | | --- | --- | --- | | cyclonedx (default) | application/vnd.cyclonedx+json | CycloneDX 1.7 JSON | | spdx | text/spdx | SPDX 2.3 tag-value, not JSON | | text | text/plain | Human-readable inventory report, not a standard SBOM serialization | All outputs use UTF-8 and are limited to 16,777,216 bytes. Change the example's query to ?format=spdx or ?format=text, or add --form 'format=spdx'; the multipart value wins. Accept does not select the format. Success returns HTTP 200 with the direct document, without a JSON wrapper or retrieval URL. No fields selector is supported. Standard document fields retain their standard spelling. The response schema describes an extensible subset of CycloneDX 1.7, not a field allowlist: additional standard metadata, component, license, dependency and other fields are accepted at every object level. Clients must preserve or ignore unfamiliar fields. SPDX tag-value documents may likewise include additional standard fields. Interpret the inventory One unusable file rejects the upload. Incomplete resolution and missing licenses can still produce a successful partial document. License declarations are evidence, not legal conclusions or artifact verification. Lockfile agreement and platform conditions are not checked. Preserve completeness, provenance, license expression/name variants and optional PURLs when consuming the result. In CycloneDX, find the document-level property named githits:completeness by name rather than array position: | Value | Meaning | | --- | --- | | resolved_manifest_inventory | Inventory from manifest dependency resolution | | partial_manifest_inventory | Resolution is incomplete; the component list can be empty | | recorded_lockfile_inventory | Inventory recorded in uploaded lockfiles | | mixed_dependency_inventory | Lockfile records plus separately resolved manifests | None guarantees an exact installed inventory or complete license coverage. Inspect githits:resolutions and githits:manifest_associations for per-manifest evidence. Structured githits: property values are JSON encoded inside strings and require a separate decode. Component names are not unique; retain bom-ref for document relationships. A missing version, PURL or license means unavailable evidence, not permission to invent a value. Analysis admission and cost Synchronous SBOM and asynchronous SBOM/audit submissions share a backend analysis submission bucket. Current defaults allow 2 submissions per personal principal or 5 per organization/project principal in a first-hit fixed 60-second window; project credentials in the same organization share that principal. These are policy defaults, subject to runtime overrides. Backend admission is authoritative: handle 429 RATE_LIMITED and respect Retry-After when present. At current policy defaults, a normally metered analysis reserves 100 weighted daily units from the same daily budget used by ordinary metered tool requests: one analysis costs as much as 100 ordinary metered calls. Both operation costs can be overridden by runtime policy. Gateway operation telemetry (githits.cost=1) is provisional and does not describe this backend debit. The short-rate bucket is checked before parsing. Normal daily admission reserves the 100 units after format/size preflight but before parsing; later parser, resolution or rendering failures do not refund the reservation. Unsupported companion files can therefore reject the entire upload after reservation. Gateway-local validation rejections make no backend call and consume neither backend bucket. A backend 422 can follow reservation; transport or admission-authority failures can leave the charge unknown or unmetered. An error response alone proves neither a refund nor an exact debit. Avoid submitting the same analysis again unless you intend another admission. Handle errors and retries Errors use application/problem+json in every output format. Branch on code, not detail, and retain X-Request-ID for support. The response definitions below provide problem schemas and examples. | Status / code | Caller action | | --- | --- | | 400 VALIDATION_ERROR | Correct multipart fields, filenames or format values before retrying. | | 401 AUTHENTICATION_REQUIRED | Supply a valid Bearer credential. | | 403 FORBIDDEN, ACCOUNT_INACTIVE, TERMS_ACCEPTANCE_REQUIRED | Resolve credential access, account eligibility or terms acceptance. | | 408 UPLOAD_TIMEOUT | Ensure the upload can finish within 30 seconds. | | 413 INPUT_TOO_LARGE | Reduce file count, path length or bytes to the documented limits. | | 415 UNSUPPORTED_MEDIA_TYPE | Send multipart/form-data with a valid boundary. | | 422 UNUSABLE_MANIFEST | Inspect files: each entry identifies the original path and status (unsupported, invalid_utf8 or unparsed). Correct or remove those inputs; the entire upload was rejected. | | 422 NO_MANIFEST_EVIDENCE | Supply a manifest with named package evidence or a supported lockfile. | | 422 UNREPRESENTABLE_SPDX | Request cyclonedx to preserve names or versions that SPDX tag-value cannot represent. | | 422 SBOM_OUTPUT_TOO_LARGE | Reduce the requested inventory; the generated document exceeded an output limit. | | 429 RATE_LIMITED | Respect Retry-After when present. | | 502 UPSTREAM_ERROR, 503 SBOM_UNAVAILABLE / UPSTREAM_UNAVAILABLE | A service failure prevented generation; retry later if appropriate. | | 504 TIMEOUT | Generation exceeded a service deadline; a retry may repeat work. | Uploads and documents are not retained for retrieval. Save the response. Repeated requests regenerate the document and consume request quota. Client upload has a 30-second deadline; the gateway allows 150 seconds for the upstream exchange, including the complete response read, in addition to upload time. A timeout does not guarantee processing stopped. Avoid unconditional retries: there is no idempotency key or saved result to resume.\",\"url\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files\",\"mainEntityOfPage\":{\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files#webpage\"},\"dateModified\":\"2026-10-23T15:08:52.059Z\",\"publisher\":{\"@id\":\"https://docs.githits.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.githits.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"GitHits\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"GitHits","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API","groups":[{"group":"Get started","pages":[{"title":"GitHits REST API","sidebarTitle":"Overview","href":"/api/overview"},{"title":"API quickstart","href":"/api/quickstart"},{"title":"API authentication","href":"/api/authentication"},{"title":"Requests and responses","href":"/api/requests-and-responses"},{"title":"Analyze manifests and lockfiles","sidebarTitle":"Lockfile analysis","href":"/api/lockfile-analysis"},{"title":"API errors","href":"/api/errors"},{"title":"API versioning","href":"/api/versioning"}]},{"group":"v1 reference","pages":[{"group":"Packages","pages":[{"title":"Get a package or repository changelog","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/changelog","href":"/api-reference/v1/packages/get-a-package-or-repository-changelog"},{"title":"Review package upgrades","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/package-upgrade-reviews","href":"/api-reference/v1/packages/review-package-upgrades"},{"title":"Inspect a package release","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/packages/{registry}/{name}","href":"/api-reference/v1/packages/inspect-a-package-release"},{"title":"Inspect package dependencies","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/packages/{registry}/{name}/dependencies","href":"/api-reference/v1/packages/inspect-package-dependencies"},{"title":"Inspect package vulnerabilities","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/packages/{registry}/{name}/vulnerabilities","href":"/api-reference/v1/packages/inspect-package-vulnerabilities"}]},{"group":"Code Diff","pages":[{"title":"Compare two exact source trees","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/code/diff","href":"/api-reference/v1/code-diff/compare-two-exact-source-trees"}]},{"group":"Examples","pages":[{"title":"Generate an example from open-source references","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/examples/search","href":"/api-reference/v1/examples/generate-an-example-from-open-source-references"}]},{"group":"Experimental","pages":[{"title":"Compare two exact source trees","deprecated":true,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/code/diff","href":"/api-reference/v1/experimental/compare-two-exact-source-trees"},{"title":"Submit a lockfile analysis job","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/lockfile-jobs","href":"/api-reference/v1/experimental/submit-a-lockfile-analysis-job"},{"title":"Get lockfile analysis status","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/experimental/lockfile-jobs/{id}","href":"/api-reference/v1/experimental/get-lockfile-analysis-status"},{"title":"Stream lockfile analysis progress","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/experimental/lockfile-jobs/{id}/events","href":"/api-reference/v1/experimental/stream-lockfile-analysis-progress"},{"title":"Download a completed lockfile analysis","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/experimental/lockfile-jobs/{id}/result","href":"/api-reference/v1/experimental/download-a-completed-lockfile-analysis"},{"title":"Research a question with cited sources","description":"Research a question about a package, GitHub repository, or documentation site and receive a Markdown answer with links to its sources. Continue the conversation with follow-up questions in the same thread. Answer generation can take up to 210 seconds.\n\nUse this experimental endpoint when you want an explanation based on project documentation and code.\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/research","href":"/api-reference/v1/experimental/research-a-question-with-cited-sources"},{"title":"Generate an SBOM from uploaded files","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/sbom","href":"/api-reference/v1/experimental/generate-an-sbom-from-uploaded-files"},{"title":"Resolve a target name","description":"Find packages, repositories, and documentation sites from a name. Results include ranked matches and related projects to help you identify the project you mean.\n\nUse this experimental endpoint when you know a project name but need its package coordinates or repository or documentation address for another GitHits request.\n\n## Selector catalogue\n\nUse the following selectors with the `fields` query parameter to choose which fields the response includes. See [Choose what the response includes](https://docs.githits.com/api/requests-and-responses#choose-what-the-response-includes) for details.\n\n| Selector | Data | Default |\n| --- | --- | --- |\n| `details` | Target display_name, description, repository_url, repository_owner, repository_name, documentation_url and license. | Yes |\n| `availability` | Target docs_available, code_available, docs_page_count, code_file_count, stars, downloads_last_month and downloads_total. | Yes |\n| `ranking` | Direct-match matched_aliases, match_tier, score and name_similarity. | No |\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/targets/resolve","href":"/api-reference/v1/experimental/resolve-a-target-name"}]},{"group":"Feedback","pages":[{"title":"Submit solution or session feedback","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/feedback","href":"/api-reference/v1/feedback/submit-solution-or-session-feedback"}]},{"group":"Grep","pages":[{"title":"Find regex or literal matches across source and documentation","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/grep","href":"/api-reference/v1/grep/find-regex-or-literal-matches-across-source-and-documentation"}]},{"group":"Languages","pages":[{"title":"Search supported programming languages","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/languages","href":"/api-reference/v1/languages/search-supported-programming-languages"}]},{"group":"List","pages":[{"title":"List files and documentation paths","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/list","href":"/api-reference/v1/list/list-files-and-documentation-paths"}]},{"group":"Read","pages":[{"title":"Read documentation or source code","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/read","href":"/api-reference/v1/read/read-documentation-or-source-code"}]},{"group":"Search","pages":[{"title":"Search documentation, code and symbols","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/searches","href":"/api-reference/v1/search/search-documentation-code-and-symbols"},{"title":"Get search status and retained results","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/searches/{search_ref}","href":"/api-reference/v1/search/get-search-status-and-retained-results"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/overview"}]}]},"title":"Generate an SBOM from uploaded files - GitHits","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-CBCH2P7b.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}