Create a JSON license report from your project’s manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known.
First request
Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = "Authorization: Bearer <token>"; replace the placeholder privately and keep the file outside your repository.
Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format.
On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component’s bom_ref is not an analysis job ID.
Inputs and limits
Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem’s files entries for its path and status.
Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments.
The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume.
Long-running work and usage
For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom&format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow.
At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job’s licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries.
Read the report
Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas.
Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry’s value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn.
Handle errors
Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present.
Status / code
What to do
400 VALIDATION_ERROR / INVALID_SESSION_ID
Correct the field named in detail, the upload parts, or the session header.
401 / 403
Check the credential, account access and required terms; use any provided terms/acceptance links.
408 / 413 / 415
Meet the upload deadline and size/path/count limits; send valid multipart data.
422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE
Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved.
The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available.
429 RATE_LIMITED
Wait until the supplied Retry-After time before trying again.
502 UPSTREAM_ERROR
The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis.
503
Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job.
504 TIMEOUT
Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free.
Responses must not be cached (Cache-Control: no-store).
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.
Required string length: 1 - 64
Pattern: ^[A-Za-z0-9_-]{1,64}$
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.
Required array length: 1 - 256 elements
Response
JSON license report, at most 16,777,216 bytes. Read inventory coverage and component evidence together; a successful response may be partial and does not provide a pass/fail decision.
JSON license inventory with separate license choices, publisher statements and source-file observations, plus input attribution and coverage. It provides evidence for your own evaluation rather than an allow/deny result. Additional fields can appear.
All reported occurrences in their original order, with the selected primary project/source entry first when one exists. Keep repeated names, versions and package URLs separate; use bom_ref and input-path properties for attribution.
Input provenance, inventory coverage and reported dependency relationships. Read these facts alongside the component list; successful analysis can still be partial.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"GitHits","colors":{"primary":"#cc3f8b","light":"#ff72be","dark":"#cc3f8b"},"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":{"heading":{"family":"Lexend","weight":600},"body":{"family":"Onest"}},"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":"6aec8b8a802fe9fbb765e027","collectionId":"44fa3485-93e2-448f-87f1-8c681d333d9f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aec8b8a802fe9fbb765e027"},"feedback":{"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aedaebccc98a9ae37e0bb52","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"API","count":34},{"language":"default","tag":"Documentation","count":28},{"language":"default","tag":"v1 reference","count":27},{"language":"default","tag":"Experimental","count":12},{"language":"default","tag":"Agent tools","count":8},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"Get Started","count":6},{"language":"default","tag":"Scan","count":6},{"language":"default","tag":"Packages","count":5},{"language":"default","tag":"CLI","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":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--githits-primary-200: #ffb8de;--githits-primary-400: #ff72be;--githits-primary-500: #ff4fae;--githits-primary-700: #992f68;--githits-primary-800: #651f45;--githits-neutral-primary: #ffffff;--githits-neutral-secondary: #d5d9df;--githits-neutral-muted: #abb2bf;--githits-neutral-border: #4a4e56;--githits-neutral-background: #21262d;--githits-neutral-surface: #13161a;--githits-text: var(--githits-neutral-border);--githits-heading: var(--githits-neutral-surface);--githits-accent: var(--githits-primary-700);--githits-surface: var(--githits-neutral-primary);--githits-border: var(--githits-neutral-muted);--githits-code-surface: var(--githits-neutral-secondary);--githits-code-text: var(--githits-primary-800);--githits-duration-normal: 200ms;--githits-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1)}html.dark{--githits-text: var(--githits-neutral-secondary);--githits-heading: var(--githits-neutral-primary);--githits-accent: var(--githits-primary-400);--githits-surface: var(--githits-neutral-background);--githits-border: var(--githits-neutral-border);--githits-code-surface: var(--githits-neutral-background);--githits-code-text: var(--githits-primary-200)}html{letter-spacing:0}code,pre{font-family:Consolas, \"SF Mono\", Menlo, Monaco, monospace}#content :not(pre)>code{background:var(--githits-code-surface);color:var(--githits-code-text)}#navbar{border-bottom-color:color-mix(in srgb, var(--githits-primary-500) 18%, transparent)}#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:0.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:0.25rem 0.5rem;border:1px solid var(--githits-accent);border-radius:0.25rem;color:var(--githits-accent);font-family:inherit;font-size:0.625rem;font-weight:600;line-height:1rem;text-transform:uppercase;white-space:nowrap}#navbar a[href=\"/\"] img[src*=\"githits-wordmark\"]{width:6.5rem;height:1.516rem;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:0.25rem}}.githits-beta-note{display:inline-flex;align-items:center;max-width:100%;margin:0.75rem 0 1.5rem;padding:0.5rem 0.75rem;border:1px solid color-mix(in srgb, var(--githits-accent) 34%, transparent);border-radius:8px;background:color-mix(in srgb, var(--githits-accent) 9%, transparent);color:var(--githits-heading);font-size:0.875rem;font-weight:500;line-height:1.5}.githits-command-toolbar{display:flex;justify-content:flex-end;margin:1.5rem 0 -0.25rem}.githits-command-toggle{display:inline-flex;align-items:center;gap:0.625rem;min-height:2.5rem;padding:0.5rem 0.875rem;border:1px solid var(--githits-border);border-radius:8px;background:var(--githits-surface);color:var(--githits-heading);font-size:0.875rem;font-weight:600;line-height:1;cursor:pointer}.githits-command-toggle::after{content:\"\";width:0.5rem;height:0.5rem;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform var(--githits-duration-normal) var(--githits-ease-in-out)}.githits-command-toggle[aria-expanded=\"true\"]::after{transform:rotate(225deg)}.githits-command-toggle:hover{border-color:var(--githits-accent);color:var(--githits-accent)}.githits-command-toggle:focus-visible,.githits-feature-card:focus-visible{outline:2px solid var(--githits-accent);outline-offset:3px}html[data-current-path=\"/cli/commands\"] #content [data-component-part=\"accordion-title-container\"]{display:flex;flex-direction:column;gap:0.25rem;line-height:1.35}html[data-current-path=\"/cli/commands\"] #content [data-component-part=\"accordion-description\"]{color:var(--githits-text);line-height:1.45}.githits-feature-grid{margin-top:1.25rem}.githits-tool-columns{display:grid;grid-template-columns:repeat(auto-fit, minmax(min(100%, 12.5rem), 1fr));gap:1rem}.githits-feature-grid .githits-feature-card{background:transparent;border:1px solid transparent;box-shadow:none;color:var(--githits-heading)}.githits-feature-grid .githits-feature-card:hover{border-color:var(--githits-accent)}.githits-feature-card::before{content:\"\";display:block;aspect-ratio:16 / 9;box-sizing:border-box;background-color:var(--githits-neutral-surface);background-image:var(--githits-illustration);background-size:contain;background-position:center;background-repeat:no-repeat;border:0;border-radius:8px}.githits-feature-code{--githits-illustration: url(\"/images/githits-code-context.svg\")}.githits-feature-docs{--githits-illustration: url(\"/images/githits-open-source-refresh.svg\")}.githits-feature-packages{--githits-illustration: url(\"/images/githits-reasoning-rank.svg\")}.githits-feature-card [data-component-part=\"card-content\"]{color:var(--githits-text)}@media (prefers-reduced-motion: reduce){.githits-command-toggle::after{transition:none}}"}],"page":{"pagePath":"api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files","slug":"/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files","pageMetadata":{"title":"Report dependency licenses from uploaded files","description":"Create a JSON license report from your project's manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In these examples, `/path/to/private-auth.conf` is your own protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately and keep the file outside your repository.\n\nRun from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@package.json;filename=package.json' \\\n --form 'files[]=@package-lock.json;filename=package-lock.json' \\\n --output licenses.json \\\n 'https://api.githits.dev/v1/experimental/licenses'\n```\n\nRepeat the literal field name `files[]` for each file. For a nested project, preserve the path in both places, for example `files[]=@app/package.json;filename=app/package.json`. This lets related manifests and lockfiles be associated. Let curl set the multipart `Content-Type` and boundary. Only `files[]` parts are accepted: do not send query parameters, `kind`, `format`, repository URLs, archives, base64 data or policy files. `Accept` does not change the response format.\n\nOn HTTP 200, `licenses.json` contains the report itself, with `schema_version`, `inventory` and `components`. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component's `bom_ref` is not an analysis job ID.\n\n**Inputs and limits**\n\nSupported inputs are the same as **Generate an SBOM** (`POST /v1/experimental/sbom`): for example `Cargo.toml`/`Cargo.lock`, `package.json`/`package-lock.json`, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. `go.sum` and `requirements.txt` are unsupported companion files. One unusable file rejects the whole upload; inspect the problem's `files` entries for its path and status.\n\nSend 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments.\n\nThe upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume.\n\n**Long-running work and usage**\n\nFor work that may outlast the synchronous request, submit `POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx` with the same files. Its HTTP 202 JSON response supplies an analysis `id`, plus `status_url`, `events_url`, `result_url` and `expires_at`. Follow status or events until `state=succeeded`, then read `GET /v1/experimental/licenses/{id}` using that analysis ID. The **Get dependency licenses** operation shows the complete workflow.\n\nAt current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job's licenses report does not start another analysis or consume another analysis reservation. The `x-githits-cost` value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries.\n\n**Read the report**\n\nKeep separate component entries even when their names, versions or package URLs match. Use `bom_ref` for reported relationships and `properties` for input-file attribution. `licenses` contains license-choice objects; `observed_licenses` contains separate observations. `publisher_evidence` explains original publisher statements and their context; `source_evidence` explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named `properties[].value` strings contain additional JSON and need a separate parse, as described in the response schemas.\n\nNull identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read `inventory.completeness` alongside the component list. Dependency coverage is in `inventory.compositions` and the `inventory.properties` entry named `githits:dependency_coverage`; parse that entry's `value` as JSON. Notices are properties named `githits:notice`. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use `snake_case`; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as `dependsOn`.\n\n**Handle errors**\n\nProblems use `application/problem+json`. Branch on `code`, keep `X-Request-ID` for support, and respect `Retry-After` when present.\n\n| Status / code | What to do |\n| --- | --- |\n| 400 `VALIDATION_ERROR` / `INVALID_SESSION_ID` | Correct the field named in `detail`, the upload parts, or the session header. |\n| 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. |\n| 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. |\n| 422 `UNUSABLE_MANIFEST` / `NO_MANIFEST_EVIDENCE` | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. |\n| 422 `LICENSE_REPORT_TOO_LARGE` / `SBOM_OUTPUT_TOO_LARGE` | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through `result_url` when that document is available. |\n| 429 `RATE_LIMITED` | Wait until the supplied `Retry-After` time before trying again. |\n| 502 `UPSTREAM_ERROR` | The analysis result could not be read. Keep `X-Request-ID` and report a persistent failure; repeating POST may create another charged analysis. |\n| 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. |\n| 504 `TIMEOUT` | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. |\n\nResponses must not be cached (`Cache-Control: no-store`).\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/licenses","href":"/api-reference/v1/experimental/report-dependency-licenses-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: \"Create a JSON license report from your project’s manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known.\"\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 these examples, \", _jsx(_components.code, {\n children: \"/path/to/private-auth.conf\"\n }), \" is your own protected curl configuration containing \", _jsx(_components.code, {\n children: \"header = \\\"Authorization: Bearer \u003ctoken>\\\"\"\n }), \"; replace the placeholder privately and keep the file outside your repository.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"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[]=@package.json;filename=package.json'\"\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[]=@package-lock.json;filename=package-lock.json'\"\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: \" licenses.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/licenses'\"\n })\n }), \"\\n\"]\n })\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Repeat the literal field name \", _jsx(_components.code, {\n children: \"files[]\"\n }), \" for each file. For a nested project, preserve the path in both places, for example \", _jsx(_components.code, {\n children: \"files[]=@app/package.json;filename=app/package.json\"\n }), \". This lets related manifests and lockfiles be associated. Let curl set the multipart \", _jsx(_components.code, {\n children: \"Content-Type\"\n }), \" and boundary. Only \", _jsx(_components.code, {\n children: \"files[]\"\n }), \" parts are accepted: do not send query parameters, \", _jsx(_components.code, {\n children: \"kind\"\n }), \", \", _jsx(_components.code, {\n children: \"format\"\n }), \", repository URLs, archives, base64 data or policy files. \", _jsx(_components.code, {\n children: \"Accept\"\n }), \" does not change the response format.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"On HTTP 200, \", _jsx(_components.code, {\n children: \"licenses.json\"\n }), \" contains the report itself, with \", _jsx(_components.code, {\n children: \"schema_version\"\n }), \", \", _jsx(_components.code, {\n children: \"inventory\"\n }), \" and \", _jsx(_components.code, {\n children: \"components\"\n }), \". On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component’s \", _jsx(_components.code, {\n children: \"bom_ref\"\n }), \" is not an analysis job ID.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Inputs and limits\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Supported inputs are the same as \", _jsx(_components.strong, {\n children: \"Generate an SBOM\"\n }), \" (\", _jsx(_components.code, {\n children: \"POST /v1/experimental/sbom\"\n }), \"): for example \", _jsx(_components.code, {\n children: \"Cargo.toml\"\n }), \"/\", _jsx(_components.code, {\n children: \"Cargo.lock\"\n }), \", \", _jsx(_components.code, {\n children: \"package.json\"\n }), \"/\", _jsx(_components.code, {\n children: \"package-lock.json\"\n }), \", or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. \", _jsx(_components.code, {\n children: \"go.sum\"\n }), \" and \", _jsx(_components.code, {\n children: \"requirements.txt\"\n }), \" are unsupported companion files. One unusable file rejects the whole upload; inspect the problem’s \", _jsx(_components.code, {\n children: \"files\"\n }), \" entries for its path and status.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume.\"\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Long-running work and usage\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"For work that may outlast the synchronous request, submit \", _jsx(_components.code, {\n children: \"POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx\"\n }), \" with the same files. Its HTTP 202 JSON response supplies an analysis \", _jsx(_components.code, {\n children: \"id\"\n }), \", plus \", _jsx(_components.code, {\n children: \"status_url\"\n }), \", \", _jsx(_components.code, {\n children: \"events_url\"\n }), \", \", _jsx(_components.code, {\n children: \"result_url\"\n }), \" and \", _jsx(_components.code, {\n children: \"expires_at\"\n }), \". Follow status or events until \", _jsx(_components.code, {\n children: \"state=succeeded\"\n }), \", then read \", _jsx(_components.code, {\n children: \"GET /v1/experimental/licenses/{id}\"\n }), \" using that analysis ID. The \", _jsx(_components.strong, {\n children: \"Get dependency licenses\"\n }), \" operation shows the complete workflow.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job’s licenses report does not start another analysis or consume another analysis reservation. The \", _jsx(_components.code, {\n children: \"x-githits-cost\"\n }), \" value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Read the report\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Keep separate component entries even when their names, versions or package URLs match. Use \", _jsx(_components.code, {\n children: \"bom_ref\"\n }), \" for reported relationships and \", _jsx(_components.code, {\n children: \"properties\"\n }), \" for input-file attribution. \", _jsx(_components.code, {\n children: \"licenses\"\n }), \" contains license-choice objects; \", _jsx(_components.code, {\n children: \"observed_licenses\"\n }), \" contains separate observations. \", _jsx(_components.code, {\n children: \"publisher_evidence\"\n }), \" explains original publisher statements and their context; \", _jsx(_components.code, {\n children: \"source_evidence\"\n }), \" explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named \", _jsx(_components.code, {\n children: \"properties[].value\"\n }), \" strings contain additional JSON and need a separate parse, as described in the response schemas.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read \", _jsx(_components.code, {\n children: \"inventory.completeness\"\n }), \" alongside the component list. Dependency coverage is in \", _jsx(_components.code, {\n children: \"inventory.compositions\"\n }), \" and the \", _jsx(_components.code, {\n children: \"inventory.properties\"\n }), \" entry named \", _jsx(_components.code, {\n children: \"githits:dependency_coverage\"\n }), \"; parse that entry’s \", _jsx(_components.code, {\n children: \"value\"\n }), \" as JSON. Notices are properties named \", _jsx(_components.code, {\n children: \"githits:notice\"\n }), \". No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use \", _jsx(_components.code, {\n children: \"snake_case\"\n }), \"; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as \", _jsx(_components.code, {\n children: \"dependsOn\"\n }), \".\"]\n }), \"\\n\", _jsx(_components.p, {\n children: _jsx(_components.strong, {\n children: \"Handle errors\"\n })\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Problems use \", _jsx(_components.code, {\n children: \"application/problem+json\"\n }), \". Branch on \", _jsx(_components.code, {\n children: \"code\"\n }), \", keep \", _jsx(_components.code, {\n children: \"X-Request-ID\"\n }), \" for support, and respect \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" when present.\"]\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: \"What to do\"\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 }), \" / \", _jsx(_components.code, {\n children: \"INVALID_SESSION_ID\"\n })]\n }), _jsxs(_components.td, {\n children: [\"Correct the field named in \", _jsx(_components.code, {\n children: \"detail\"\n }), \", the upload parts, or the session header.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: \"401 / 403\"\n }), _jsx(_components.td, {\n children: \"Check the credential, account access and required terms; use any provided terms/acceptance links.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: \"408 / 413 / 415\"\n }), _jsx(_components.td, {\n children: \"Meet the upload deadline and size/path/count limits; send valid multipart data.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"UNUSABLE_MANIFEST\"\n }), \" / \", _jsx(_components.code, {\n children: \"NO_MANIFEST_EVIDENCE\"\n })]\n }), _jsx(_components.td, {\n children: \"Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved.\"\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"422 \", _jsx(_components.code, {\n children: \"LICENSE_REPORT_TOO_LARGE\"\n }), \" / \", _jsx(_components.code, {\n children: \"SBOM_OUTPUT_TOO_LARGE\"\n })]\n }), _jsxs(_components.td, {\n children: [\"The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through \", _jsx(_components.code, {\n children: \"result_url\"\n }), \" when that document is available.\"]\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: [\"Wait until the supplied \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" time before trying again.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsxs(_components.td, {\n children: [\"502 \", _jsx(_components.code, {\n children: \"UPSTREAM_ERROR\"\n })]\n }), _jsxs(_components.td, {\n children: [\"The analysis result could not be read. Keep \", _jsx(_components.code, {\n children: \"X-Request-ID\"\n }), \" and report a persistent failure; repeating POST may create another charged analysis.\"]\n })]\n }), _jsxs(_components.tr, {\n children: [_jsx(_components.td, {\n children: \"503\"\n }), _jsx(_components.td, {\n children: \"Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job.\"\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: \"Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free.\"\n })]\n })]\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Responses must not be cached (\", _jsx(_components.code, {\n children: \"Cache-Control: no-store\"\n }), \").\"]\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":"Report dependency licenses from uploaded files","description":"Create a JSON license report from your project's manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In these examples, `/path/to/private-auth.conf` is your own protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately and keep the file outside your repository.\n\nRun from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@package.json;filename=package.json' \\\n --form 'files[]=@package-lock.json;filename=package-lock.json' \\\n --output licenses.json \\\n 'https://api.githits.dev/v1/experimental/licenses'\n```\n\nRepeat the literal field name `files[]` for each file. For a nested project, preserve the path in both places, for example `files[]=@app/package.json;filename=app/package.json`. This lets related manifests and lockfiles be associated. Let curl set the multipart `Content-Type` and boundary. Only `files[]` parts are accepted: do not send query parameters, `kind`, `format`, repository URLs, archives, base64 data or policy files. `Accept` does not change the response format.\n\nOn HTTP 200, `licenses.json` contains the report itself, with `schema_version`, `inventory` and `components`. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component's `bom_ref` is not an analysis job ID.\n\n**Inputs and limits**\n\nSupported inputs are the same as **Generate an SBOM** (`POST /v1/experimental/sbom`): for example `Cargo.toml`/`Cargo.lock`, `package.json`/`package-lock.json`, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. `go.sum` and `requirements.txt` are unsupported companion files. One unusable file rejects the whole upload; inspect the problem's `files` entries for its path and status.\n\nSend 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments.\n\nThe upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume.\n\n**Long-running work and usage**\n\nFor work that may outlast the synchronous request, submit `POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx` with the same files. Its HTTP 202 JSON response supplies an analysis `id`, plus `status_url`, `events_url`, `result_url` and `expires_at`. Follow status or events until `state=succeeded`, then read `GET /v1/experimental/licenses/{id}` using that analysis ID. The **Get dependency licenses** operation shows the complete workflow.\n\nAt current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job's licenses report does not start another analysis or consume another analysis reservation. The `x-githits-cost` value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries.\n\n**Read the report**\n\nKeep separate component entries even when their names, versions or package URLs match. Use `bom_ref` for reported relationships and `properties` for input-file attribution. `licenses` contains license-choice objects; `observed_licenses` contains separate observations. `publisher_evidence` explains original publisher statements and their context; `source_evidence` explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named `properties[].value` strings contain additional JSON and need a separate parse, as described in the response schemas.\n\nNull identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read `inventory.completeness` alongside the component list. Dependency coverage is in `inventory.compositions` and the `inventory.properties` entry named `githits:dependency_coverage`; parse that entry's `value` as JSON. Notices are properties named `githits:notice`. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use `snake_case`; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as `dependsOn`.\n\n**Handle errors**\n\nProblems use `application/problem+json`. Branch on `code`, keep `X-Request-ID` for support, and respect `Retry-After` when present.\n\n| Status / code | What to do |\n| --- | --- |\n| 400 `VALIDATION_ERROR` / `INVALID_SESSION_ID` | Correct the field named in `detail`, the upload parts, or the session header. |\n| 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. |\n| 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. |\n| 422 `UNUSABLE_MANIFEST` / `NO_MANIFEST_EVIDENCE` | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. |\n| 422 `LICENSE_REPORT_TOO_LARGE` / `SBOM_OUTPUT_TOO_LARGE` | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through `result_url` when that document is available. |\n| 429 `RATE_LIMITED` | Wait until the supplied `Retry-After` time before trying again. |\n| 502 `UPSTREAM_ERROR` | The analysis result could not be read. Keep `X-Request-ID` and report a persistent failure; repeating POST may create another charged analysis. |\n| 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. |\n| 504 `TIMEOUT` | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. |\n\nResponses must not be cached (`Cache-Control: no-store`).\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/licenses","href":"/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"Create a JSON license report from your project's manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known.\n\n**First request**\n\nUse a GitHits Bearer credential for an active account with the required terms accepted. In these examples, `/path/to/private-auth.conf` is your own protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately and keep the file outside your repository.\n\nRun from your repository root:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@package.json;filename=package.json' \\\n --form 'files[]=@package-lock.json;filename=package-lock.json' \\\n --output licenses.json \\\n 'https://api.githits.dev/v1/experimental/licenses'\n```\n\nRepeat the literal field name `files[]` for each file. For a nested project, preserve the path in both places, for example `files[]=@app/package.json;filename=app/package.json`. This lets related manifests and lockfiles be associated. Let curl set the multipart `Content-Type` and boundary. Only `files[]` parts are accepted: do not send query parameters, `kind`, `format`, repository URLs, archives, base64 data or policy files. `Accept` does not change the response format.\n\nOn HTTP 200, `licenses.json` contains the report itself, with `schema_version`, `inventory` and `components`. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component's `bom_ref` is not an analysis job ID.\n\n**Inputs and limits**\n\nSupported inputs are the same as **Generate an SBOM** (`POST /v1/experimental/sbom`): for example `Cargo.toml`/`Cargo.lock`, `package.json`/`package-lock.json`, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. `go.sum` and `requirements.txt` are unsupported companion files. One unusable file rejects the whole upload; inspect the problem's `files` entries for its path and status.\n\nSend 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments.\n\nThe upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume.\n\n**Long-running work and usage**\n\nFor work that may outlast the synchronous request, submit `POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx` with the same files. Its HTTP 202 JSON response supplies an analysis `id`, plus `status_url`, `events_url`, `result_url` and `expires_at`. Follow status or events until `state=succeeded`, then read `GET /v1/experimental/licenses/{id}` using that analysis ID. The **Get dependency licenses** operation shows the complete workflow.\n\nAt current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job's licenses report does not start another analysis or consume another analysis reservation. The `x-githits-cost` value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries.\n\n**Read the report**\n\nKeep separate component entries even when their names, versions or package URLs match. Use `bom_ref` for reported relationships and `properties` for input-file attribution. `licenses` contains license-choice objects; `observed_licenses` contains separate observations. `publisher_evidence` explains original publisher statements and their context; `source_evidence` explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named `properties[].value` strings contain additional JSON and need a separate parse, as described in the response schemas.\n\nNull identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read `inventory.completeness` alongside the component list. Dependency coverage is in `inventory.compositions` and the `inventory.properties` entry named `githits:dependency_coverage`; parse that entry's `value` as JSON. Notices are properties named `githits:notice`. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use `snake_case`; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as `dependsOn`.\n\n**Handle errors**\n\nProblems use `application/problem+json`. Branch on `code`, keep `X-Request-ID` for support, and respect `Retry-After` when present.\n\n| Status / code | What to do |\n| --- | --- |\n| 400 `VALIDATION_ERROR` / `INVALID_SESSION_ID` | Correct the field named in `detail`, the upload parts, or the session header. |\n| 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. |\n| 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. |\n| 422 `UNUSABLE_MANIFEST` / `NO_MANIFEST_EVIDENCE` | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. |\n| 422 `LICENSE_REPORT_TOO_LARGE` / `SBOM_OUTPUT_TOO_LARGE` | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through `result_url` when that document is available. |\n| 429 `RATE_LIMITED` | Wait until the supplied `Retry-After` time before trying again. |\n| 502 `UPSTREAM_ERROR` | The analysis result could not be read. Keep `X-Request-ID` and report a persistent failure; repeating POST may create another charged analysis. |\n| 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. |\n| 504 `TIMEOUT` | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. |\n\nResponses must not be cached (`Cache-Control: no-store`).\n","operationId":"generate_dependency_licenses","parameters":["c0995764-23d1-409a-9e94-755a0edb8386","b6e2139c-fd8e-4869-a35d-5311b905418d","5b80a69a-cabe-4a71-bb21-a21a3eb15980","80c9be82-53e8-441d-92ef-3c3f01faedd7"],"requestBody":"3281ef14-1f2d-45a6-87ba-630c88825aa1","responses":{"200":"c02f8c05-7eda-4b37-8a36-6d5f5f9611a2","400":"277efcc1-11ba-43e5-abad-364c7c585986","401":"c90d3087-d537-4d93-97d9-6dec49704cdc","403":"f593518b-4311-4f5c-9cb2-814e9683d42a","405":"9afe8b9c-86e1-4503-bd96-ff121ca15580","408":"fcf11475-2fdc-41cb-943c-0589e39fd1cf","413":"80c57575-8203-4958-8f58-de28d9584a51","415":"5ea877de-bc9f-482c-875e-2d3fada419ef","422":"4cdd8d27-cf82-4f11-bbfb-24d7ded951b5","429":"d65e8a9d-c5d0-4941-b045-2d35cfed87e2","500":"9b462db7-faa0-4f61-8b49-6e482c004335","502":"8f5ca63c-de64-4559-9346-4d658a0d0817","503":"6acb0306-297d-481c-951b-bd784418b222","504":"52db4293-995e-4928-a5df-340cd9465afe"},"security":["8765b966-fe4b-469b-a084-f4090d3b0b8d"],"summary":"Report dependency licenses from uploaded files","tags":["Experimental"],"x-githits-cost":1,"method":"post","type":"path","servers":["bfb2a79f-febe-439c-ad58-8db4455b87a2"],"path":"/v1/experimental/licenses","baseUrlOptions":["https://api.githits.dev"],"title":"Report dependency licenses from uploaded files","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","disableProxy":true},"dependencies":{"parameters":{"c0995764-23d1-409a-9e94-755a0edb8386":{"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"}},"b6e2139c-fd8e-4869-a35d-5311b905418d":{"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"}},"5b80a69a-cabe-4a71-bb21-a21a3eb15980":{"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"}},"80c9be82-53e8-441d-92ef-3c3f01faedd7":{"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[]"}},"required":["files[]"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"files[]":["\u003cstring>"]}}},"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":{"c02f8c05-7eda-4b37-8a36-6d5f5f9611a2":{"content":{"application/json":{"example":{"components":[{"bom_ref":"root","external_references":[],"hashes":[],"licenses":[{"acknowledgement":"declared","expression":"MIT"}],"name":"project","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"manifest"},{"name":"githits:manifest_path","value":"package.json"}],"publisher_evidence":null,"purl":null,"record_kind":"manifest","scope":null,"source_evidence":null,"type":"library","version":null},{"bom_ref":"a","external_references":[{"hashes":[{"alg":"SHA-256","content":"reference-digest"}],"type":"vcs","url":"https://example.com/source"},{"type":"distribution","url":"https://example.com/artifact.tgz"}],"hashes":[{"alg":"SHA-256","content":"package-digest"}],"licenses":[{"acknowledgement":"declared","expression":"MIT","future_choice":true},{"license":{"name":"Opaque publisher terms"}}],"name":"dependency","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"locked_package"},{"name":"githits:lockfile_path","value":"one/package-lock.json"},{"name":"githits:license_artifact_verification","value":"not_checked"}],"publisher_evidence":{"capture_status":"present","controlling_index":0,"coverage":"complete","display_value":"MIT","expression":"MIT","observations":[{"interpretation":{"expression":"MIT","interpretation_methods":["spdx_expression"],"issues":[],"status":"expression","syntax":"spdx"},"observation":{"field":"license","relation":"single","scope":"release","source":"npm_registry","statements":["MIT"],"status":"present","version":"1.0.0"},"relationship":"controlling"}],"reason":"publisher_release_metadata","status":"expression"},"purl":"pkg:npm/dependency@1.0.0","record_kind":"locked_package","scope":"excluded","source_evidence":null,"type":"library","version":"1.0.0"},{"bom_ref":"b","external_references":[{"hashes":[{"alg":"SHA-256","content":"reference-digest"}],"type":"vcs","url":"https://example.com/source"},{"type":"distribution","url":"https://example.com/artifact.tgz"}],"hashes":[{"alg":"SHA-256","content":"package-digest"}],"licenses":[{"acknowledgement":"declared","expression":"MIT","future_choice":true},{"license":{"name":"Opaque publisher terms"}}],"name":"dependency","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"locked_package"},{"name":"githits:lockfile_path","value":"two/package-lock.json"},{"name":"githits:license_artifact_verification","value":"not_checked"}],"publisher_evidence":{"capture_status":"present","controlling_index":0,"coverage":"complete","display_value":"MIT","expression":"MIT","observations":[{"interpretation":{"expression":"MIT","interpretation_methods":["spdx_expression"],"issues":[],"status":"expression","syntax":"spdx"},"observation":{"field":"license","relation":"single","scope":"release","source":"npm_registry","statements":["MIT"],"status":"present","version":"1.0.0"},"relationship":"controlling"}],"reason":"publisher_release_metadata","status":"expression"},"purl":"pkg:npm/dependency@1.0.0","record_kind":"locked_package","scope":"excluded","source_evidence":null,"type":"library","version":"1.0.0"},{"bom_ref":"go","external_references":[],"hashes":[],"licenses":[],"name":"example.com/source","observed_licenses":[{"license":{"name":"Apache-2.0"}},{"license":{"name":"MIT"}}],"properties":[{"name":"githits:record_kind","value":"resolved_package"},{"name":"githits:manifest_path","value":"go.mod"}],"publisher_evidence":null,"purl":"pkg:golang/example.com/source@v1.0.0","record_kind":"resolved_package","scope":null,"source_evidence":{"checked_at":"2026-10-22T12:00:00Z","files":[{"detected_licenses":["Apache-2.0"],"path":"LICENSE"},{"detected_licenses":["MIT"],"path":"nested/LICENSE"}],"last_attempt_at":"2026-10-22T12:00:00Z","last_attempt_status":"ambiguous","method":"licensecheck","module":"example.com/source","provider":"pkg_go_dev","status":"ambiguous","url":"https://pkg.go.dev/example.com/source@v1.0.0?tab=licenses","version":"v1.0.0"},"type":"library","version":"v1.0.0"},{"bom_ref":"file","external_references":[],"hashes":[],"licenses":[],"name":"local subject","observed_licenses":[],"properties":[],"publisher_evidence":null,"purl":null,"record_kind":null,"scope":null,"source_evidence":null,"type":"file","version":null}],"inventory":{"completeness":"recorded_lockfile_inventory","compositions":[{"aggregate":"unknown","assemblies":["root","a","b","go","file"]}],"dependencies":[{"dependsOn":["a"],"ref":"root"},{"dependsOn":["b"],"ref":"a"}],"properties":[{"name":"githits:completeness","value":"recorded_lockfile_inventory"},{"name":"githits:notice","value":"License metadata and connectivity may be incomplete."},{"name":"githits:resolutions","value":"[{\"path\":\"package.json\",\"status\":\"partial\"}]"}]},"schema_version":1},"schema":{"additionalProperties":true,"description":"JSON license inventory with separate license choices, publisher statements and source-file observations, plus input attribution and coverage. It provides evidence for your own evaluation rather than an allow/deny result. Additional fields can appear.","properties":{"components":{"description":"All reported occurrences in their original order, with the selected primary project/source entry first when one exists. Keep repeated names, versions and package URLs separate; use bom_ref and input-path properties for attribution.","items":{"additionalProperties":true,"description":"One reported project, package, source or file entry. A package can appear more than once, for example in different lockfiles; keep those occurrences separate even when name, version or package URL match.","properties":{"bom_ref":{"oneOf":[{"description":"Opaque reference for this occurrence, used by inventory relationships. null means no reference was available. Do not merge entries by name, version or package URL.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].bom_ref.oneOf.0","typeLabel":"string"},{"description":"Opaque reference for this occurrence, used by inventory relationships. null means no reference was available. Do not merge entries by name, version or package URL.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].bom_ref.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].bom_ref","typeLabel":"string | null"},"external_references":{"description":"Source or distribution locations with their declared provenance. A reference may have its own hashes; keep those on that reference rather than moving them to component hashes. The presence of a URL does not prove an installed copy was downloaded or verified.","items":{"additionalProperties":true,"type":"object","uniqueKey":"components.items.[INDEX].external_references.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"components.items.[INDEX].external_references","typeLabel":"object[]"},"hashes":{"description":"Checksums recorded for this component or file. They are not recalculated by the report. Keep them separate from hashes on external_references; neither collection proves that your installed copy matches.","items":{"additionalProperties":true,"type":"object","uniqueKey":"components.items.[INDEX].hashes.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"components.items.[INDEX].hashes","typeLabel":"object[]"},"licenses":{"description":"Reported license-choice objects, usually containing expression (for example MIT OR Apache-2.0) or license with an id/name, and optional acknowledgement. Keep each choice intact. Separate entries do not imply AND or OR, and an empty array means no choices were reported. These are evidence, not a pass/fail decision.","items":{"additionalProperties":true,"type":"object","uniqueKey":"components.items.[INDEX].licenses.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"components.items.[INDEX].licenses","typeLabel":"object[]"},"name":{"description":"Reported project, package, source or file name. A name alone does not identify a unique package occurrence.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].name","typeLabel":"string"},"observed_licenses":{"description":"Independent license observations, such as licenses identified in source files. Keep these separate from licenses and publisher statements; see source_evidence for file paths and detection status. An empty array means no observations were reported, not that every file was checked.","items":{"additionalProperties":true,"type":"object","uniqueKey":"components.items.[INDEX].observed_licenses.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"components.items.[INDEX].observed_licenses","typeLabel":"object[]"},"properties":{"description":"Additional input/source attribution and metadata as name/value pairs. Match entries by name, retain repetitions and allow unfamiliar names; value can be absent. Paths and status values are plain strings. Known values such as githits:manifest_paths, githits:lockfile_paths and githits:license_raw_statements contain JSON encoded inside a string and need a separate parse if you use them. Publisher/source evidence is already available as objects in publisher_evidence and source_evidence.","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":"Optional evidence value, encoded as a string when present. Structured values such as githits:declarations, githits:resolutions, githits:lockfiles, githits:manifest_associations, githits:manifest_paths and githits:lockfile_paths contain JSON; parse those separately when needed. Do not JSON-parse every property: paths and statuses can be plain strings.","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","isRequired":true,"uniqueKey":"components.items.[INDEX].properties","typeLabel":"object[]"},"publisher_evidence":{"oneOf":[{"additionalProperties":true,"description":"Original publisher license statements and the context needed to interpret them. This is already a JSON object. observations retains statement text, source, scope, field, version, interpretation/issues and relationship. capture_status describes retained statement capture; coverage concerns that statement collection, not your dependency inventory. status/reason/expression describe interpretation. controlling_index identifies the selected observation when one was selected. Package/repository context may not apply to a specific release. null means no publisher evidence object was available, not that the package has no license. Accept unfamiliar statuses and additional fields.","type":"object","isRequired":true,"uniqueKey":"components.items.[INDEX].publisher_evidence.oneOf.0","typeLabel":"object"},{"additionalProperties":true,"description":"Original publisher license statements and the context needed to interpret them. This is already a JSON object. observations retains statement text, source, scope, field, version, interpretation/issues and relationship. capture_status describes retained statement capture; coverage concerns that statement collection, not your dependency inventory. status/reason/expression describe interpretation. controlling_index identifies the selected observation when one was selected. Package/repository context may not apply to a specific release. null means no publisher evidence object was available, not that the package has no license. Accept unfamiliar statuses and additional fields.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].publisher_evidence.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].publisher_evidence","typeLabel":"object | null"},"purl":{"oneOf":[{"description":"Package URL (PURL), or null when unavailable. Its presence identifies a package coordinate; it does not verify your installed artifact.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].purl.oneOf.0","typeLabel":"string"},{"description":"Package URL (PURL), or null when unavailable. Its presence identifies a package coordinate; it does not verify your installed artifact.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].purl.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].purl","typeLabel":"string | null"},"record_kind":{"oneOf":[{"description":"Why this entry is included: examples are manifest for an uploaded project, resolved_package for a dependency found by resolution, and locked_package for a lockfile occurrence. null means unspecified. Other values can appear.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].record_kind.oneOf.0","typeLabel":"string"},{"description":"Why this entry is included: examples are manifest for an uploaded project, resolved_package for a dependency found by resolution, and locked_package for a lockfile occurrence. null means unspecified. Other values can appear.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].record_kind.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].record_kind","typeLabel":"string | null"},"scope":{"oneOf":[{"description":"Reported component scope, for example excluded. null means the scope was not specified. Entries with excluded scope remain in the report.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].scope.oneOf.0","typeLabel":"string"},{"description":"Reported component scope, for example excluded. null means the scope was not specified. Entries with excluded scope remain in the report.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].scope.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].scope","typeLabel":"string | null"},"source_evidence":{"oneOf":[{"additionalProperties":true,"description":"Source-file license detection details, already a JSON object. provider/method identify the detection service and technique; module/version identify what was examined. files contains path and detected_licenses, including nested license files. checked_at/status describe the available observation; last_attempt_at/last_attempt_status describe the latest attempt, which can fail while an older observation remains. null means no source observation was available. Accept unfamiliar statuses and additional fields; this does not certify an installed artifact.","type":"object","isRequired":true,"uniqueKey":"components.items.[INDEX].source_evidence.oneOf.0","typeLabel":"object"},{"additionalProperties":true,"description":"Source-file license detection details, already a JSON object. provider/method identify the detection service and technique; module/version identify what was examined. files contains path and detected_licenses, including nested license files. checked_at/status describe the available observation; last_attempt_at/last_attempt_status describe the latest attempt, which can fail while an older observation remains. null means no source observation was available. Accept unfamiliar statuses and additional fields; this does not certify an installed artifact.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].source_evidence.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].source_evidence","typeLabel":"object | null"},"type":{"description":"Component classification, for example library or file. Additional string values can appear; accept unfamiliar classifications.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].type","typeLabel":"string"},"version":{"oneOf":[{"description":"Reported version text, or null when no version was available.","type":"string","isRequired":true,"uniqueKey":"components.items.[INDEX].version.oneOf.0","typeLabel":"string"},{"description":"Reported version text, or null when no version was available.","type":"null","isRequired":true,"uniqueKey":"components.items.[INDEX].version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"components.items.[INDEX].version","typeLabel":"string | null"}},"required":["bom_ref","name","version","purl","type","scope","record_kind","licenses","observed_licenses","publisher_evidence","source_evidence","external_references","hashes","properties"],"type":"object","uniqueKey":"components.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"components","typeLabel":"object[]"},"inventory":{"additionalProperties":true,"description":"Input provenance, inventory coverage and reported dependency relationships. Read these facts alongside the component list; successful analysis can still be partial.","properties":{"completeness":{"oneOf":[{"description":"How the inventory was built, for example recorded_lockfile_inventory, resolved_manifest_inventory, partial_manifest_inventory or mixed_dependency_inventory. null means unreported, and additional values can appear. This does not measure license coverage; HTTP 200 or a component count does not prove completeness.","type":"string","isRequired":true,"uniqueKey":"inventory.completeness.oneOf.0","typeLabel":"string"},{"description":"How the inventory was built, for example recorded_lockfile_inventory, resolved_manifest_inventory, partial_manifest_inventory or mixed_dependency_inventory. null means unreported, and additional values can appear. This does not measure license coverage; HTTP 200 or a component count does not prove completeness.","type":"null","isRequired":true,"uniqueKey":"inventory.completeness.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"inventory.completeness","typeLabel":"string | null"},"compositions":{"description":"Coverage declarations for groups of component references, with standard CycloneDX keys such as aggregate and assemblies. They describe inventory/connectivity coverage, not how many licenses are known. Allow unfamiliar fields and aggregate values.","items":{"additionalProperties":true,"type":"object","uniqueKey":"inventory.compositions.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"inventory.compositions","typeLabel":"object[]"},"dependencies":{"description":"Reported dependency relationships, using standard keys such as ref and dependsOn to refer to component bom_ref values. Missing edges or an empty array do not by themselves prove a complete graph or a dependency-free package; read coverage and notices too.","items":{"additionalProperties":true,"type":"object","uniqueKey":"inventory.dependencies.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"inventory.dependencies","typeLabel":"object[]"},"properties":{"description":"Additional facts about uploaded inputs, resolution results and coverage, as name/value pairs. Values for githits:resolutions, githits:declarations, githits:lockfiles, githits:manifest_associations, githits:dependency_coverage, githits:relationships, githits:primary_subject and githits:declaration_agreement contain JSON encoded inside strings: parse those separately when needed. Dependency coverage is reported in githits:dependency_coverage and inventory.compositions. Some values, such as githits:notice and githits:completeness, are plain strings; parse only names you know to contain JSON. Match by name, keep repetitions and allow unfamiliar properties; value can be absent.","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":"inventory.properties.items.[INDEX].name","typeLabel":"string"},"value":{"description":"Optional evidence value, encoded as a string when present. Structured values such as githits:declarations, githits:resolutions, githits:lockfiles, githits:manifest_associations, githits:manifest_paths and githits:lockfile_paths contain JSON; parse those separately when needed. Do not JSON-parse every property: paths and statuses can be plain strings.","type":"string","uniqueKey":"inventory.properties.items.[INDEX].value","typeLabel":"string"}},"required":["name"],"type":"object","uniqueKey":"inventory.properties.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"inventory.properties","typeLabel":"object[]"}},"required":["completeness","properties","compositions","dependencies"],"type":"object","isRequired":true,"uniqueKey":"inventory","typeLabel":"object"},"schema_version":{"description":"Version of this JSON report structure, currently 1.","enum":[1],"type":"integer","isRequired":true,"uniqueKey":"schema_version","typeLabel":"enum\u003cinteger>"}},"required":["schema_version","inventory","components"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"components":[{"bom_ref":"root","external_references":[],"hashes":[],"licenses":[{"acknowledgement":"declared","expression":"MIT"}],"name":"project","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"manifest"},{"name":"githits:manifest_path","value":"package.json"}],"publisher_evidence":null,"purl":null,"record_kind":"manifest","scope":null,"source_evidence":null,"type":"library","version":null},{"bom_ref":"a","external_references":[{"hashes":[{"alg":"SHA-256","content":"reference-digest"}],"type":"vcs","url":"https://example.com/source"},{"type":"distribution","url":"https://example.com/artifact.tgz"}],"hashes":[{"alg":"SHA-256","content":"package-digest"}],"licenses":[{"acknowledgement":"declared","expression":"MIT","future_choice":true},{"license":{"name":"Opaque publisher terms"}}],"name":"dependency","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"locked_package"},{"name":"githits:lockfile_path","value":"one/package-lock.json"},{"name":"githits:license_artifact_verification","value":"not_checked"}],"publisher_evidence":{"capture_status":"present","controlling_index":0,"coverage":"complete","display_value":"MIT","expression":"MIT","observations":[{"interpretation":{"expression":"MIT","interpretation_methods":["spdx_expression"],"issues":[],"status":"expression","syntax":"spdx"},"observation":{"field":"license","relation":"single","scope":"release","source":"npm_registry","statements":["MIT"],"status":"present","version":"1.0.0"},"relationship":"controlling"}],"reason":"publisher_release_metadata","status":"expression"},"purl":"pkg:npm/dependency@1.0.0","record_kind":"locked_package","scope":"excluded","source_evidence":null,"type":"library","version":"1.0.0"},{"bom_ref":"b","external_references":[{"hashes":[{"alg":"SHA-256","content":"reference-digest"}],"type":"vcs","url":"https://example.com/source"},{"type":"distribution","url":"https://example.com/artifact.tgz"}],"hashes":[{"alg":"SHA-256","content":"package-digest"}],"licenses":[{"acknowledgement":"declared","expression":"MIT","future_choice":true},{"license":{"name":"Opaque publisher terms"}}],"name":"dependency","observed_licenses":[],"properties":[{"name":"githits:record_kind","value":"locked_package"},{"name":"githits:lockfile_path","value":"two/package-lock.json"},{"name":"githits:license_artifact_verification","value":"not_checked"}],"publisher_evidence":{"capture_status":"present","controlling_index":0,"coverage":"complete","display_value":"MIT","expression":"MIT","observations":[{"interpretation":{"expression":"MIT","interpretation_methods":["spdx_expression"],"issues":[],"status":"expression","syntax":"spdx"},"observation":{"field":"license","relation":"single","scope":"release","source":"npm_registry","statements":["MIT"],"status":"present","version":"1.0.0"},"relationship":"controlling"}],"reason":"publisher_release_metadata","status":"expression"},"purl":"pkg:npm/dependency@1.0.0","record_kind":"locked_package","scope":"excluded","source_evidence":null,"type":"library","version":"1.0.0"},{"bom_ref":"go","external_references":[],"hashes":[],"licenses":[],"name":"example.com/source","observed_licenses":[{"license":{"name":"Apache-2.0"}},{"license":{"name":"MIT"}}],"properties":[{"name":"githits:record_kind","value":"resolved_package"},{"name":"githits:manifest_path","value":"go.mod"}],"publisher_evidence":null,"purl":"pkg:golang/example.com/source@v1.0.0","record_kind":"resolved_package","scope":null,"source_evidence":{"checked_at":"2026-10-22T12:00:00Z","files":[{"detected_licenses":["Apache-2.0"],"path":"LICENSE"},{"detected_licenses":["MIT"],"path":"nested/LICENSE"}],"last_attempt_at":"2026-10-22T12:00:00Z","last_attempt_status":"ambiguous","method":"licensecheck","module":"example.com/source","provider":"pkg_go_dev","status":"ambiguous","url":"https://pkg.go.dev/example.com/source@v1.0.0?tab=licenses","version":"v1.0.0"},"type":"library","version":"v1.0.0"},{"bom_ref":"file","external_references":[],"hashes":[],"licenses":[],"name":"local subject","observed_licenses":[],"properties":[],"publisher_evidence":null,"purl":null,"record_kind":null,"scope":null,"source_evidence":null,"type":"file","version":null}],"inventory":{"completeness":"recorded_lockfile_inventory","compositions":[{"aggregate":"unknown","assemblies":["root","a","b","go","file"]}],"dependencies":[{"dependsOn":["a"],"ref":"root"},{"dependsOn":["b"],"ref":"a"}],"properties":[{"name":"githits:completeness","value":"recorded_lockfile_inventory"},{"name":"githits:notice","value":"License metadata and connectivity may be incomplete."},{"name":"githits:resolutions","value":"[{\"path\":\"package.json\",\"status\":\"partial\"}]"}]},"schema_version":1}}},"exampleType":"examples"}},"description":"JSON license report, at most 16,777,216 bytes. Read inventory coverage and component evidence together; a successful response may be partial and does not provide a pass/fail decision.","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"},"277efcc1-11ba-43e5-abad-364c7c585986":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Correct the field named in detail or the session header. These operations accept no query parameters. INVALID_SESSION_ID: a supplied session header is invalid or duplicated. VALIDATION_ERROR details identify the first invalid field and a reason when available. Array indices are zero-based; 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"},"c90d3087-d537-4d93-97d9-6dec49704cdc":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Supply a valid Bearer credential.","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"},"f593518b-4311-4f5c-9cb2-814e9683d42a":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Check credential access, account eligibility and required terms; follow terms_url or acceptance_url when provided.","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"},"9afe8b9c-86e1-4503-bd96-ff121ca15580":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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"},"fcf11475-2fdc-41cb-943c-0589e39fd1cf":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Ensure the upload can finish within 30 seconds.","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"},"80c57575-8203-4958-8f58-de28d9584a51":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Reduce file count, path length or bytes to the documented upload limits.","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"},"5ea877de-bc9f-482c-875e-2d3fada419ef":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Send multipart/form-data and let the HTTP client set its boundary.","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"},"4cdd8d27-cf82-4f11-bbfb-24d7ded951b5":{"content":{"application/problem+json":{"example":{"code":"LICENSE_REPORT_TOO_LARGE","detail":"The licenses report exceeds the response limit.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":422,"title":"Licenses request failed","type":"about:blank"},"schema":{"oneOf":[{"type":"object","description":"File-specific diagnostics returned only when generation rejects uploaded inputs.","required":["files","type","title","status","detail","instance","code"],"properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.code","typeLabel":"string"},"detail":{"description":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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"},"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.0.files.items.[INDEX].path","typeLabel":"string"},"status":{"description":"Why this file could not contribute evidence.","type":"string","isRequired":true,"uniqueKey":"oneOf.0.files.items.[INDEX].status","typeLabel":"string"}},"required":["path","status"],"type":"object","uniqueKey":"oneOf.0.files.items.[INDEX]","typeLabel":"object"},"maxItems":256,"minItems":1,"type":"array","isRequired":true,"uniqueKey":"oneOf.0.files","typeLabel":"object[]"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"oneOf.0.acceptance_url","typeLabel":"string"},"retryable":{"description":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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":"The stable problem document returned for an unsuccessful public API request.","required":["type","title","status","detail","instance","code"],"properties":{"code":{"description":"The stable uppercase API error code.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.code","typeLabel":"string"},"detail":{"description":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"oneOf.1.detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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"},"acceptance_url":{"description":"Link for accepting the required terms, when provided.","type":"string","uniqueKey":"oneOf.1.acceptance_url","typeLabel":"string"},"retryable":{"description":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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":"LICENSE_REPORT_TOO_LARGE","detail":"The licenses report exceeds the response limit.","instance":"4bf92f3577b34da6a3ce929d0e0e4736","status":422,"title":"Licenses request failed","type":"about:blank"}}},"exampleType":"examples"}},"description":"LICENSE_REPORT_TOO_LARGE, UNUSABLE_MANIFEST, NO_MANIFEST_EVIDENCE, SBOM_OUTPUT_TOO_LARGE. Correct any files identified by UNUSABLE_MANIFEST or supply supported package evidence. For output-limit errors, request a smaller inventory if possible. Jobs do not increase the 16,777,216-byte JSON report limit.","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"},"d65e8a9d-c5d0-4941-b045-2d35cfed87e2":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Respect Retry-After when supplied before trying again. RATE_LIMITED can also mean your shared daily allowance is exhausted. When Retry-After is supplied, wait until that delay or HTTP date before trying again.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}},"Retry-After":{"description":"Delay in seconds or an HTTP date indicating when to retry, when supplied.","schema":{"type":"string"}},"X-Request-ID":{"description":"Request trace ID for diagnostics; matches problem.instance on failures.","schema":{"type":"string"}}},"exampleType":"examples"},"9b462db7-faa0-4f61-8b49-6e482c004335":{"description":"A request ID could not be assigned. The response has an empty body and no X-Request-ID or problem object; try again later.","headers":{"Cache-Control":{"schema":{"enum":["no-store"],"type":"string"}}},"x-githits-empty-identity-failure":true,"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"8f5ca63c-de64-4559-9346-4d658a0d0817":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. The analysis result could not be read. Keep X-Request-ID for support and report a persistent failure; a new submission creates another analysis.","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"},"6acb0306-297d-481c-951b-bd784418b222":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Try again later if appropriate. A timeout or error does not guarantee processing stopped, and repeating POST may create another charged analysis. QUOTA_UNAVAILABLE: your daily allowance could not be checked. This is temporary; retry the same request later (retryable=true).","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"},"52db4293-995e-4928-a5df-340cd9465afe":{"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":"Human-readable explanation. Wording can change; use code and structured fields for program logic. Validation errors identify the first invalid field (including zero-based array indices) and a reason; version errors can include canonical-version guidance.","type":"string","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"description":"Request ID matching the X-Request-ID response header; include it when seeking support.","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":"Whether retrying later may help, when supplied. Follow this flag for lookup/provider outcomes and temporary daily-allowance failures; malformed evidence can be nonretryable.","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. Try again later if appropriate. A timeout or error does not guarantee processing stopped, and repeating POST may create another charged analysis.","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":{"8765b966-fe4b-469b-a084-f4090d3b0b8d":{"bearer_auth":{"scheme":"bearer","type":"http","scopes":[],"schemeName":"bearer_auth"}}},"servers":{"bfb2a79f-febe-439c-ad58-8db4455b87a2":{"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":"Report dependency licenses from uploaded files - GitHits","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-05T11:15:02.073Z","originalFileLocation":"api-reference/v1/experimental/report-dependency-licenses-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=\"Create a JSON license report from your project\u0026#x27;s manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately and keep the file outside your repository. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@package.json;filename=package.json\u0026#x27; \\ --form \u0026#x27;files[]=@package-lock.json;filename=package-lock.json\u0026#x27; \\ --output licenses.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/licenses\u0026#x27; Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format. On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component\u0026#x27;s bom_ref is not an analysis job ID. Inputs and limits Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem\u0026#x27;s files entries for its path and status. Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments. The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume. Long-running work and usage For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom\u0026amp;format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow. At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job\u0026#x27;s licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries. Read the report Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas. Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry\u0026#x27;s value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn. Handle errors Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present. | Status / code | What to do | | --- | --- | | 400 VALIDATION_ERROR / INVALID_SESSION_ID | Correct the field named in detail, the upload parts, or the session header. | | 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. | | 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. | | 422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. | | 422 LICENSE_REPORT_TOO_LARGE / SBOM_OUTPUT_TOO_LARGE | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available. | | 429 RATE_LIMITED | Wait until the supplied Retry-After time before trying again. | | 502 UPSTREAM_ERROR | The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis. | | 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. | | 504 TIMEOUT | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. | Responses must not be cached (Cache-Control: no-store).\">\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=\"Report dependency licenses from uploaded files - GitHits\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create a JSON license report from your project\u0026#x27;s manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately and keep the file outside your repository. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@package.json;filename=package.json\u0026#x27; \\ --form \u0026#x27;files[]=@package-lock.json;filename=package-lock.json\u0026#x27; \\ --output licenses.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/licenses\u0026#x27; Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format. On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component\u0026#x27;s bom_ref is not an analysis job ID. Inputs and limits Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem\u0026#x27;s files entries for its path and status. Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments. The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume. Long-running work and usage For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom\u0026amp;format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow. At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job\u0026#x27;s licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries. Read the report Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas. Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry\u0026#x27;s value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn. Handle errors Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present. | Status / code | What to do | | --- | --- | | 400 VALIDATION_ERROR / INVALID_SESSION_ID | Correct the field named in detail, the upload parts, or the session header. | | 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. | | 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. | | 422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. | | 422 LICENSE_REPORT_TOO_LARGE / SBOM_OUTPUT_TOO_LARGE | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available. | | 429 RATE_LIMITED | Wait until the supplied Retry-After time before trying again. | | 502 UPSTREAM_ERROR | The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis. | | 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. | | 504 TIMEOUT | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. | Responses must not be cached (Cache-Control: no-store).\">\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/report-dependency-licenses-from-uploaded-files\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://githits.mintlify.site/_mintlify/api/og/v2?division=Experimental\u0026amp;title=Report+dependency+licenses+from+uploaded+files\u0026amp;description=Create+a+JSON+license+report+from+your+project%27s+manifests+and+lockfiles%2C+including+transitive+dependencies+found+during+analysis.+The+report+lists+projects%2C+pa\u0026amp;theme=8041cabad20aa9f8c5227dd8\u0026amp;signature=58b5d970aba7137a676bc3950c9426cc15a9d63f6ad4dc97ad0fb8891bd9c78b\">\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=\"Report dependency licenses from uploaded files - GitHits\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create a JSON license report from your project\u0026#x27;s manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = \u0026quot;Authorization: Bearer \u0026quot;; replace the placeholder privately and keep the file outside your repository. Run from your repository root: sh curl --config /path/to/private-auth.conf \\ --fail-with-body --silent --show-error \\ --form \u0026#x27;files[]=@package.json;filename=package.json\u0026#x27; \\ --form \u0026#x27;files[]=@package-lock.json;filename=package-lock.json\u0026#x27; \\ --output licenses.json \\ \u0026#x27;https://api.githits.dev/v1/experimental/licenses\u0026#x27; Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format. On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component\u0026#x27;s bom_ref is not an analysis job ID. Inputs and limits Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem\u0026#x27;s files entries for its path and status. Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments. The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume. Long-running work and usage For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom\u0026amp;format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow. At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job\u0026#x27;s licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries. Read the report Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas. Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry\u0026#x27;s value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn. Handle errors Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present. | Status / code | What to do | | --- | --- | | 400 VALIDATION_ERROR / INVALID_SESSION_ID | Correct the field named in detail, the upload parts, or the session header. | | 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. | | 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. | | 422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. | | 422 LICENSE_REPORT_TOO_LARGE / SBOM_OUTPUT_TOO_LARGE | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available. | | 429 RATE_LIMITED | Wait until the supplied Retry-After time before trying again. | | 502 UPSTREAM_ERROR | The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis. | | 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. | | 504 TIMEOUT | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. | Responses must not be cached (Cache-Control: no-store).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://githits.mintlify.site/_mintlify/api/og/v2?division=Experimental\u0026amp;title=Report+dependency+licenses+from+uploaded+files\u0026amp;description=Create+a+JSON+license+report+from+your+project%27s+manifests+and+lockfiles%2C+including+transitive+dependencies+found+during+analysis.+The+report+lists+projects%2C+pa\u0026amp;theme=8041cabad20aa9f8c5227dd8\u0026amp;signature=58b5d970aba7137a676bc3950c9426cc15a9d63f6ad4dc97ad0fb8891bd9c78b\">\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=\"#cc3f8b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-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/report-dependency-licenses-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/report-dependency-licenses-from-uploaded-files#webpage\",\"url\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files\",\"name\":\"Report dependency licenses from uploaded files\",\"description\":\"Create a JSON license report from your project's manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = \\\"Authorization: Bearer \\\"; replace the placeholder privately and keep the file outside your repository. Run from your repository root: sh curl --config /path/to/private-auth.conf \\\\ --fail-with-body --silent --show-error \\\\ --form 'files[]=@package.json;filename=package.json' \\\\ --form 'files[]=@package-lock.json;filename=package-lock.json' \\\\ --output licenses.json \\\\ 'https://api.githits.dev/v1/experimental/licenses' Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format. On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component's bom_ref is not an analysis job ID. Inputs and limits Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem's files entries for its path and status. Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments. The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume. Long-running work and usage For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow. At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job's licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries. Read the report Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas. Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry's value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn. Handle errors Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present. | Status / code | What to do | | --- | --- | | 400 VALIDATION_ERROR / INVALID_SESSION_ID | Correct the field named in detail, the upload parts, or the session header. | | 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. | | 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. | | 422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. | | 422 LICENSE_REPORT_TOO_LARGE / SBOM_OUTPUT_TOO_LARGE | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available. | | 429 RATE_LIMITED | Wait until the supplied Retry-After time before trying again. | | 502 UPSTREAM_ERROR | The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis. | | 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. | | 504 TIMEOUT | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. | Responses must not be cached (Cache-Control: no-store).\",\"dateModified\":\"2026-11-05T11:15:02.073Z\",\"isPartOf\":{\"@id\":\"https://docs.githits.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-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\":\"Report dependency licenses from uploaded files\",\"item\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files#apireference\",\"headline\":\"Report dependency licenses from uploaded files\",\"name\":\"Report dependency licenses from uploaded files\",\"description\":\"Create a JSON license report from your project's manifests and lockfiles, including transitive dependencies found during analysis. The report lists projects, packages and source/file entries, their license choices, source observations and coverage. It can contain incomplete results or unknown licenses; HTTP 200 does not mean every dependency or license is known. First request Use a GitHits Bearer credential for an active account with the required terms accepted. In these examples, /path/to/private-auth.conf is your own protected curl configuration containing header = \\\"Authorization: Bearer \\\"; replace the placeholder privately and keep the file outside your repository. Run from your repository root: sh curl --config /path/to/private-auth.conf \\\\ --fail-with-body --silent --show-error \\\\ --form 'files[]=@package.json;filename=package.json' \\\\ --form 'files[]=@package-lock.json;filename=package-lock.json' \\\\ --output licenses.json \\\\ 'https://api.githits.dev/v1/experimental/licenses' Repeat the literal field name files[] for each file. For a nested project, preserve the path in both places, for example files[]=@app/package.json;filename=app/package.json. This lets related manifests and lockfiles be associated. Let curl set the multipart Content-Type and boundary. Only files[] parts are accepted: do not send query parameters, kind, format, repository URLs, archives, base64 data or policy files. Accept does not change the response format. On HTTP 200, licenses.json contains the report itself, with schema_version, inventory and components. On an HTTP error, curl exits unsuccessfully and writes a JSON problem to that file; check the exit status before treating it as a report. Save a successful response: this synchronous operation returns no job ID or retrieval URL. A component's bom_ref is not an analysis job ID. Inputs and limits Supported inputs are the same as Generate an SBOM (POST /v1/experimental/sbom): for example Cargo.toml/Cargo.lock, package.json/package-lock.json, or supported pnpm and Yarn lockfiles. Lockfiles can be uploaded alone; manifests without a compatible lockfile resolve dependencies separately. File contents determine support. go.sum and requirements.txt are unsupported companion files. One unusable file rejects the whole upload; inspect the problem's files entries for its path and status. Send 1–256 raw UTF-8 files, each at most 5,242,880 bytes. The entire multipart request, including boundaries and headers, must fit within 8,000,000 bytes. Each filename is a repository-relative path of at most 1,024 UTF-8 bytes, without backslashes, control characters, or empty, dot or parent path segments. The upload must finish within 30 seconds. After upload, analysis can wait up to 150 seconds for a response. A timeout does not guarantee that processing stopped. Repeating POST creates another analysis; there is no idempotency key or saved result to resume. Long-running work and usage For work that may outlast the synchronous request, submit POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx with the same files. Its HTTP 202 JSON response supplies an analysis id, plus status_url, events_url, result_url and expires_at. Follow status or events until state=succeeded, then read GET /v1/experimental/licenses/{id} using that analysis ID. The Get dependency licenses operation shows the complete workflow. At current default policy, creating an analysis reserves 100 weighted units from your daily allowance. Processing failures do not automatically refund that reservation. Reading an existing job's licenses report does not start another analysis or consume another analysis reservation. The x-githits-cost value of 1 is provisional operation metadata, not an additional charge. Avoid unconditional POST retries. Read the report Keep separate component entries even when their names, versions or package URLs match. Use bom_ref for reported relationships and properties for input-file attribution. licenses contains license-choice objects; observed_licenses contains separate observations. publisher_evidence explains original publisher statements and their context; source_evidence explains source-file detections and attempt history. These evidence fields are JSON objects already; do not decode them as JSON strings. Some named properties[].value strings contain additional JSON and need a separate parse, as described in the response schemas. Null identity or evidence fields mean unavailable information. Empty license arrays mean no entries were reported, not that every file was checked or that a package has no license. Read inventory.completeness alongside the component list. Dependency coverage is in inventory.compositions and the inventory.properties entry named githits:dependency_coverage; parse that entry's value as JSON. Notices are properties named githits:notice. No chosen license, relationship between separate choices, or pass/fail decision is inferred. Response keys use snake_case; embedded CycloneDX choice, composition, dependency, reference and hash objects retain standard keys such as dependsOn. Handle errors Problems use application/problem+json. Branch on code, keep X-Request-ID for support, and respect Retry-After when present. | Status / code | What to do | | --- | --- | | 400 VALIDATION_ERROR / INVALID_SESSION_ID | Correct the field named in detail, the upload parts, or the session header. | | 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. | | 408 / 413 / 415 | Meet the upload deadline and size/path/count limits; send valid multipart data. | | 422 UNUSABLE_MANIFEST / NO_MANIFEST_EVIDENCE | Correct the reported files or supply a supported manifest/lockfile with package evidence. A file can be rejected after the analysis units were already reserved. | | 422 LICENSE_REPORT_TOO_LARGE / SBOM_OUTPUT_TOO_LARGE | The report or underlying inventory exceeds its output limit. Request a smaller inventory if possible. The JSON report limit is 16,777,216 bytes; using jobs does not raise it. Jobs also let you download the original CycloneDX document through result_url when that document is available. | | 429 RATE_LIMITED | Wait until the supplied Retry-After time before trying again. | | 502 UPSTREAM_ERROR | The analysis result could not be read. Keep X-Request-ID and report a persistent failure; repeating POST may create another charged analysis. | | 503 | Try again later. If you already have an analysis job, keep its ID and retry reads rather than submitting another job. | | 504 TIMEOUT | Processing may still have run. Prefer the job workflow for future submissions and do not assume a repeated POST is free. | Responses must not be cached (Cache-Control: no-store).\",\"url\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files\",\"mainEntityOfPage\":{\"@id\":\"https://docs.githits.com/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files#webpage\"},\"dateModified\":\"2026-11-05T11:15:02.073Z\",\"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":"SBOM, audit and licenses","sidebarTitle":"SBOM, audit and licenses","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":"Preview a compact dependency-license report","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/license-reports","href":"/api-reference/v1/experimental/preview-a-compact-dependency-license-report"},{"title":"Preview a compact report for a completed analysis","description":"Retrieve compact report `schema_version: 2` for an existing authorized CycloneDX SBOM job. Use the analysis ID returned by `POST /v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx`, after its existing status/events indicate success. A component `bom_ref` is not an analysis ID. The synchronous compact POST returns no job ID.\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --output license-report.json \\\n 'https://api.githits.dev/v1/experimental/license-reports/{id}'\n```\n\n`/path/to/private-auth.conf` is your own protected curl configuration containing your authorization header, kept outside the repository. Use a credential with access to the submitted job, such as the submission credential. Check curl's exit status: failures save a JSON problem rather than a report.\n\nThis read fetches one existing authorized result and projects it; it never resubmits, resolves, enriches or fetches source URLs. Operation cost is 0, with no new analysis reservation. The original job's status/events/result links, representation, owner/expiry gates and retention stay unchanged. No query parameters or `Accept`-based report selection are supported. The legacy `/v1/experimental/licenses/{id}` read remains schema 1, and the original CycloneDX result remains available through the job's `result_url`.\n\n**Interpret the report**\n\nThe compact POST documents the full report semantics. Keep every original occurrence and supplied identity qualifier; `bom_ref` and typed `inputs` retain attribution. Reported choices, publisher statements/context and observed file detections remain distinct. Original source observations and latest-attempt state/time do not certify your installed artifact. Local source does not prove first-party ownership. No license normalization, inferred AND/OR or pass/fail verdict is added.\n\nPurpose-specific fields are already JSON objects/arrays; they replace JSON strings inside generic property containers. `license_evidence` retains independent occurrence limitations and manifest/legacy detail only when it is not a mirror of canonical publisher evidence. Inventory coverage and named declaration gaps are not license completeness. Missing requirements never imply unrestricted selection. Empty matched-version lists do not imply no lock evidence; original provider proofs remain in the schema-1 view/SBOM.\n\nNull, absent facts, empty choices, unfamiliar statuses and unresolved references retain uncertainty. HTTP 200 does not establish that every dependency or license is known. Report output is bounded at 16,777,216 bytes and is never truncated. Dependency adjacency, component/reference digests and generic SBOM/debug properties are omitted from this compact view.\n\n**Handle errors**\n\nProblems use `application/problem+json`; branch on `code`, keep `X-Request-ID`, and honor `Retry-After`.\n\n| Status / code | Meaning and next action |\n| --- | --- |\n| 400 `VALIDATION_ERROR` / `INVALID_SESSION_ID` | Remove query parameters or correct the named field/session header. |\n| 401 / 403 | Check credential, ownership/account eligibility and required terms. |\n| 404 `ANALYSIS_NOT_FOUND` | Check the submission ID and credential. Missing, malformed, expired and inaccessible IDs share this response after authentication. |\n| 409 `ANALYSIS_PENDING` | Wait through existing status/events, then retry the same read. |\n| 409 `ANALYSIS_FAILED` | Inspect the safe open `failure_code` and job status before deliberately submitting new work. |\n| 409 `INCOMPATIBLE_ANALYSIS` | Use a job submitted with `kind=sbom\u0026format=cyclonedx`; audit/SPDX/text jobs are not converted. |\n| 422 `LICENSE_REPORT_TOO_LARGE` | The compact report exceeds its limit. Read the original available job result or request a smaller inventory. |\n| 429 / 502 / 503 / 504 | Respect retry guidance and retain the job/request IDs. Retry the existing read for transient failures instead of creating another analysis. |\n\nResponses use `Cache-Control: no-store`. Stable promotion is a later acceptance step; current schema-1 endpoints and saved reports remain unchanged.\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/experimental/license-reports/{id}","href":"/api-reference/v1/experimental/preview-a-compact-report-for-a-completed-analysis"},{"title":"Report dependency licenses from uploaded files","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json post /v1/experimental/licenses","href":"/api-reference/v1/experimental/report-dependency-licenses-from-uploaded-files"},{"title":"Get dependency licenses for a completed analysis","description":"Retrieve a JSON license report for an analysis job you can access. Use the analysis `id` returned in the HTTP 202 submission response. The synchronous `POST /v1/experimental/licenses` response has no job ID; a component's `bom_ref` cannot be used here.\n\nThe job must have been submitted with `kind=sbom\u0026format=cyclonedx`. You do not need to parse a CycloneDX document to use this JSON report. An audit job or a job using SPDX/text output returns 409 `INCOMPATIBLE_ANALYSIS`; choose a compatible job or submit a new one with the required parameters.\n\n**Create and follow a job**\n\nUse a GitHits Bearer credential for an active account with required terms accepted. In these examples, `/path/to/private-auth.conf` is your own protected curl configuration containing `header = \"Authorization: Bearer \u003ctoken>\"`; replace the placeholder privately and keep the file outside your repository.\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --form 'files[]=@package.json;filename=package.json' \\\n --form 'files[]=@package-lock.json;filename=package-lock.json' \\\n --output job.json \\\n 'https://api.githits.dev/v1/experimental/lockfile-jobs?kind=sbom\u0026format=cyclonedx'\n```\n\n1. Check for HTTP 202 and read `id` from `job.json`. Keep `expires_at` and the returned links.\n2. Resolve `status_url` or `events_url` against the API server URL. Read status or consume the server-sent events until `state=succeeded`. The presence of `result_url` alone does not mean the job is ready. On `state=failed`, inspect the job status's `error` code before deciding whether to submit new work; a licenses read also returns 409 `ANALYSIS_FAILED` with `failure_code`.\n3. Replace `{id}` below with the submission response's `id` and request the licenses view:\n\n```sh\ncurl --config /path/to/private-auth.conf \\\n --fail-with-body --silent --show-error \\\n --output licenses.json \\\n 'https://api.githits.dev/v1/experimental/licenses/{id}'\n```\n\nOn HTTP 200, `licenses.json` contains `schema_version`, `inventory` and `components`. On an HTTP error, curl exits unsuccessfully and saves a JSON problem in that file; check the exit status before treating it as a report. No query parameters or `Accept`-based format selection are supported.\n\nReading this report does not start another analysis or reserve another set of analysis units. Submitting a new job is a new analysis (currently 100 weighted daily units at default policy). The `x-githits-cost` value for this read is 0. Keep using the same ID for reads until the job expires instead of resubmitting just to retrieve the report.\n\n**Interpret the response**\n\nEvery reported project, dependency or file/source entry remains separate, including repeated names, versions or package URLs. Use `bom_ref` for reported relationships and `properties` for input paths. `licenses` gives license choices; `observed_licenses` gives independent observations. `publisher_evidence` retains original publisher statements and release/package/repository context. `source_evidence` retains source-file paths, detected licenses and observation/attempt history. Both evidence fields are JSON objects already. Some named `properties[].value` strings contain extra JSON that you parse separately; the field descriptions identify them.\n\nNull means the corresponding information was unavailable. Empty arrays do not prove that no license exists, that all files were checked, or that the dependency graph is complete. Read `inventory.completeness` with the component list. Dependency coverage is in `inventory.compositions` and the `inventory.properties` entry named `githits:dependency_coverage`; parse that entry's `value` as JSON. Notices are properties named `githits:notice`. No chosen license, AND/OR relationship between separate choices, or pass/fail decision is added. New string values and fields can appear; preserve or ignore unfamiliar data instead of rejecting an otherwise usable report.\n\n**Handle errors**\n\nProblems use `application/problem+json`; branch on `code` and keep `X-Request-ID` for support.\n\n| Status / code | What to do |\n| --- | --- |\n| 400 `VALIDATION_ERROR` / `INVALID_SESSION_ID` | Remove query parameters or correct the session header/field identified in `detail`. |\n| 401 / 403 | Check the credential, account access and required terms; use any provided terms/acceptance links. |\n| 404 `ANALYSIS_NOT_FOUND` | Check the submission ID and credential. Missing, expired and inaccessible jobs have the same response. A result that is no longer stored requires a new submission if you still need it. |\n| 409 `ANALYSIS_PENDING` | Wait for completion through status/events, then retry this GET; do not submit a second job just to wait. |\n| 409 `ANALYSIS_FAILED` | Inspect `failure_code` and the job status. Correct the input or cause before deliberately creating another analysis. |\n| 409 `INCOMPATIBLE_ANALYSIS` | Use a job created with `kind=sbom\u0026format=cyclonedx`; the format of an existing job cannot be changed by this GET. |\n| 422 `LICENSE_REPORT_TOO_LARGE` | The JSON report exceeds 16,777,216 bytes. Download the job's original CycloneDX document through `result_url`, or create a smaller analysis if appropriate. Jobs do not raise the report-size limit. |\n| 429 `RATE_LIMITED` | Respect `Retry-After` when provided. |\n| 502 `UPSTREAM_ERROR` | The analysis result could not be read. Keep the job ID and `X-Request-ID`, and report a persistent failure; do not repeatedly resubmit the same files. |\n| 503 / 504 | Try reading the same job again later. This does not start another analysis. |\n\nResponses must not be cached (`Cache-Control: no-store`). The report does not certify an installed artifact or complete license coverage.\n","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/experimental/licenses/{id}","href":"/api-reference/v1/experimental/get-dependency-licenses-for-a-completed-analysis"},{"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","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","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"}]},{"group":"Vulnerabilities","pages":[{"title":"Look up a vulnerability and affected packages","deprecated":null,"version":null,"openapi":"https://api.githits.dev/v1/openapi.json get /v1/vulnerabilities/{id}","href":"/api-reference/v1/vulnerabilities/look-up-a-vulnerability-and-affected-packages"}]}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/overview"}]}]},"basePath":"","title":"Report dependency licenses from uploaded files - GitHits","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-Myd8dsju.js","utils-C2HkQgW0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-8rSppmTv.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B6MjiCFm.js","snippetPresets-DwrSAONL.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-CxAy5y67.js","ApiExamples-1-a5UQKQ.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C541m7wZ.js","shallow-CWELCZ77.js","getApiPlaygroundDisplay-CTo5Zn03.js","CodeSnippet-D--dzvnl.js","CodeSnippets-DM3cXEDh.js","getPastedJson-C-VECgcL.js","icon-BPq2-Mg3.js","MethodPill-D9J5cUHd.js","DuplicateIcon-BqHaxUnD.js","createIcon-CIbcZHp9.js","DynamicMarkdown-BKiHAm_d.js","SectionHeading-DstQXt3H.js","axios-vUo_bRtp.js","Markdown-CpxgzsKA.js","clsx-C5EfhVm0.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CJ9Oly2E.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Mk6P3qvh.js"]}