The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.
An API key created in the PartFinder console at https://console.partfinder.dev, or a customer key created with POST /v1/keys. Send as Authorization: Bearer <key>. Revocation takes effect within approximately one minute.
The buyer's country, as a two-letter ISO 3166-1 code. The scores are computed for a buyer there, and scored_for_country names it. Without it the scores are not tied to any buyer location.
The buyer country the scores are computed for, from the country parameter. Null when no country was sent: the scores are then not tied to any buyer location.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"PartFinder API","colors":{"primary":"#1D4ED8","light":"#3B82F6","dark":"#1E3A8A"},"favicon":"https://mintcdn.com/partfinder/hGeRCXFb-rSPxOJq/favicon.svg?fit=max\u0026auto=format\u0026n=hGeRCXFb-rSPxOJq\u0026q=85\u0026s=19d37d9d5ca86111d80fb254ae53e1e9","navbar":{"links":[{"href":"https://docs.partfinder.dev/llms.txt","label":"For AI agents: llms.txt"},{"href":"https://console.partfinder.dev","label":"Console"}],"primary":{"type":"button","label":"Get an API key","href":"https://console.partfinder.dev"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"markdown":{"instructions":["The PartFinder API is served at https://api.partfinder.dev. Authenticate with `Authorization: Bearer $PARTFINDER_API_KEY`; create an account at https://console.partfinder.dev/sign-up and pick pay as you go or a monthly or yearly plan (see https://partfinder.dev/pricing), then create a key. Pay as you go starts with 100 free credits, once per person and per company.","Install the PartFinder agent skill with `npx skills add https://docs.partfinder.dev` (skill file: https://docs.partfinder.dev/skill.md).","The OpenAPI document at https://api.partfinder.dev/v1/openapi.json is the source of truth for request and response schemas.","What each call costs and current plans: https://api.partfinder.dev/llms.txt."]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"partfinder","hasAudioNarration":false,"actualSubdomain":"partfinder","customDomains":["docs.partfinder.dev"],"gitSource":{"type":"github","owner":"nimbusopsconsulting","repo":"partfinder-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae714b2bfc5f43dec48d3f4","collectionId":"070dca16-beeb-47de-9652-5b4a8c343a6c","liveDeploymentHistoryId":"6ae714b2bfc5f43dec48d3f4","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ae714b2bfc5f43dec48d3f4","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API Reference","count":36},{"language":"default","tag":"Endpoints","count":35},{"language":"default","tag":"Documentation","count":24},{"language":"default","tag":"Integrations","count":10},{"language":"default","tag":"Guides","count":8},{"language":"default","tag":"Webhooks","count":7},{"language":"default","tag":"BOMs","count":5},{"language":"default","tag":"RFQs","count":5},{"language":"default","tag":"Core Concepts","count":4},{"language":"default","tag":"Compare","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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}],"googleFontsInlined":false},"customCss":[{"filePath":"brand-icons.css","content":".dark img[src=\"/images/logos/openai-blossom-black.svg\"]{content:url(/images/logos/openai-blossom-white.svg)}.dark img[src=\"/images/logos/cursor-cube-2d-light.svg\"]{content:url(/images/logos/cursor-cube-2d-dark.svg)}.dark img[src=\"/images/logos/anthropic-symbol-slate.svg\"]{content:url(/images/logos/anthropic-symbol-ivory.svg)}.dark img[src=\"/images/logos/vercel-symbol-black.svg\"]{content:url(/images/logos/vercel-symbol-white.svg)}"}],"page":{"pagePath":"api-reference/boms/get-a-bom-report","slug":"/api-reference/boms/get-a-bom-report","pageMetadata":{"title":"Get a BOM report","description":"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While `bom.status` is `processing` the lines already analyzed are scored and the rest are `pending`; poll until it is `complete`. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/bom/{id}","href":"/api-reference/boms/get-a-bom-report","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While \", _jsx(_components.code, {\n children: \"bom.status\"\n }), \" is \", _jsx(_components.code, {\n children: \"processing\"\n }), \" the lines already analyzed are scored and the rest are \", _jsx(_components.code, {\n children: \"pending\"\n }), \"; poll until it is \", _jsx(_components.code, {\n children: \"complete\"\n }), \". Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get a BOM report","description":"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While `bom.status` is `processing` the lines already analyzed are scored and the rest are `pending`; poll until it is `complete`. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/bom/{id}","href":"/api-reference/boms/get-a-bom-report","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"getBom","tags":["BOMs"],"summary":"Get a BOM report","description":"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While `bom.status` is `processing` the lines already analyzed are scored and the rest are `pending`; poll until it is `complete`. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.","parameters":["73e8605f-de0d-429c-82d0-5602719cb7f5","97e63b10-af59-43ad-a68f-ae9a59155f10"],"responses":{"200":"7c72fc3a-7159-4e78-ac85-08982efea9d0","400":"fc3c3733-84d2-45a2-96f7-59b6b9bde2ee","401":"c8c78695-302f-4514-b2b5-db9babf7f602","403":"4ff55666-1e2e-4e23-8d8b-1bed5e444f0c","404":"6a18666d-b730-41b0-a8fd-2f9ff8343fe7","429":"5be9d466-2226-4106-bffc-99889b2d37b5"},"method":"get","type":"path","servers":["0fd180cc-370f-4a5d-b567-97592ff7113e"],"security":["ff9e9b82-f90e-4a4b-b1b1-0a91012e4b98"],"path":"/v1/bom/{id}","baseUrlOptions":["https://api.partfinder.dev"],"title":"Get a BOM report","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"73e8605f-de0d-429c-82d0-5602719cb7f5":{"name":"id","in":"path","required":true,"schema":{"type":"string","isRequired":true,"description":"The BOM id returned by `POST /v1/bom`.","uniqueKey":"","typeLabel":"string"},"description":"The BOM id returned by `POST /v1/bom`."},"97e63b10-af59-43ad-a68f-ae9a59155f10":{"name":"country","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Za-z]{2}$","isRequired":false,"description":"The buyer's country, as a two-letter ISO 3166-1 code. The scores are computed for a buyer there, and `scored_for_country` names it. Without it the scores are not tied to any buyer location.","uniqueKey":"","typeLabel":"string"},"example":"SG","description":"The buyer's country, as a two-letter ISO 3166-1 code. The scores are computed for a buyer there, and `scored_for_country` names it. Without it the scores are not tied to any buyer location."}},"responses":{"7c72fc3a-7159-4e78-ac85-08982efea9d0":{"description":"The BOM report.","content":{"application/json":{"schema":{"type":"object","properties":{"as_of":{"type":"string","format":"date-time","description":"ISO 8601. How current the data in this response is.","isRequired":true,"uniqueKey":"as_of","typeLabel":"string\u003cdate-time>"},"summary":{"type":"string","description":"Plain language an agent can relay without re-deriving it.","isRequired":true,"uniqueKey":"summary","typeLabel":"string"},"notice":{"type":"string","description":"Informational-use notice. Always present.","isRequired":true,"uniqueKey":"notice","typeLabel":"string"},"bom":{"type":"object","properties":{"id":{"type":"string","description":"The BOM id. Use it with `GET /v1/bom/{id}` and `DELETE /v1/bom/{id}`.","isRequired":true,"uniqueKey":"bom.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"bom.name","typeLabel":"string"},"status":{"type":"string","enum":["processing","complete"],"description":"`processing` until every line has settled (identified or not); then `complete`.","isRequired":true,"uniqueKey":"bom.status","typeLabel":"enum\u003cstring>"},"lines":{"type":"integer","minimum":0,"description":"Lines accepted.","isRequired":true,"uniqueKey":"bom.lines","typeLabel":"integer"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"bom.created_at","typeLabel":"string\u003cdate-time>"},"completed_at":{"oneOf":[{"type":"string","description":"When every line settled. Null while processing.","format":"date-time","isRequired":true,"uniqueKey":"bom.completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When every line settled. Null while processing.","isRequired":true,"uniqueKey":"bom.completed_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"bom.completed_at","typeLabel":"string\u003cdate-time> | null"},"identified":{"type":"integer","minimum":0,"description":"Lines identified, `resolved` and `low_confidence` together.","isRequired":true,"uniqueKey":"bom.identified","typeLabel":"integer"},"unresolved":{"type":"integer","minimum":0,"description":"Lines that could not be identified.","isRequired":true,"uniqueKey":"bom.unresolved","typeLabel":"integer"}},"required":["id","name","status","lines","created_at","completed_at","identified","unresolved"],"isRequired":true,"uniqueKey":"bom","typeLabel":"object"},"scored_for_country":{"oneOf":[{"type":"string","description":"The buyer country the scores are computed for, from the `country` parameter. Null when no country was sent: the scores are then not tied to any buyer location.","isRequired":true,"uniqueKey":"scored_for_country.oneOf.0","typeLabel":"string"},{"type":"null","description":"The buyer country the scores are computed for, from the `country` parameter. Null when no country was sent: the scores are then not tied to any buyer location.","isRequired":true,"uniqueKey":"scored_for_country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"scored_for_country","typeLabel":"string | null"},"risk":{"type":"object","properties":{"average":{"oneOf":[{"type":"object","description":"The mean of the scored lines. Null while no line is scored.","required":["value","scale","direction","interpretation"],"properties":{"value":{"type":"number","isRequired":true,"uniqueKey":"risk.average.oneOf.0.value","typeLabel":"number"},"scale":{"type":"number","description":"The maximum, e.g. 100 for a 0-100 score.","isRequired":true,"uniqueKey":"risk.average.oneOf.0.scale","typeLabel":"number"},"direction":{"type":"string","enum":["higher_is_worse","higher_is_better"],"isRequired":true,"uniqueKey":"risk.average.oneOf.0.direction","typeLabel":"enum\u003cstring>"},"interpretation":{"type":"string","description":"One line of plain language: what this number means.","isRequired":true,"uniqueKey":"risk.average.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"risk.average.oneOf.0","typeLabel":"object"},{"type":"null","description":"The mean of the scored lines. Null while no line is scored.","isRequired":true,"uniqueKey":"risk.average.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"risk.average","typeLabel":"object | null"},"distribution":{"type":"object","properties":{"critical":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"risk.distribution.critical","typeLabel":"integer"},"high":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"risk.distribution.high","typeLabel":"integer"},"medium":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"risk.distribution.medium","typeLabel":"integer"},"low":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"risk.distribution.low","typeLabel":"integer"},"not_scored":{"type":"integer","minimum":0,"description":"Lines with no score: unresolved, pending, or identified without enough data.","isRequired":true,"uniqueKey":"risk.distribution.not_scored","typeLabel":"integer"}},"required":["critical","high","medium","low","not_scored"],"isRequired":true,"uniqueKey":"risk.distribution","typeLabel":"object"},"gaps":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["single_source","no_supplier","concentration_risk","high_risk_region","lifecycle_risk"],"description":"`single_source`: the only manufacturer for its category in this BOM. `no_supplier`: no supplier named on the line; it counts in the gaps driver. `concentration_risk`: a large share of the BOM is made in one country. `high_risk_region`: made in a high-exposure country. `lifecycle_risk`: end of life, obsolete, or not recommended for new designs.","isRequired":true,"uniqueKey":"risk.gaps.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"lines":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"risk.gaps.items.[INDEX].lines","typeLabel":"integer"},"interpretation":{"type":"string","isRequired":true,"uniqueKey":"risk.gaps.items.[INDEX].interpretation","typeLabel":"string"}},"required":["kind","lines","interpretation"],"uniqueKey":"risk.gaps.items.[INDEX]","typeLabel":"object"},"description":"How many lines carry each gap. Only kinds present in this BOM are listed.","isRequired":true,"uniqueKey":"risk.gaps","typeLabel":"object[]"}},"required":["average","distribution","gaps"],"isRequired":true,"uniqueKey":"risk","typeLabel":"object"},"countries":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","isRequired":true,"uniqueKey":"countries.items.[INDEX].country","typeLabel":"string"},"country_code":{"oneOf":[{"type":"string","description":"ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"countries.items.[INDEX].country_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"countries.items.[INDEX].country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"countries.items.[INDEX].country_code","typeLabel":"string | null"},"lines":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"countries.items.[INDEX].lines","typeLabel":"integer"},"share_percent":{"type":"number","description":"Share of ALL lines in the BOM, unresolved included, 0-100.","isRequired":true,"uniqueKey":"countries.items.[INDEX].share_percent","typeLabel":"number"},"worst_tier":{"oneOf":[{"type":"string","description":"The highest tier among this country's scored lines. Null when none of them is scored.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"countries.items.[INDEX].worst_tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The highest tier among this country's scored lines. Null when none of them is scored.","isRequired":true,"uniqueKey":"countries.items.[INDEX].worst_tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"countries.items.[INDEX].worst_tier","typeLabel":"enum\u003cstring> | null"}},"required":["country","country_code","lines","share_percent","worst_tier"],"uniqueKey":"countries.items.[INDEX]","typeLabel":"object"},"description":"Where the BOM is made, most lines first. Lines with no known origin are not listed.","isRequired":true,"uniqueKey":"countries","typeLabel":"object[]"},"parts":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer","minimum":1,"description":"Position in the BOM as submitted, starting at 1.","isRequired":true,"uniqueKey":"parts.items.[INDEX].line","typeLabel":"integer"},"mpn":{"type":"string","description":"The part number as submitted.","isRequired":true,"uniqueKey":"parts.items.[INDEX].mpn","typeLabel":"string"},"manufacturer":{"oneOf":[{"type":"string","description":"As submitted, or as identified when the BOM did not name one.","isRequired":true,"uniqueKey":"parts.items.[INDEX].manufacturer.oneOf.0","typeLabel":"string"},{"type":"null","description":"As submitted, or as identified when the BOM did not name one.","isRequired":true,"uniqueKey":"parts.items.[INDEX].manufacturer.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].manufacturer","typeLabel":"string | null"},"quantity":{"oneOf":[{"type":"integer","description":"Units of this line in the build, as submitted. Null when none was given.","minimum":0,"exclusiveMinimum":true,"isRequired":true,"uniqueKey":"parts.items.[INDEX].quantity.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Units of this line in the build, as submitted. Null when none was given.","isRequired":true,"uniqueKey":"parts.items.[INDEX].quantity.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].quantity","typeLabel":"integer | null"},"status":{"type":"string","enum":["resolved","low_confidence","unresolved","pending"],"description":"`resolved` when the part was identified with confidence, `low_confidence` when identified tentatively, `unresolved` when it could not be identified, `pending` while it is still being worked.","isRequired":true,"uniqueKey":"parts.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"notes":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["manufacturer_not_listed","part_not_listed","part_number_identified","part_number_needed"],"description":"`manufacturer_not_listed`: the manufacturer given is not among the makers distributors list for this part number. `part_not_listed`: no distributor lists this part number. `part_number_identified`: the line was analyzed under a different part number than the one submitted. `part_number_needed`: what was submitted is not a manufacturer part number that can be identified, so the line is not scored; the `summary` says where to add one (the spreadsheet cell for an uploaded file).","isRequired":true,"uniqueKey":"parts.items.[INDEX].notes.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"summary":{"type":"string","description":"One sentence describing what was found, to relay as written.","isRequired":true,"uniqueKey":"parts.items.[INDEX].notes.items.[INDEX].summary","typeLabel":"string"},"suggestions":{"type":"array","items":{"type":"string","uniqueKey":"parts.items.[INDEX].notes.items.[INDEX].suggestions.items.[INDEX]","typeLabel":"string"},"description":"For `manufacturer_not_listed`, the makers distributors list for this part number, most listed first. For `part_not_listed`, real part numbers that begin with the one submitted. For `part_number_identified`, the part number the line was analyzed as. For `part_number_needed`, a part number the line may refer to, to be confirmed before use. May be empty.","isRequired":true,"uniqueKey":"parts.items.[INDEX].notes.items.[INDEX].suggestions","typeLabel":"string[]"}},"required":["kind","summary","suggestions"],"uniqueKey":"parts.items.[INDEX].notes.items.[INDEX]","typeLabel":"object"},"description":"Where supplier catalogues disagree with what was submitted for this line. The submitted values are kept as they are. Empty when there is nothing to note.","isRequired":true,"uniqueKey":"parts.items.[INDEX].notes","typeLabel":"object[]"},"part":{"type":"object","properties":{"identified_mpn":{"oneOf":[{"type":"string","description":"The part number as identified, when it differs from the one submitted.","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.identified_mpn.oneOf.0","typeLabel":"string"},{"type":"null","description":"The part number as identified, when it differs from the one submitted.","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.identified_mpn.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.identified_mpn","typeLabel":"string | null"},"category":{"oneOf":[{"type":"string","description":"The broad class of part, e.g. \"Semiconductors\". `GET /v1/parts` gives the specific type, e.g. \"DC-DC Buck Converter\".","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.category.oneOf.0","typeLabel":"string"},{"type":"null","description":"The broad class of part, e.g. \"Semiconductors\". `GET /v1/parts` gives the specific type, e.g. \"DC-DC Buck Converter\".","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.category.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.category","typeLabel":"string | null"},"lifecycle":{"oneOf":[{"type":"string","enum":["Active","Mature","NRND","EOL","Obsolete"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.lifecycle.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.lifecycle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.lifecycle","typeLabel":"enum\u003cstring> | null"},"manufacturing_country":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country","typeLabel":"string | null"},"manufacturing_country_code":{"oneOf":[{"type":"string","description":"ISO 3166-1 alpha-2 code of `manufacturing_country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"ISO 3166-1 alpha-2 code of `manufacturing_country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part.manufacturing_country_code","typeLabel":"string | null"}},"required":["identified_mpn","category","lifecycle","manufacturing_country","manufacturing_country_code"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].part","typeLabel":"object"},"risk":{"type":"object","properties":{"composite":{"oneOf":[{"type":"object","description":"Combined from the drivers below. Null when the line could not be identified, or when no distributor has stock or lead-time figures for it; `reason` says which.","required":["value","scale","direction","interpretation"],"properties":{"value":{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.0.value","typeLabel":"number"},"scale":{"type":"number","description":"The maximum, e.g. 100 for a 0-100 score.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.0.scale","typeLabel":"number"},"direction":{"type":"string","enum":["higher_is_worse","higher_is_better"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.0.direction","typeLabel":"enum\u003cstring>"},"interpretation":{"type":"string","description":"One line of plain language: what this number means.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.0","typeLabel":"object"},{"type":"null","description":"Combined from the drivers below. Null when the line could not be identified, or when no distributor has stock or lead-time figures for it; `reason` says which.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.composite","typeLabel":"object | null"},"tier":{"oneOf":[{"type":"string","description":"The band `composite` falls in. Null when composite is null.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The band `composite` falls in. Null when composite is null.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.tier","typeLabel":"enum\u003cstring> | null"},"drivers":{"type":"object","properties":{"geography":{"oneOf":[{"type":"object","description":"Risk carried by the country the part is made in. Null when the origin is not known.","required":["tier","interpretation"],"properties":{"tier":{"oneOf":[{"type":"string","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.0.tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.0.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.0.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.0","typeLabel":"object"},{"type":"null","description":"Risk carried by the country the part is made in. Null when the origin is not known.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.geography","typeLabel":"object | null"},"disruption_exposure":{"oneOf":[{"type":"object","description":"Exposure to active disruption events touching this line's category or origin.","required":["tier","interpretation"],"properties":{"tier":{"oneOf":[{"type":"string","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.0.tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.0.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.0.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.0","typeLabel":"object"},{"type":"null","description":"Exposure to active disruption events touching this line's category or origin.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.disruption_exposure","typeLabel":"object | null"},"lead_time_volatility":{"oneOf":[{"type":"object","description":"Instability of quoted lead times. Null when no lead time is quoted.","required":["tier","interpretation"],"properties":{"tier":{"oneOf":[{"type":"string","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.0.tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.0.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.0.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.0","typeLabel":"object"},{"type":"null","description":"Instability of quoted lead times. Null when no lead time is quoted.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.lead_time_volatility","typeLabel":"object | null"},"gaps":{"oneOf":[{"type":"object","description":"Weaknesses in how this BOM sources the line; the gaps found are listed in `gap_flags`.","required":["tier","interpretation"],"properties":{"tier":{"oneOf":[{"type":"string","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.0.tier.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The band this driver falls in. Null when there is no data for it; `interpretation` says why.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.0.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.0.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.0.interpretation","typeLabel":"string"}},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.0","typeLabel":"object"},{"type":"null","description":"Weaknesses in how this BOM sources the line; the gaps found are listed in `gap_flags`.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers.gaps","typeLabel":"object | null"}},"required":["geography","disruption_exposure","lead_time_volatility","gaps"],"description":"What drives this line's score, each as a band and a sentence. Null when the driver has no data.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.drivers","typeLabel":"object"},"gap_flags":{"type":"array","items":{"type":"string","enum":["single_source","no_supplier","concentration_risk","high_risk_region","lifecycle_risk"],"description":"`single_source`: the only manufacturer for its category in this BOM. `no_supplier`: no supplier named on the line; it counts in the gaps driver. `concentration_risk`: a large share of the BOM is made in one country. `high_risk_region`: made in a high-exposure country. `lifecycle_risk`: end of life, obsolete, or not recommended for new designs.","uniqueKey":"parts.items.[INDEX].risk.gap_flags.items.[INDEX]","typeLabel":"enum\u003cstring>"},"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.gap_flags","typeLabel":"enum\u003cstring>[]"},"events":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["news","port_activity","sea_route"],"description":"`news`: a reported disruption. `port_activity`: ship traffic at the ports of a country this line is made in or sold from is well under its usual level. `sea_route`: the same for a sea passage this line's trade uses.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"id":{"oneOf":[{"type":"integer","description":"The event id for `news`; null otherwise.","minimum":0,"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The event id for `news`; null otherwise.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].id","typeLabel":"integer | null"},"title":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].title","typeLabel":"string"},"root_cause":{"oneOf":[{"type":"string","description":"What kind of cause lies behind a `news` event, as on `GET /v1/events`. Null otherwise.","enum":["natural_disaster","geopolitical_action","regulatory_change","labor_disruption","industrial_incident","infrastructure_failure","cyber_attack"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].root_cause.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"What kind of cause lies behind a `news` event, as on `GET /v1/events`. Null otherwise.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].root_cause.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].root_cause","typeLabel":"enum\u003cstring> | null"},"country":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].country.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].country","typeLabel":"string | null"},"severity":{"oneOf":[{"type":"string","description":"For `news`: how serious the event is in itself, not its effect on this line. Null for `port_activity` and `sea_route`, whose `title` states the slowdown.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].severity.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"For `news`: how serious the event is in itself, not its effect on this line. Null for `port_activity` and `sea_route`, whose `title` states the slowdown.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].severity.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].severity","typeLabel":"enum\u003cstring> | null"},"published_date":{"oneOf":[{"type":"string","description":"For `news`, when it was reported; otherwise the last day of the week it covers.","format":"date-time","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].published_date.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"For `news`, when it was reported; otherwise the last day of the week it covers.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].published_date.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].published_date","typeLabel":"string\u003cdate-time> | null"},"url":{"oneOf":[{"type":"string","description":"A source article for `news`; may be null. Always null otherwise.","format":"uri","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","description":"A source article for `news`; may be null. Always null otherwise.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX].url","typeLabel":"string\u003curi> | null"}},"required":["kind","id","title","root_cause","country","severity","published_date","url"],"uniqueKey":"parts.items.[INDEX].risk.events.items.[INDEX]","typeLabel":"object"},"description":"The current shipping conditions and up to five reported events that most affect this line's `disruption_exposure`, strongest first: ordered by effect on this line's score, not by `severity`.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk.events","typeLabel":"object[]"},"reason":{"description":"Present only when composite is null.","type":"string","uniqueKey":"parts.items.[INDEX].risk.reason","typeLabel":"string"}},"required":["composite","tier","drivers","gap_flags","events"],"description":"This line's risk within this BOM, which includes how the rest of the BOM sources it. `GET /v1/parts` scores a part on its own, with different drivers, so the same part can score differently on the two endpoints.","isRequired":true,"uniqueKey":"parts.items.[INDEX].risk","typeLabel":"object"},"supply":{"type":"object","properties":{"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"parts.items.[INDEX].supply.stock.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.stock","typeLabel":"object"},"lead_time_median":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_median.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_median.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_median.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_median.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"parts.items.[INDEX].supply.lead_time_median.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_median","typeLabel":"object"},"lead_time_min":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_min.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_min.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_min.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_min.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"parts.items.[INDEX].supply.lead_time_min.reason","typeLabel":"string"}},"required":["value","unit"],"description":"The 25th percentile of quoted lead times: the short end of the middle half of quotes. Null when no distributor quotes a lead time, or when the middle half of quotes is a single figure; `reason` says which.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_min","typeLabel":"object"},"lead_time_max":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_max.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_max.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_max.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_max.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"parts.items.[INDEX].supply.lead_time_max.reason","typeLabel":"string"}},"required":["value","unit"],"description":"The 75th percentile of quoted lead times: the long end of the middle half of quotes. Null when no distributor quotes a lead time, or when the middle half of quotes is a single figure; `reason` says which.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.lead_time_max","typeLabel":"object"},"distributor_count":{"type":"integer","minimum":0,"description":"Distributors holding stock of this part. `distributors` shows only some of them.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributor_count","typeLabel":"integer"},"scope":{"oneOf":[{"type":"string","description":"Whose listings the figures above count. `manufacturer`: this line's manufacturer, the one submitted or, when none was, the one identified for the part number. `all_manufacturers`: no manufacturer was submitted or identified, so every maker of this part number. `other_manufacturers`: none is listed for the named manufacturer, so these are other makers of the same part number. Null when there are no figures.","enum":["manufacturer","all_manufacturers","other_manufacturers"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.scope.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Whose listings the figures above count. `manufacturer`: this line's manufacturer, the one submitted or, when none was, the one identified for the part number. `all_manufacturers`: no manufacturer was submitted or identified, so every maker of this part number. `other_manufacturers`: none is listed for the named manufacturer, so these are other makers of the same part number. Null when there are no figures.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.scope.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.scope","typeLabel":"enum\u003cstring> | null"},"distributors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].name","typeLabel":"string"},"country":{"oneOf":[{"type":"string","description":"The distributor's country. Null when it is not a single country.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country.oneOf.0","typeLabel":"string"},{"type":"null","description":"The distributor's country. Null when it is not a single country.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country","typeLabel":"string | null"},"country_code":{"oneOf":[{"type":"string","description":"ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].country_code","typeLabel":"string | null"},"regions":{"type":"array","items":{"type":"string","enum":["Africa","Americas","Asia","Europe","Oceania"],"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].regions.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"The regions this listing serves: the region of `country` when a country is known, otherwise the regions the distributor states for this storefront. Not where the part is made. Empty when no region is stated. These are the UN geographic regions, not the region values of `GET /v1/events`; to find events affecting a distributor, filter events by its `country_code`.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].regions","typeLabel":"enum\u003cstring>[]"},"subregion":{"oneOf":[{"type":"string","description":"The UN sub-region of `country` (for example Western Asia). Not where the part is made. Null when no country is known. These are UN geographic sub-regions, not the region values of `GET /v1/events`; to find events affecting a distributor, filter events by its `country_code`.","enum":["Australia and New Zealand","Central Asia","Eastern Asia","Eastern Europe","Latin America and the Caribbean","Melanesia","Micronesia","Northern Africa","Northern America","Northern Europe","Polynesia","South-eastern Asia","Southern Asia","Southern Europe","Sub-Saharan Africa","Western Asia","Western Europe"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].subregion.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The UN sub-region of `country` (for example Western Asia). Not where the part is made. Null when no country is known. These are UN geographic sub-regions, not the region values of `GET /v1/events`; to find events affecting a distributor, filter events by its `country_code`.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].subregion.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].subregion","typeLabel":"enum\u003cstring> | null"},"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX].stock","typeLabel":"object"}},"required":["name","country","country_code","regions","subregion","stock"],"uniqueKey":"parts.items.[INDEX].supply.distributors.items.[INDEX]","typeLabel":"object"},"description":"The distributors holding the most stock, largest first. Not every distributor is listed: `distributor_count` is the total. Rows can share the same inventory, so do not add them up; `stock` is the total.","isRequired":true,"uniqueKey":"parts.items.[INDEX].supply.distributors","typeLabel":"object[]"}},"required":["stock","lead_time_median","lead_time_min","lead_time_max","distributor_count","scope","distributors"],"isRequired":true,"uniqueKey":"parts.items.[INDEX].supply","typeLabel":"object"}},"required":["line","mpn","manufacturer","quantity","status","notes","part","risk","supply"],"uniqueKey":"parts.items.[INDEX]","typeLabel":"object"},"description":"Every line, in the order submitted. Unresolved lines are present with nulls.","isRequired":true,"uniqueKey":"parts","typeLabel":"object[]"}},"required":["as_of","summary","notice","bom","scored_for_country","risk","countries","parts"],"uniqueKey":"","typeLabel":"object"},"example":{"as_of":"2026-10-01T12:45:25.731Z","summary":"3 lines: 0 critical, 0 high, 2 medium, 0 low, 1 not scored. Flagged at medium or above: geography on 3 lines, disruption exposure on 1 line, lead-time volatility on 2 lines.","notice":"Informational only. Risk scores, stock levels, lead times and alternate-part suggestions may be incomplete, delayed or inaccurate. Independently verify before making procurement, engineering, compliance, safety or sourcing decisions.","bom":{"id":"fc2b3371-7eb7-48cd-8847-70b2d76b0be8","name":"Controller board rev C","status":"complete","lines":3,"created_at":"2026-09-28T15:49:38.809Z","completed_at":"2026-09-28T15:50:00.022Z","identified":3,"unresolved":0},"scored_for_country":null,"risk":{"average":{"value":29,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. The mean of the 2 scored lines."},"distribution":{"critical":0,"high":0,"medium":2,"low":0,"not_scored":1},"gaps":[{"kind":"no_supplier","lines":2,"interpretation":"2 lines name no supplier. A data gap; it counts in the gaps driver."}]},"countries":[{"country":"Mexico","country_code":"MX","lines":1,"share_percent":33.3,"worst_tier":"medium"},{"country":"Malaysia","country_code":"MY","lines":1,"share_percent":33.3,"worst_tier":"medium"},{"country":"China","country_code":"CN","lines":1,"share_percent":33.3,"worst_tier":null}],"parts":[{"line":1,"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":100,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Semiconductors","lifecycle":"Active","manufacturing_country":"Mexico","manufacturing_country_code":"MX"},"risk":{"composite":{"value":31,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, disruption exposure, lead-time volatility and sourcing gaps."},"tier":"medium","drivers":{"geography":{"tier":"high","interpretation":"High. Reflects the risk profile of Mexico."},"disruption_exposure":{"tier":"medium","interpretation":"Medium. Some exposure to active disruptions. 5 events and shipping conditions are listed in `events`."},"lead_time_volatility":{"tier":"medium","interpretation":"Medium. Lead times for this part vary somewhat."},"gaps":{"tier":"low","interpretation":"Low. No sourcing gap flagged for this line."}},"gap_flags":[],"events":[{"kind":"port_activity","id":null,"title":"Ports in Mexico: ship arrivals 21% below the usual level for this time of year","root_cause":null,"country":"Mexico","severity":null,"published_date":"2026-09-18T00:00:00.000Z","url":null},{"kind":"news","id":1179,"title":"Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures","root_cause":"geopolitical_action","country":"United States","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.reuters.com/business/trumps-bid-shield-chip-supply-chain-could-backfire-tennessee-2026-09-04/"},{"kind":"sea_route","id":null,"title":"Panama Canal: ship transits 21% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null},{"kind":"news","id":1189,"title":"China imposes provisional duties on Japanese semiconductor chemical","root_cause":"regulatory_change","country":"China","severity":"medium","published_date":"2026-09-09T00:00:00.000Z","url":"https://hk.epochtimes.com/news/2026-09-09/80403878"},{"kind":"news","id":1166,"title":"China imposes helium export controls affecting global high‑tech supply","root_cause":"regulatory_change","country":"China","severity":"high","published_date":"2026-07-11T00:00:00.000Z","url":"https://www.caixinglobal.com/2026-07-11/china-bans-helium-exports-as-global-supply-crunch-hits-chipmaking-gas-102462943.html"}]},"supply":{"stock":{"value":9215,"unit":"units"},"lead_time_median":{"value":94,"unit":"days"},"lead_time_min":{"value":84,"unit":"days"},"lead_time_max":{"value":106,"unit":"days"},"distributor_count":2,"scope":"manufacturer","distributors":[{"name":"Mouser","country":"United States","country_code":"US","regions":["Americas"],"subregion":"Northern America","stock":{"value":5941,"unit":"units"}},{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":3274,"unit":"units"}}]}},{"line":2,"mpn":"STM32F407VGT6","manufacturer":"STMicroelectronics","quantity":50,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Semiconductors","lifecycle":"Active","manufacturing_country":"Malaysia","manufacturing_country_code":"MY"},"risk":{"composite":{"value":26,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, disruption exposure, lead-time volatility and sourcing gaps."},"tier":"medium","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of Malaysia."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 4 events and shipping conditions are listed in `events`."},"lead_time_volatility":{"tier":"high","interpretation":"High. Lead times for this part vary a lot."},"gaps":{"tier":"low","interpretation":"Low. Sourcing gaps on this line: no supplier named."}},"gap_flags":["no_supplier"],"events":[{"kind":"sea_route","id":null,"title":"Red Sea / Suez: ship transits 54% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null},{"kind":"news","id":1179,"title":"Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures","root_cause":"geopolitical_action","country":"United States","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.reuters.com/business/trumps-bid-shield-chip-supply-chain-could-backfire-tennessee-2026-09-04/"},{"kind":"news","id":1189,"title":"China imposes provisional duties on Japanese semiconductor chemical","root_cause":"regulatory_change","country":"China","severity":"medium","published_date":"2026-09-09T00:00:00.000Z","url":"https://hk.epochtimes.com/news/2026-09-09/80403878"},{"kind":"news","id":1166,"title":"China imposes helium export controls affecting global high‑tech supply","root_cause":"regulatory_change","country":"China","severity":"high","published_date":"2026-07-11T00:00:00.000Z","url":"https://www.caixinglobal.com/2026-07-11/china-bans-helium-exports-as-global-supply-crunch-hits-chipmaking-gas-102462943.html"}]},"supply":{"stock":{"value":24453,"unit":"units"},"lead_time_median":{"value":369,"unit":"days"},"lead_time_min":{"value":220,"unit":"days"},"lead_time_max":{"value":373,"unit":"days"},"distributor_count":4,"scope":"manufacturer","distributors":[{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":21050,"unit":"units"}},{"name":"element14","country":"Singapore","country_code":"SG","regions":["Asia"],"subregion":"South-eastern Asia","stock":{"value":3174,"unit":"units"}}]}},{"line":3,"mpn":"6305-2RS","manufacturer":"SKF","quantity":10,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Bearings \u0026 Linear Guides","lifecycle":null,"manufacturing_country":"China","manufacturing_country_code":"CN"},"risk":{"composite":null,"tier":null,"reason":"No distributor has stock or lead-time figures for this line, so no overall score is computed.","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of China."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 1 event or shipping condition is listed in `events`."},"lead_time_volatility":null,"gaps":{"tier":"low","interpretation":"Low. Sourcing gaps on this line: no supplier named."}},"gap_flags":["no_supplier"],"events":[{"kind":"sea_route","id":null,"title":"Red Sea / Suez: ship transits 54% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null}]},"supply":{"stock":{"value":null,"unit":"units","reason":"No distributor data available for this line."},"lead_time_median":{"value":null,"unit":"days","reason":"No distributor quotes a lead time for this line."},"lead_time_min":{"value":null,"unit":"days","reason":"No distributor quotes a lead time."},"lead_time_max":{"value":null,"unit":"days","reason":"No distributor quotes a lead time."},"distributor_count":0,"scope":null,"distributors":[]}}]},"examples":{"Example":{"title":"Example","value":{"as_of":"2026-10-01T12:45:25.731Z","summary":"3 lines: 0 critical, 0 high, 2 medium, 0 low, 1 not scored. Flagged at medium or above: geography on 3 lines, disruption exposure on 1 line, lead-time volatility on 2 lines.","notice":"Informational only. Risk scores, stock levels, lead times and alternate-part suggestions may be incomplete, delayed or inaccurate. Independently verify before making procurement, engineering, compliance, safety or sourcing decisions.","bom":{"id":"fc2b3371-7eb7-48cd-8847-70b2d76b0be8","name":"Controller board rev C","status":"complete","lines":3,"created_at":"2026-09-28T15:49:38.809Z","completed_at":"2026-09-28T15:50:00.022Z","identified":3,"unresolved":0},"scored_for_country":null,"risk":{"average":{"value":29,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. The mean of the 2 scored lines."},"distribution":{"critical":0,"high":0,"medium":2,"low":0,"not_scored":1},"gaps":[{"kind":"no_supplier","lines":2,"interpretation":"2 lines name no supplier. A data gap; it counts in the gaps driver."}]},"countries":[{"country":"Mexico","country_code":"MX","lines":1,"share_percent":33.3,"worst_tier":"medium"},{"country":"Malaysia","country_code":"MY","lines":1,"share_percent":33.3,"worst_tier":"medium"},{"country":"China","country_code":"CN","lines":1,"share_percent":33.3,"worst_tier":null}],"parts":[{"line":1,"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":100,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Semiconductors","lifecycle":"Active","manufacturing_country":"Mexico","manufacturing_country_code":"MX"},"risk":{"composite":{"value":31,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, disruption exposure, lead-time volatility and sourcing gaps."},"tier":"medium","drivers":{"geography":{"tier":"high","interpretation":"High. Reflects the risk profile of Mexico."},"disruption_exposure":{"tier":"medium","interpretation":"Medium. Some exposure to active disruptions. 5 events and shipping conditions are listed in `events`."},"lead_time_volatility":{"tier":"medium","interpretation":"Medium. Lead times for this part vary somewhat."},"gaps":{"tier":"low","interpretation":"Low. No sourcing gap flagged for this line."}},"gap_flags":[],"events":[{"kind":"port_activity","id":null,"title":"Ports in Mexico: ship arrivals 21% below the usual level for this time of year","root_cause":null,"country":"Mexico","severity":null,"published_date":"2026-09-18T00:00:00.000Z","url":null},{"kind":"news","id":1179,"title":"Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures","root_cause":"geopolitical_action","country":"United States","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.reuters.com/business/trumps-bid-shield-chip-supply-chain-could-backfire-tennessee-2026-09-04/"},{"kind":"sea_route","id":null,"title":"Panama Canal: ship transits 21% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null},{"kind":"news","id":1189,"title":"China imposes provisional duties on Japanese semiconductor chemical","root_cause":"regulatory_change","country":"China","severity":"medium","published_date":"2026-09-09T00:00:00.000Z","url":"https://hk.epochtimes.com/news/2026-09-09/80403878"},{"kind":"news","id":1166,"title":"China imposes helium export controls affecting global high‑tech supply","root_cause":"regulatory_change","country":"China","severity":"high","published_date":"2026-07-11T00:00:00.000Z","url":"https://www.caixinglobal.com/2026-07-11/china-bans-helium-exports-as-global-supply-crunch-hits-chipmaking-gas-102462943.html"}]},"supply":{"stock":{"value":9215,"unit":"units"},"lead_time_median":{"value":94,"unit":"days"},"lead_time_min":{"value":84,"unit":"days"},"lead_time_max":{"value":106,"unit":"days"},"distributor_count":2,"scope":"manufacturer","distributors":[{"name":"Mouser","country":"United States","country_code":"US","regions":["Americas"],"subregion":"Northern America","stock":{"value":5941,"unit":"units"}},{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":3274,"unit":"units"}}]}},{"line":2,"mpn":"STM32F407VGT6","manufacturer":"STMicroelectronics","quantity":50,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Semiconductors","lifecycle":"Active","manufacturing_country":"Malaysia","manufacturing_country_code":"MY"},"risk":{"composite":{"value":26,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, disruption exposure, lead-time volatility and sourcing gaps."},"tier":"medium","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of Malaysia."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 4 events and shipping conditions are listed in `events`."},"lead_time_volatility":{"tier":"high","interpretation":"High. Lead times for this part vary a lot."},"gaps":{"tier":"low","interpretation":"Low. Sourcing gaps on this line: no supplier named."}},"gap_flags":["no_supplier"],"events":[{"kind":"sea_route","id":null,"title":"Red Sea / Suez: ship transits 54% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null},{"kind":"news","id":1179,"title":"Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures","root_cause":"geopolitical_action","country":"United States","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.reuters.com/business/trumps-bid-shield-chip-supply-chain-could-backfire-tennessee-2026-09-04/"},{"kind":"news","id":1189,"title":"China imposes provisional duties on Japanese semiconductor chemical","root_cause":"regulatory_change","country":"China","severity":"medium","published_date":"2026-09-09T00:00:00.000Z","url":"https://hk.epochtimes.com/news/2026-09-09/80403878"},{"kind":"news","id":1166,"title":"China imposes helium export controls affecting global high‑tech supply","root_cause":"regulatory_change","country":"China","severity":"high","published_date":"2026-07-11T00:00:00.000Z","url":"https://www.caixinglobal.com/2026-07-11/china-bans-helium-exports-as-global-supply-crunch-hits-chipmaking-gas-102462943.html"}]},"supply":{"stock":{"value":24453,"unit":"units"},"lead_time_median":{"value":369,"unit":"days"},"lead_time_min":{"value":220,"unit":"days"},"lead_time_max":{"value":373,"unit":"days"},"distributor_count":4,"scope":"manufacturer","distributors":[{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":21050,"unit":"units"}},{"name":"element14","country":"Singapore","country_code":"SG","regions":["Asia"],"subregion":"South-eastern Asia","stock":{"value":3174,"unit":"units"}}]}},{"line":3,"mpn":"6305-2RS","manufacturer":"SKF","quantity":10,"status":"resolved","notes":[],"part":{"identified_mpn":null,"category":"Bearings \u0026 Linear Guides","lifecycle":null,"manufacturing_country":"China","manufacturing_country_code":"CN"},"risk":{"composite":null,"tier":null,"reason":"No distributor has stock or lead-time figures for this line, so no overall score is computed.","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of China."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 1 event or shipping condition is listed in `events`."},"lead_time_volatility":null,"gaps":{"tier":"low","interpretation":"Low. Sourcing gaps on this line: no supplier named."}},"gap_flags":["no_supplier"],"events":[{"kind":"sea_route","id":null,"title":"Red Sea / Suez: ship transits 54% below the usual level for this time of year","root_cause":null,"country":null,"severity":null,"published_date":"2026-09-20T00:00:00.000Z","url":null}]},"supply":{"stock":{"value":null,"unit":"units","reason":"No distributor data available for this line."},"lead_time_median":{"value":null,"unit":"days","reason":"No distributor quotes a lead time for this line."},"lead_time_min":{"value":null,"unit":"days","reason":"No distributor quotes a lead time."},"lead_time_max":{"value":null,"unit":"days","reason":"No distributor quotes a lead time."},"distributor_count":0,"scope":null,"distributors":[]}}]}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Calls allowed in the current window: the minute or the day, whichever has fewer calls left.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Remaining":{"description":"Calls left in that window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer","minimum":1}}},"exampleType":"examples"},"fc3c3733-84d2-45a2-96f7-59b6b9bde2ee":{"description":"`country` is not a country code.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["authentication_required","invalid_key","invalid_request","not_a_specific_part","part_not_found","verification_unavailable","generation_failed","bom_too_large","bom_not_found","bom_columns_not_found","event_not_found","rate_limited","supplier_opted_out","send_failed","rfq_not_found","rfq_bounced","message_refused","key_not_allowed","insufficient_scope","app_disconnected","key_not_found","key_name_taken","webhook_endpoint_not_found","not_a_parts_query","search_not_found","compare_not_found","credits_exhausted","payment_method_required","payment_failed","usage_limit_reached"],"description":"`authentication_required` when no bearer token was sent. `invalid_key` when the key or sign-in is unknown, revoked or expired — deliberately indistinguishable — or the sign-in names no organization you belong to (the `summary` says what to do). `invalid_request` when a required parameter is missing. `not_a_specific_part` when the input does not identify one specific part. `part_not_found` when no supplier lists that part number exactly — usually a typo or a partial number. `verification_unavailable` when we could not check whether the part is real, and so declined to describe it; temporary, safe to retry. `generation_failed` when the report could not be produced, or a search or a comparison could not be started. `bom_too_large` when one call carries more lines than the limit; `reason` states both numbers. `bom_not_found` when no BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `bom_columns_not_found` when an uploaded file has no column we can identify as part numbers; `reason` lists the headers seen. `event_not_found` when no active event has that id. `rate_limited` when your organization has used its calls for this minute or this day; wait the seconds in the `Retry-After` header, then retry. `supplier_opted_out` when the supplier asked not to receive requests for quote from you, or from anyone through PartFinder. `send_failed` when the email could not be sent; nothing was stored, safe to retry. `rfq_not_found` when no request for quote with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `rfq_bounced` when the supplier's address could not receive the request; send a new request for quote to a working address. `message_refused` when the text was not sent; `summary` says what to change before sending again. `key_not_allowed` when a key that belongs to one of your customers calls an endpoint only your organization's own keys may call, or a caller signed in through an AI app manages keys or webhooks. `insufficient_scope` when an AI app signed in without the permission the call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the `summary` names it, and connecting the app again with it allowed fixes it. `app_disconnected` when the AI app the caller signed in through was disconnected in the console; signing in again does not help, allowing the app again in the console does. `key_not_found` when no live end-customer key with that id belongs to your organization. `key_name_taken` when a key with that name already exists in your organization, revoked keys included. `webhook_endpoint_not_found` when no webhook endpoint with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `not_a_parts_query` when a search query is not about a part; send a part number or describe the part. `search_not_found` when no search with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `compare_not_found` when no comparison with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `credits_exhausted` when your plan's credits for this month are used up; this request was not run and nothing was charged. Upgrade the plan at `billing_url`, then retry. `payment_method_required` when your organization is on pay as you go with no payment method; this request was not run and nothing was charged. Add a payment method or choose a plan at `billing_url`, then retry. `payment_failed` when pay as you go is paused because the last payment failed; this request was not run and nothing was charged. Update the payment method at `billing_url`, then retry. `usage_limit_reached` when your organization, on pay as you go, has reached its limit for unpaid usage; this request was not run and nothing was charged. Calls resume once the current payment goes through; follow it at `billing_url`. With a key made with `POST /v1/keys`, these four carry no `billing_url`: the `summary` asks your customer to contact your organization.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"summary":{"description":"One sentence you can relay to a user as-is, the same as `summary` on a successful response. Present whenever there is something useful to say about what went wrong.","type":"string","uniqueKey":"summary","typeLabel":"string"},"reason":{"description":"The specific detail behind the error.","type":"string","uniqueKey":"reason","typeLabel":"string"},"billing_url":{"description":"On `credits_exhausted`, `payment_method_required`, `payment_failed` and `usage_limit_reached`: the PartFinder console Billing page, where your organization manages its plan and payment method. Absent for a key made with `POST /v1/keys`, and for an organization whose plan is set by its contract.","type":"string","format":"uri","uniqueKey":"billing_url","typeLabel":"string\u003curi>"},"did_you_mean":{"description":"Real part numbers to retry with. On `not_a_specific_part` they are parts of the kind you described; on `part_not_found` they are the listed part numbers your input is a prefix of, so `TPS5433` returns TPS54331, TPS54332 and so on. Absent when there is nothing to suggest. Every entry is a real part number, never a guess.","type":"array","items":{"type":"string","uniqueKey":"did_you_mean.items.[INDEX]","typeLabel":"string"},"uniqueKey":"did_you_mean","typeLabel":"string[]"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"authentication_required","summary":"\u003cstring>","reason":"\u003cstring>","billing_url":"\u003cstring>","did_you_mean":["\u003cstring>"]}}},"exampleType":"generated"}},"headers":{"X-RateLimit-Limit":{"description":"Calls allowed in the current window: the minute or the day, whichever has fewer calls left.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Remaining":{"description":"Calls left in that window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer","minimum":1}}},"exampleType":"generated"},"c8c78695-302f-4514-b2b5-db9babf7f602":{"description":"Missing, unknown, revoked or expired key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["authentication_required","invalid_key","invalid_request","not_a_specific_part","part_not_found","verification_unavailable","generation_failed","bom_too_large","bom_not_found","bom_columns_not_found","event_not_found","rate_limited","supplier_opted_out","send_failed","rfq_not_found","rfq_bounced","message_refused","key_not_allowed","insufficient_scope","app_disconnected","key_not_found","key_name_taken","webhook_endpoint_not_found","not_a_parts_query","search_not_found","compare_not_found","credits_exhausted","payment_method_required","payment_failed","usage_limit_reached"],"description":"`authentication_required` when no bearer token was sent. `invalid_key` when the key or sign-in is unknown, revoked or expired — deliberately indistinguishable — or the sign-in names no organization you belong to (the `summary` says what to do). `invalid_request` when a required parameter is missing. `not_a_specific_part` when the input does not identify one specific part. `part_not_found` when no supplier lists that part number exactly — usually a typo or a partial number. `verification_unavailable` when we could not check whether the part is real, and so declined to describe it; temporary, safe to retry. `generation_failed` when the report could not be produced, or a search or a comparison could not be started. `bom_too_large` when one call carries more lines than the limit; `reason` states both numbers. `bom_not_found` when no BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `bom_columns_not_found` when an uploaded file has no column we can identify as part numbers; `reason` lists the headers seen. `event_not_found` when no active event has that id. `rate_limited` when your organization has used its calls for this minute or this day; wait the seconds in the `Retry-After` header, then retry. `supplier_opted_out` when the supplier asked not to receive requests for quote from you, or from anyone through PartFinder. `send_failed` when the email could not be sent; nothing was stored, safe to retry. `rfq_not_found` when no request for quote with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `rfq_bounced` when the supplier's address could not receive the request; send a new request for quote to a working address. `message_refused` when the text was not sent; `summary` says what to change before sending again. `key_not_allowed` when a key that belongs to one of your customers calls an endpoint only your organization's own keys may call, or a caller signed in through an AI app manages keys or webhooks. `insufficient_scope` when an AI app signed in without the permission the call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the `summary` names it, and connecting the app again with it allowed fixes it. `app_disconnected` when the AI app the caller signed in through was disconnected in the console; signing in again does not help, allowing the app again in the console does. `key_not_found` when no live end-customer key with that id belongs to your organization. `key_name_taken` when a key with that name already exists in your organization, revoked keys included. `webhook_endpoint_not_found` when no webhook endpoint with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `not_a_parts_query` when a search query is not about a part; send a part number or describe the part. `search_not_found` when no search with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `compare_not_found` when no comparison with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `credits_exhausted` when your plan's credits for this month are used up; this request was not run and nothing was charged. Upgrade the plan at `billing_url`, then retry. `payment_method_required` when your organization is on pay as you go with no payment method; this request was not run and nothing was charged. Add a payment method or choose a plan at `billing_url`, then retry. `payment_failed` when pay as you go is paused because the last payment failed; this request was not run and nothing was charged. Update the payment method at `billing_url`, then retry. `usage_limit_reached` when your organization, on pay as you go, has reached its limit for unpaid usage; this request was not run and nothing was charged. Calls resume once the current payment goes through; follow it at `billing_url`. With a key made with `POST /v1/keys`, these four carry no `billing_url`: the `summary` asks your customer to contact your organization.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"summary":{"description":"One sentence you can relay to a user as-is, the same as `summary` on a successful response. Present whenever there is something useful to say about what went wrong.","type":"string","uniqueKey":"summary","typeLabel":"string"},"reason":{"description":"The specific detail behind the error.","type":"string","uniqueKey":"reason","typeLabel":"string"},"billing_url":{"description":"On `credits_exhausted`, `payment_method_required`, `payment_failed` and `usage_limit_reached`: the PartFinder console Billing page, where your organization manages its plan and payment method. Absent for a key made with `POST /v1/keys`, and for an organization whose plan is set by its contract.","type":"string","format":"uri","uniqueKey":"billing_url","typeLabel":"string\u003curi>"},"did_you_mean":{"description":"Real part numbers to retry with. On `not_a_specific_part` they are parts of the kind you described; on `part_not_found` they are the listed part numbers your input is a prefix of, so `TPS5433` returns TPS54331, TPS54332 and so on. Absent when there is nothing to suggest. Every entry is a real part number, never a guess.","type":"array","items":{"type":"string","uniqueKey":"did_you_mean.items.[INDEX]","typeLabel":"string"},"uniqueKey":"did_you_mean","typeLabel":"string[]"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"authentication_required","summary":"\u003cstring>","reason":"\u003cstring>","billing_url":"\u003cstring>","did_you_mean":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"4ff55666-1e2e-4e23-8d8b-1bed5e444f0c":{"description":"The caller signed in through an AI app without the permission this call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the error is `insufficient_scope`. Or the AI app was disconnected in the console; the error is `app_disconnected`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["authentication_required","invalid_key","invalid_request","not_a_specific_part","part_not_found","verification_unavailable","generation_failed","bom_too_large","bom_not_found","bom_columns_not_found","event_not_found","rate_limited","supplier_opted_out","send_failed","rfq_not_found","rfq_bounced","message_refused","key_not_allowed","insufficient_scope","app_disconnected","key_not_found","key_name_taken","webhook_endpoint_not_found","not_a_parts_query","search_not_found","compare_not_found","credits_exhausted","payment_method_required","payment_failed","usage_limit_reached"],"description":"`authentication_required` when no bearer token was sent. `invalid_key` when the key or sign-in is unknown, revoked or expired — deliberately indistinguishable — or the sign-in names no organization you belong to (the `summary` says what to do). `invalid_request` when a required parameter is missing. `not_a_specific_part` when the input does not identify one specific part. `part_not_found` when no supplier lists that part number exactly — usually a typo or a partial number. `verification_unavailable` when we could not check whether the part is real, and so declined to describe it; temporary, safe to retry. `generation_failed` when the report could not be produced, or a search or a comparison could not be started. `bom_too_large` when one call carries more lines than the limit; `reason` states both numbers. `bom_not_found` when no BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `bom_columns_not_found` when an uploaded file has no column we can identify as part numbers; `reason` lists the headers seen. `event_not_found` when no active event has that id. `rate_limited` when your organization has used its calls for this minute or this day; wait the seconds in the `Retry-After` header, then retry. `supplier_opted_out` when the supplier asked not to receive requests for quote from you, or from anyone through PartFinder. `send_failed` when the email could not be sent; nothing was stored, safe to retry. `rfq_not_found` when no request for quote with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `rfq_bounced` when the supplier's address could not receive the request; send a new request for quote to a working address. `message_refused` when the text was not sent; `summary` says what to change before sending again. `key_not_allowed` when a key that belongs to one of your customers calls an endpoint only your organization's own keys may call, or a caller signed in through an AI app manages keys or webhooks. `insufficient_scope` when an AI app signed in without the permission the call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the `summary` names it, and connecting the app again with it allowed fixes it. `app_disconnected` when the AI app the caller signed in through was disconnected in the console; signing in again does not help, allowing the app again in the console does. `key_not_found` when no live end-customer key with that id belongs to your organization. `key_name_taken` when a key with that name already exists in your organization, revoked keys included. `webhook_endpoint_not_found` when no webhook endpoint with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `not_a_parts_query` when a search query is not about a part; send a part number or describe the part. `search_not_found` when no search with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `compare_not_found` when no comparison with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `credits_exhausted` when your plan's credits for this month are used up; this request was not run and nothing was charged. Upgrade the plan at `billing_url`, then retry. `payment_method_required` when your organization is on pay as you go with no payment method; this request was not run and nothing was charged. Add a payment method or choose a plan at `billing_url`, then retry. `payment_failed` when pay as you go is paused because the last payment failed; this request was not run and nothing was charged. Update the payment method at `billing_url`, then retry. `usage_limit_reached` when your organization, on pay as you go, has reached its limit for unpaid usage; this request was not run and nothing was charged. Calls resume once the current payment goes through; follow it at `billing_url`. With a key made with `POST /v1/keys`, these four carry no `billing_url`: the `summary` asks your customer to contact your organization.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"summary":{"description":"One sentence you can relay to a user as-is, the same as `summary` on a successful response. Present whenever there is something useful to say about what went wrong.","type":"string","uniqueKey":"summary","typeLabel":"string"},"reason":{"description":"The specific detail behind the error.","type":"string","uniqueKey":"reason","typeLabel":"string"},"billing_url":{"description":"On `credits_exhausted`, `payment_method_required`, `payment_failed` and `usage_limit_reached`: the PartFinder console Billing page, where your organization manages its plan and payment method. Absent for a key made with `POST /v1/keys`, and for an organization whose plan is set by its contract.","type":"string","format":"uri","uniqueKey":"billing_url","typeLabel":"string\u003curi>"},"did_you_mean":{"description":"Real part numbers to retry with. On `not_a_specific_part` they are parts of the kind you described; on `part_not_found` they are the listed part numbers your input is a prefix of, so `TPS5433` returns TPS54331, TPS54332 and so on. Absent when there is nothing to suggest. Every entry is a real part number, never a guess.","type":"array","items":{"type":"string","uniqueKey":"did_you_mean.items.[INDEX]","typeLabel":"string"},"uniqueKey":"did_you_mean","typeLabel":"string[]"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"authentication_required","summary":"\u003cstring>","reason":"\u003cstring>","billing_url":"\u003cstring>","did_you_mean":["\u003cstring>"]}}},"exampleType":"generated"}},"headers":{"X-RateLimit-Limit":{"description":"Calls allowed in the current window: the minute or the day, whichever has fewer calls left.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Remaining":{"description":"Calls left in that window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer","minimum":1}}},"exampleType":"generated"},"6a18666d-b730-41b0-a8fd-2f9ff8343fe7":{"description":"No BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["authentication_required","invalid_key","invalid_request","not_a_specific_part","part_not_found","verification_unavailable","generation_failed","bom_too_large","bom_not_found","bom_columns_not_found","event_not_found","rate_limited","supplier_opted_out","send_failed","rfq_not_found","rfq_bounced","message_refused","key_not_allowed","insufficient_scope","app_disconnected","key_not_found","key_name_taken","webhook_endpoint_not_found","not_a_parts_query","search_not_found","compare_not_found","credits_exhausted","payment_method_required","payment_failed","usage_limit_reached"],"description":"`authentication_required` when no bearer token was sent. `invalid_key` when the key or sign-in is unknown, revoked or expired — deliberately indistinguishable — or the sign-in names no organization you belong to (the `summary` says what to do). `invalid_request` when a required parameter is missing. `not_a_specific_part` when the input does not identify one specific part. `part_not_found` when no supplier lists that part number exactly — usually a typo or a partial number. `verification_unavailable` when we could not check whether the part is real, and so declined to describe it; temporary, safe to retry. `generation_failed` when the report could not be produced, or a search or a comparison could not be started. `bom_too_large` when one call carries more lines than the limit; `reason` states both numbers. `bom_not_found` when no BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `bom_columns_not_found` when an uploaded file has no column we can identify as part numbers; `reason` lists the headers seen. `event_not_found` when no active event has that id. `rate_limited` when your organization has used its calls for this minute or this day; wait the seconds in the `Retry-After` header, then retry. `supplier_opted_out` when the supplier asked not to receive requests for quote from you, or from anyone through PartFinder. `send_failed` when the email could not be sent; nothing was stored, safe to retry. `rfq_not_found` when no request for quote with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `rfq_bounced` when the supplier's address could not receive the request; send a new request for quote to a working address. `message_refused` when the text was not sent; `summary` says what to change before sending again. `key_not_allowed` when a key that belongs to one of your customers calls an endpoint only your organization's own keys may call, or a caller signed in through an AI app manages keys or webhooks. `insufficient_scope` when an AI app signed in without the permission the call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the `summary` names it, and connecting the app again with it allowed fixes it. `app_disconnected` when the AI app the caller signed in through was disconnected in the console; signing in again does not help, allowing the app again in the console does. `key_not_found` when no live end-customer key with that id belongs to your organization. `key_name_taken` when a key with that name already exists in your organization, revoked keys included. `webhook_endpoint_not_found` when no webhook endpoint with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `not_a_parts_query` when a search query is not about a part; send a part number or describe the part. `search_not_found` when no search with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `compare_not_found` when no comparison with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `credits_exhausted` when your plan's credits for this month are used up; this request was not run and nothing was charged. Upgrade the plan at `billing_url`, then retry. `payment_method_required` when your organization is on pay as you go with no payment method; this request was not run and nothing was charged. Add a payment method or choose a plan at `billing_url`, then retry. `payment_failed` when pay as you go is paused because the last payment failed; this request was not run and nothing was charged. Update the payment method at `billing_url`, then retry. `usage_limit_reached` when your organization, on pay as you go, has reached its limit for unpaid usage; this request was not run and nothing was charged. Calls resume once the current payment goes through; follow it at `billing_url`. With a key made with `POST /v1/keys`, these four carry no `billing_url`: the `summary` asks your customer to contact your organization.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"summary":{"description":"One sentence you can relay to a user as-is, the same as `summary` on a successful response. Present whenever there is something useful to say about what went wrong.","type":"string","uniqueKey":"summary","typeLabel":"string"},"reason":{"description":"The specific detail behind the error.","type":"string","uniqueKey":"reason","typeLabel":"string"},"billing_url":{"description":"On `credits_exhausted`, `payment_method_required`, `payment_failed` and `usage_limit_reached`: the PartFinder console Billing page, where your organization manages its plan and payment method. Absent for a key made with `POST /v1/keys`, and for an organization whose plan is set by its contract.","type":"string","format":"uri","uniqueKey":"billing_url","typeLabel":"string\u003curi>"},"did_you_mean":{"description":"Real part numbers to retry with. On `not_a_specific_part` they are parts of the kind you described; on `part_not_found` they are the listed part numbers your input is a prefix of, so `TPS5433` returns TPS54331, TPS54332 and so on. Absent when there is nothing to suggest. Every entry is a real part number, never a guess.","type":"array","items":{"type":"string","uniqueKey":"did_you_mean.items.[INDEX]","typeLabel":"string"},"uniqueKey":"did_you_mean","typeLabel":"string[]"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"authentication_required","summary":"\u003cstring>","reason":"\u003cstring>","billing_url":"\u003cstring>","did_you_mean":["\u003cstring>"]}}},"exampleType":"generated"}},"headers":{"X-RateLimit-Limit":{"description":"Calls allowed in the current window: the minute or the day, whichever has fewer calls left.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Remaining":{"description":"Calls left in that window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer","minimum":1}}},"exampleType":"generated"},"5be9d466-2226-4106-bffc-99889b2d37b5":{"description":"Your organization has used its calls for this minute or this day. Wait the number of seconds in `Retry-After`, then retry.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Limit":{"description":"Calls allowed in the current window: the minute or the day, whichever has fewer calls left.","schema":{"type":"integer","minimum":1}},"X-RateLimit-Remaining":{"description":"Calls left in that window.","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Seconds until that window resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","enum":["authentication_required","invalid_key","invalid_request","not_a_specific_part","part_not_found","verification_unavailable","generation_failed","bom_too_large","bom_not_found","bom_columns_not_found","event_not_found","rate_limited","supplier_opted_out","send_failed","rfq_not_found","rfq_bounced","message_refused","key_not_allowed","insufficient_scope","app_disconnected","key_not_found","key_name_taken","webhook_endpoint_not_found","not_a_parts_query","search_not_found","compare_not_found","credits_exhausted","payment_method_required","payment_failed","usage_limit_reached"],"description":"`authentication_required` when no bearer token was sent. `invalid_key` when the key or sign-in is unknown, revoked or expired — deliberately indistinguishable — or the sign-in names no organization you belong to (the `summary` says what to do). `invalid_request` when a required parameter is missing. `not_a_specific_part` when the input does not identify one specific part. `part_not_found` when no supplier lists that part number exactly — usually a typo or a partial number. `verification_unavailable` when we could not check whether the part is real, and so declined to describe it; temporary, safe to retry. `generation_failed` when the report could not be produced, or a search or a comparison could not be started. `bom_too_large` when one call carries more lines than the limit; `reason` states both numbers. `bom_not_found` when no BOM with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `bom_columns_not_found` when an uploaded file has no column we can identify as part numbers; `reason` lists the headers seen. `event_not_found` when no active event has that id. `rate_limited` when your organization has used its calls for this minute or this day; wait the seconds in the `Retry-After` header, then retry. `supplier_opted_out` when the supplier asked not to receive requests for quote from you, or from anyone through PartFinder. `send_failed` when the email could not be sent; nothing was stored, safe to retry. `rfq_not_found` when no request for quote with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `rfq_bounced` when the supplier's address could not receive the request; send a new request for quote to a working address. `message_refused` when the text was not sent; `summary` says what to change before sending again. `key_not_allowed` when a key that belongs to one of your customers calls an endpoint only your organization's own keys may call, or a caller signed in through an AI app manages keys or webhooks. `insufficient_scope` when an AI app signed in without the permission the call needs (`partfinder:read` to read, which includes looking up parts, alternates and events and uses credits for those; `partfinder:write` to change anything); the `summary` names it, and connecting the app again with it allowed fixes it. `app_disconnected` when the AI app the caller signed in through was disconnected in the console; signing in again does not help, allowing the app again in the console does. `key_not_found` when no live end-customer key with that id belongs to your organization. `key_name_taken` when a key with that name already exists in your organization, revoked keys included. `webhook_endpoint_not_found` when no webhook endpoint with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `not_a_parts_query` when a search query is not about a part; send a part number or describe the part. `search_not_found` when no search with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `compare_not_found` when no comparison with that id belongs to your organization (with a key made with `POST /v1/keys`, to that customer). `credits_exhausted` when your plan's credits for this month are used up; this request was not run and nothing was charged. Upgrade the plan at `billing_url`, then retry. `payment_method_required` when your organization is on pay as you go with no payment method; this request was not run and nothing was charged. Add a payment method or choose a plan at `billing_url`, then retry. `payment_failed` when pay as you go is paused because the last payment failed; this request was not run and nothing was charged. Update the payment method at `billing_url`, then retry. `usage_limit_reached` when your organization, on pay as you go, has reached its limit for unpaid usage; this request was not run and nothing was charged. Calls resume once the current payment goes through; follow it at `billing_url`. With a key made with `POST /v1/keys`, these four carry no `billing_url`: the `summary` asks your customer to contact your organization.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"summary":{"description":"One sentence you can relay to a user as-is, the same as `summary` on a successful response. Present whenever there is something useful to say about what went wrong.","type":"string","uniqueKey":"summary","typeLabel":"string"},"reason":{"description":"The specific detail behind the error.","type":"string","uniqueKey":"reason","typeLabel":"string"},"billing_url":{"description":"On `credits_exhausted`, `payment_method_required`, `payment_failed` and `usage_limit_reached`: the PartFinder console Billing page, where your organization manages its plan and payment method. Absent for a key made with `POST /v1/keys`, and for an organization whose plan is set by its contract.","type":"string","format":"uri","uniqueKey":"billing_url","typeLabel":"string\u003curi>"},"did_you_mean":{"description":"Real part numbers to retry with. On `not_a_specific_part` they are parts of the kind you described; on `part_not_found` they are the listed part numbers your input is a prefix of, so `TPS5433` returns TPS54331, TPS54332 and so on. Absent when there is nothing to suggest. Every entry is a real part number, never a guess.","type":"array","items":{"type":"string","uniqueKey":"did_you_mean.items.[INDEX]","typeLabel":"string"},"uniqueKey":"did_you_mean","typeLabel":"string[]"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"authentication_required","summary":"\u003cstring>","reason":"\u003cstring>","billing_url":"\u003cstring>","did_you_mean":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"ff9e9b82-f90e-4a4b-b1b1-0a91012e4b98":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key created in the PartFinder console at https://console.partfinder.dev, or a customer key created with `POST /v1/keys`. Send as `Authorization: Bearer \u003ckey>`. Revocation takes effect within approximately one minute.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"0fd180cc-370f-4a5d-b567-97592ff7113e":{"url":"https://api.partfinder.dev"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An API key created in the PartFinder console at https://console.partfinder.dev, or a customer key created with `POST /v1/keys`. Send as `Authorization: Bearer \u003ckey>`. Revocation takes effect within approximately one minute.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An API key created in the PartFinder console at https://console.partfinder.dev, or a customer key created with `POST /v1/keys`. Send as `Authorization: Bearer \u003ckey>`. Revocation takes effect within approximately one minute.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"https://api.partfinder.dev/v1/openapi.json"},"subdomain":"partfinder","siteName":"PartFinder API","title":"Get a BOM report - PartFinder API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-01T08:04:57.850Z","originalFileLocation":"api-reference/boms/get-a-bom-report.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=\"system\"}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=\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\">\u003cmeta data-mint-head name=\"application-name\" content=\"PartFinder API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_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/partfinder/EFtN-rIWwyuXX5BE/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get a BOM report - PartFinder API\">\u003cmeta data-mint-head property=\"og:description\" content=\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"PartFinder API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://partfinder.mintlify.app/_mintlify/api/og/v2?division=BOMs\u0026amp;title=Get+a+BOM+report\u0026amp;description=The+report+for+one+BOM%3A+a+risk+average+and+distribution%2C+the+gaps+across+the+BOM%2C+where+it+is+made%2C+and+every+line+with+its+own+score%2C+drivers+and+current+suppl\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=8a6d3bcb6229ed0dfa08d8c955dd65656010e77a5fff1603db13aa3d580b0368\">\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=\"Get a BOM report - PartFinder API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://partfinder.mintlify.app/_mintlify/api/og/v2?division=BOMs\u0026amp;title=Get+a+BOM+report\u0026amp;description=The+report+for+one+BOM%3A+a+risk+average+and+distribution%2C+the+gaps+across+the+BOM%2C+where+it+is+made%2C+and+every+line+with+its+own+score%2C+drivers+and+current+suppl\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=8a6d3bcb6229ed0dfa08d8c955dd65656010e77a5fff1603db13aa3d580b0368\">\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/partfinder/EFtN-rIWwyuXX5BE/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"PartFinder API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1D4ED8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/boms/get-a-bom-report.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.partfinder.dev/#organization\",\"name\":\"PartFinder API\",\"url\":\"https://docs.partfinder.dev\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.partfinder.dev#website\",\"name\":\"PartFinder API\",\"url\":\"https://docs.partfinder.dev\",\"publisher\":{\"@id\":\"https://docs.partfinder.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report#webpage\",\"url\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report\",\"name\":\"Get a BOM report\",\"description\":\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\",\"dateModified\":\"2026-11-01T08:04:57.850Z\",\"isPartOf\":{\"@id\":\"https://docs.partfinder.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.partfinder.dev/api-reference/authentication/verify-an-api-key\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"BOMs\",\"item\":\"https://docs.partfinder.dev/api-reference/boms/list-your-boms\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Get a BOM report\",\"item\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report#apireference\",\"headline\":\"Get a BOM report\",\"name\":\"Get a BOM report\",\"description\":\"The report for one BOM: a risk average and distribution, the gaps across the BOM, where it is made, and every line with its own score, drivers and current supply. While bom.status is processing the lines already analyzed are scored and the rest are pending; poll until it is complete. Each poll counts toward your rate limit. Scores are computed at read time against current disruption events and distributor figures.\",\"url\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report\",\"mainEntityOfPage\":{\"@id\":\"https://docs.partfinder.dev/api-reference/boms/get-a-bom-report#webpage\"},\"dateModified\":\"2026-11-01T08:04:57.850Z\",\"publisher\":{\"@id\":\"https://docs.partfinder.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.partfinder.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"PartFinder API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"PartFinder API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"PartFinder REST API: reference overview and endpoints","sidebarTitle":"Overview","href":"/api-reference/overview"}]},{"group":"Endpoints","pages":[{"group":"Authentication","pages":[{"title":"Verify an API key","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/ping","href":"/api-reference/authentication/verify-an-api-key"}]},{"group":"Parts","pages":[{"title":"Research a part","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/parts","href":"/api-reference/parts/research-a-part"},{"title":"Find alternate parts","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/alternates","href":"/api-reference/parts/find-alternate-parts"}]},{"group":"BOMs","pages":[{"title":"List your BOMs","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/bom","href":"/api-reference/boms/list-your-boms"},{"title":"Analyze a BOM","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/bom","href":"/api-reference/boms/analyze-a-bom"},{"title":"Upload a BOM file","description":"Submit a bill of materials as a CSV or XLSX file. We find the part-number column and the other columns we recognise (manufacturer, quantity, supplier, description, and more), then run the same analysis as `POST /v1/bom`: the call answers `202` with the BOM id and `GET /v1/bom/{id}` carries the report. One file carries up to 2,000 rows. A request body over 4.5 MB is refused with `413`.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/bom/upload","href":"/api-reference/boms/upload-a-bom-file"},{"title":"Get a BOM report","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/bom/{id}","href":"/api-reference/boms/get-a-bom-report"},{"title":"Delete a BOM","description":"Removes the BOM and every line. Irreversible.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/bom/{id}","href":"/api-reference/boms/delete-a-bom"}]},{"group":"Events","pages":[{"title":"List disruption events","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/events","href":"/api-reference/events/list-disruption-events"},{"title":"Get a disruption event","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/events/{id}","href":"/api-reference/events/get-a-disruption-event"},{"title":"Disruptions by country","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/events/countries","href":"/api-reference/events/disruptions-by-country"},{"title":"Port and sea-route activity","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/events/shipping","href":"/api-reference/events/port-and-sea-route-activity"}]},{"group":"Search","pages":[{"title":"List your searches","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/search","href":"/api-reference/search/list-your-searches"},{"title":"Search for parts","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/search","href":"/api-reference/search/search-for-parts"},{"title":"Get a search","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/search/{id}","href":"/api-reference/search/get-a-search"},{"title":"Delete a search","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/search/{id}","href":"/api-reference/search/delete-a-search"}]},{"group":"Compare","pages":[{"title":"List your comparisons","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/compare","href":"/api-reference/compare/list-your-comparisons"},{"title":"Compare parts","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/compare","href":"/api-reference/compare/compare-parts"},{"title":"Get a comparison","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/compare/{id}","href":"/api-reference/compare/get-a-comparison"},{"title":"Delete a comparison","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/compare/{id}","href":"/api-reference/compare/delete-a-comparison"}]},{"group":"RFQs","pages":[{"title":"List your requests for quote","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/rfq","href":"/api-reference/rfqs/list-your-requests-for-quote"},{"title":"Send a request for quote","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/rfq","href":"/api-reference/rfqs/send-a-request-for-quote"},{"title":"Get a request for quote","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/rfq/{id}","href":"/api-reference/rfqs/get-a-request-for-quote"},{"title":"Delete a request for quote","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/rfq/{id}","href":"/api-reference/rfqs/delete-a-request-for-quote"},{"title":"Send a message in a request for quote","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/rfq/{id}/messages","href":"/api-reference/rfqs/send-a-message-in-a-request-for-quote"}]},{"group":"Keys","pages":[{"title":"List customer keys","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/keys","href":"/api-reference/keys/list-customer-keys"},{"title":"Create a key for a customer","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/keys","href":"/api-reference/keys/create-a-key-for-a-customer"},{"title":"Revoke a customer key","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/keys/{id}","href":"/api-reference/keys/revoke-a-customer-key"}]},{"group":"Webhooks","pages":[{"title":"List webhook endpoints","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/webhooks","href":"/api-reference/webhooks/list-webhook-endpoints"},{"title":"Register a webhook endpoint","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/webhooks","href":"/api-reference/webhooks/register-a-webhook-endpoint"},{"title":"Delete a webhook endpoint","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json delete /v1/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook-endpoint"},{"title":"A supplier replied","version":null,"deprecated":null,"openapi":"https://api.partfinder.dev/v1/openapi.json webhook rfq.reply_received","href":"/api-reference/webhooks/a-supplier-replied"},{"title":"A request for quote bounced","version":null,"deprecated":null,"openapi":"https://api.partfinder.dev/v1/openapi.json webhook rfq.bounced","href":"/api-reference/webhooks/a-request-for-quote-bounced"},{"title":"A search ended","version":null,"deprecated":null,"openapi":"https://api.partfinder.dev/v1/openapi.json webhook search.completed","href":"/api-reference/webhooks/a-search-ended"},{"title":"A comparison ended","version":null,"deprecated":null,"openapi":"https://api.partfinder.dev/v1/openapi.json webhook compare.completed","href":"/api-reference/webhooks/a-comparison-ended"}]}]}]}]},"basePath":"","title":"Get a BOM report - PartFinder API","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-DCDCdBVX.js","utils-ME8dDnLe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-0e84ACsd.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-wgRBj-ia.js","snippetPresets-C11Sgb-o.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-Bevw23-4.js","ApiExamples-C0lapOpP.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-ZeRQV8fF.js","shallow-BupWh095.js","getApiPlaygroundDisplay-BnYQO2Ss.js","CodeSnippet-RKKOc8c_.js","CodeSnippets-Drf_m8wS.js","getPastedJson-u6QiPzNZ.js","icon-Bb-CBSxO.js","MethodPill-F7l5AI7V.js","DuplicateIcon-IiAXkdSg.js","createIcon-FliI8EBc.js","DynamicMarkdown-B62XqCSI.js","SectionHeading-Dj31pT03.js","axios-vUo_bRtp.js","Markdown-BOgQCTwD.js","clsx-BIWXJmsZ.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DKZWslLH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-UDqbR6xh.js"]}