Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.
A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.
{
"error": "credits_exhausted",
"summary": "Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.",
"reason": "This request needs 20 credits and 0 are left.",
"billing_url": "https://console.partfinder.dev/settings/billing"
}
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.
Only needed for a part number several manufacturers make, such as NE555N. Omit it otherwise — a bare part number is the normal case.
It narrows the supply figures to that manufacturer and, when known, the manufacturing origin to where that manufacturer makes the part, and with it the risk drivers that depend on where the part is made. A manufacturer that does not list the part returns a report with no supply data.
The buyer's country, as a two-letter ISO 3166-1 code. Adds supply.nearby: the distributors holding stock in that country, then elsewhere in its region. The risk score and every other field are the same with or without it.
This part's risk on its own. A line in GET /v1/bom/{id} is scored within its BOM, with different drivers, so the same part can score differently on the two endpoints.
The reported events and current shipping conditions that most affect this part's disruption_exposure, strongest first: ordered by effect on this part's score, not by severity. Empty when none does.
Parts that could replace this one, up to five: the same list as GET /v1/alternates. Never this part itself or the same part in another package or ordering variant. Not ranked. Empty when none was found.
{
"error": "credits_exhausted",
"summary": "Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.",
"reason": "This request needs 20 credits and 0 are left.",
"billing_url": "https://console.partfinder.dev/settings/billing"
}
{"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/parts/research-a-part","slug":"/api-reference/parts/research-a-part","pageMetadata":{"title":"Research a part","description":"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.\n\nA cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry `Cache-Control: no-store`.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/parts","href":"/api-reference/parts/research-a-part","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry \", _jsx(_components.code, {\n children: \"Cache-Control: no-store\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\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":"Research a part","description":"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.\n\nA cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry `Cache-Control: no-store`.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/parts","href":"/api-reference/parts/research-a-part","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"researchPart","tags":["Parts"],"summary":"Research a part","description":"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.\n\nA cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry `Cache-Control: no-store`.","parameters":["6f253c83-d19c-4fd8-8e4d-a65bea519320","b4232bd5-6b30-4884-a196-bd7521624926","176dcb9e-ae88-4f33-88c1-dc01a40e5451"],"responses":{"200":"2223fe2c-8793-4bf9-9ab8-6f242ac4fbb3","400":"0ab00fa0-f756-41cc-bc47-8a54cb199725","401":"be90d0d4-df0c-4685-b831-51989f56b62b","402":"dd3056c9-1dc0-4b2d-90cf-3acb945aabf3","403":"daca493f-af6b-4942-a982-8f3c9d664c37","404":"f182f129-b52b-4e42-8fd4-80b2bf3d0e0a","422":"afd9c9a3-e6b3-4b36-ad90-302814ca8ecc","429":"19bbf014-b5b3-4f99-9e99-6761e0e516dd","502":"66c1e775-a9da-43f3-b71a-64b4c27a2bed","503":"a9a0c576-6aa2-407c-8011-155016b8b23d"},"method":"get","type":"path","servers":["0fd180cc-370f-4a5d-b567-97592ff7113e"],"security":["ff9e9b82-f90e-4a4b-b1b1-0a91012e4b98"],"path":"/v1/parts","baseUrlOptions":["https://api.partfinder.dev"],"title":"Research a part","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"6f253c83-d19c-4fd8-8e4d-a65bea519320":{"name":"mpn","in":"query","required":true,"schema":{"type":"string","isRequired":true,"description":"The manufacturer part number.","uniqueKey":"","typeLabel":"string"},"example":"TPS54331DR","description":"The manufacturer part number."},"b4232bd5-6b30-4884-a196-bd7521624926":{"name":"manufacturer","in":"query","required":false,"schema":{"type":"string","isRequired":false,"description":"Only needed for a part number several manufacturers make, such as NE555N. Omit it otherwise — a bare part number is the normal case.\n\nIt narrows the supply figures to that manufacturer and, when known, the manufacturing origin to where that manufacturer makes the part, and with it the risk drivers that depend on where the part is made. A manufacturer that does not list the part returns a report with no supply data.","uniqueKey":"","typeLabel":"string"},"example":"Texas Instruments","description":"Only needed for a part number several manufacturers make, such as NE555N. Omit it otherwise — a bare part number is the normal case.\n\nIt narrows the supply figures to that manufacturer and, when known, the manufacturing origin to where that manufacturer makes the part, and with it the risk drivers that depend on where the part is made. A manufacturer that does not list the part returns a report with no supply data."},"176dcb9e-ae88-4f33-88c1-dc01a40e5451":{"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. Adds `supply.nearby`: the distributors holding stock in that country, then elsewhere in its region. The risk score and every other field are the same with or without it.","uniqueKey":"","typeLabel":"string"},"example":"SG","description":"The buyer's country, as a two-letter ISO 3166-1 code. Adds `supply.nearby`: the distributors holding stock in that country, then elsewhere in its region. The risk score and every other field are the same with or without it."}},"responses":{"2223fe2c-8793-4bf9-9ab8-6f242ac4fbb3":{"description":"The part 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"},"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":"notes.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"summary":{"type":"string","description":"One sentence describing what was found, to relay as written.","isRequired":true,"uniqueKey":"notes.items.[INDEX].summary","typeLabel":"string"},"suggestions":{"type":"array","items":{"type":"string","uniqueKey":"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":"notes.items.[INDEX].suggestions","typeLabel":"string[]"}},"required":["kind","summary","suggestions"],"uniqueKey":"notes.items.[INDEX]","typeLabel":"object"},"description":"Where supplier catalogues disagree with the `manufacturer` you passed for this part number. Empty when there is nothing to note.","isRequired":true,"uniqueKey":"notes","typeLabel":"object[]"},"part":{"type":"object","properties":{"mpn":{"type":"string","description":"The part number you sent, normalized in format only: an all-lowercase part number is uppercased, and a `manufacturer` value repeated inside it is removed.","isRequired":true,"uniqueKey":"part.mpn","typeLabel":"string"},"manufacturer":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"part.manufacturer.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"part.manufacturer.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"part.manufacturer","typeLabel":"string | null"},"category":{"oneOf":[{"type":"string","description":"The specific type of part, e.g. \"DC-DC Buck Converter\". A BOM line gives the broad class instead, e.g. \"Semiconductors\".","isRequired":true,"uniqueKey":"part.category.oneOf.0","typeLabel":"string"},{"type":"null","description":"The specific type of part, e.g. \"DC-DC Buck Converter\". A BOM line gives the broad class instead, e.g. \"Semiconductors\".","isRequired":true,"uniqueKey":"part.category.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"part.category","typeLabel":"string | null"},"lifecycle":{"oneOf":[{"type":"string","description":"Where the part is in its life. Null when no source states one.","enum":["Active","Mature","NRND","EOL","Obsolete"],"isRequired":true,"uniqueKey":"part.lifecycle.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where the part is in its life. Null when no source states one.","isRequired":true,"uniqueKey":"part.lifecycle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"part.lifecycle","typeLabel":"enum\u003cstring> | null"},"manufacturing_country":{"oneOf":[{"type":"string","description":"Where the part is made, not where the company is headquartered. One country. When `manufacturer` is given, where that manufacturer makes the part, if known. Null when it could not be established.","isRequired":true,"uniqueKey":"part.manufacturing_country.oneOf.0","typeLabel":"string"},{"type":"null","description":"Where the part is made, not where the company is headquartered. One country. When `manufacturer` is given, where that manufacturer makes the part, if known. Null when it could not be established.","isRequired":true,"uniqueKey":"part.manufacturing_country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"part.manufacturing_country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"part.manufacturing_country_code","typeLabel":"string | null"}},"required":["mpn","manufacturer","category","lifecycle","manufacturing_country","manufacturing_country_code"],"isRequired":true,"uniqueKey":"part","typeLabel":"object"},"risk":{"type":"object","properties":{"composite":{"type":"object","properties":{"value":{"type":"number","isRequired":true,"uniqueKey":"risk.composite.value","typeLabel":"number"},"scale":{"type":"number","description":"The maximum, e.g. 100 for a 0-100 score.","isRequired":true,"uniqueKey":"risk.composite.scale","typeLabel":"number"},"direction":{"type":"string","enum":["higher_is_worse","higher_is_better"],"isRequired":true,"uniqueKey":"risk.composite.direction","typeLabel":"enum\u003cstring>"},"interpretation":{"type":"string","description":"One line of plain language: what this number means.","isRequired":true,"uniqueKey":"risk.composite.interpretation","typeLabel":"string"}},"required":["value","scale","direction","interpretation"],"description":"Combined from the four drivers below.","isRequired":true,"uniqueKey":"risk.composite","typeLabel":"object"},"tier":{"type":"string","enum":["low","medium","high","critical"],"description":"The band `composite` falls in.","isRequired":true,"uniqueKey":"risk.tier","typeLabel":"enum\u003cstring>"},"drivers":{"type":"object","properties":{"geography":{"type":"object","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":"risk.drivers.geography.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":"risk.drivers.geography.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"risk.drivers.geography.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"risk.drivers.geography.interpretation","typeLabel":"string"}},"required":["tier","interpretation"],"description":"Risk carried by the country the part is made in. `tier` is null when the origin could not be established; treat that as missing information, not as a level of risk.","isRequired":true,"uniqueKey":"risk.drivers.geography","typeLabel":"object"},"lead_time_volatility":{"type":"object","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":"risk.drivers.lead_time_volatility.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":"risk.drivers.lead_time_volatility.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"risk.drivers.lead_time_volatility.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"risk.drivers.lead_time_volatility.interpretation","typeLabel":"string"}},"required":["tier","interpretation"],"description":"How unstable the lead times suppliers are quoting now are. `tier` is null when no supplier quotes one.","isRequired":true,"uniqueKey":"risk.drivers.lead_time_volatility","typeLabel":"object"},"disruption_exposure":{"type":"object","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":"risk.drivers.disruption_exposure.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":"risk.drivers.disruption_exposure.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"risk.drivers.disruption_exposure.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"risk.drivers.disruption_exposure.interpretation","typeLabel":"string"}},"required":["tier","interpretation"],"description":"Exposure to current disruption events affecting this part; the events are in `disruption_events`.","isRequired":true,"uniqueKey":"risk.drivers.disruption_exposure","typeLabel":"object"},"replacement_difficulty":{"type":"object","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":"risk.drivers.replacement_difficulty.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":"risk.drivers.replacement_difficulty.tier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"risk.drivers.replacement_difficulty.tier","typeLabel":"enum\u003cstring> | null"},"interpretation":{"type":"string","description":"One line of plain language about this driver for this part.","isRequired":true,"uniqueKey":"risk.drivers.replacement_difficulty.interpretation","typeLabel":"string"}},"required":["tier","interpretation"],"description":"How hard this part would be to substitute.","isRequired":true,"uniqueKey":"risk.drivers.replacement_difficulty","typeLabel":"object"}},"required":["geography","lead_time_volatility","disruption_exposure","replacement_difficulty"],"description":"What drives the score, each as a band and a sentence.","isRequired":true,"uniqueKey":"risk.drivers","typeLabel":"object"},"why_at_risk":{"type":"string","description":"The facts behind this part's risk, in plain sentences: where it is made, stock, quoted lead times, listed disruptions and alternates. Every figure in it is one this response carries.","isRequired":true,"uniqueKey":"risk.why_at_risk","typeLabel":"string"},"drivers_detail":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","isRequired":true,"uniqueKey":"risk.drivers_detail.items.[INDEX].title","typeLabel":"string"},"description":{"type":"string","isRequired":true,"uniqueKey":"risk.drivers_detail.items.[INDEX].description","typeLabel":"string"}},"required":["title","description"],"uniqueKey":"risk.drivers_detail.items.[INDEX]","typeLabel":"object"},"description":"One item per factor this response has figures for (lead time, alternates, disruptions): a title and a sentence stating those figures. Empty when none applies.","isRequired":true,"uniqueKey":"risk.drivers_detail","typeLabel":"object[]"}},"required":["composite","tier","drivers","why_at_risk","drivers_detail"],"description":"This part's risk on its own. A line in `GET /v1/bom/{id}` is scored within its BOM, with different drivers, so the same part can score differently on the two endpoints.","isRequired":true,"uniqueKey":"risk","typeLabel":"object"},"supply":{"type":"object","properties":{"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"supply.stock.reason","typeLabel":"string"}},"required":["value","unit"],"description":"Units held across the distributors we can see.","isRequired":true,"uniqueKey":"supply.stock","typeLabel":"object"},"lead_time_median":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.lead_time_median.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.lead_time_median.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.lead_time_median.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.lead_time_median.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"supply.lead_time_median.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"supply.lead_time_median","typeLabel":"object"},"lead_time_min":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.lead_time_min.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.lead_time_min.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.lead_time_min.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.lead_time_min.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"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":"supply.lead_time_min","typeLabel":"object"},"lead_time_max":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.lead_time_max.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.lead_time_max.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.lead_time_max.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.lead_time_max.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"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":"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":"supply.distributor_count","typeLabel":"integer"},"distributors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"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":"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":"supply.distributors.items.[INDEX].country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"supply.distributors.items.[INDEX].country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].country_code","typeLabel":"string | null"},"regions":{"type":"array","items":{"type":"string","enum":["Africa","Americas","Asia","Europe","Oceania"],"uniqueKey":"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":"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":"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":"supply.distributors.items.[INDEX].subregion.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].subregion","typeLabel":"enum\u003cstring> | null"},"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"supply.distributors.items.[INDEX].stock.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"supply.distributors.items.[INDEX].stock","typeLabel":"object"}},"required":["name","country","country_code","regions","subregion","stock"],"uniqueKey":"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":"supply.distributors","typeLabel":"object[]"},"nearby":{"oneOf":[{"type":"object","description":"Where to buy near the buyer, when the `country` parameter was sent. Null otherwise. The risk score does not depend on it.","required":["country","country_code","region","summary","distributors"],"properties":{"country":{"type":"string","description":"The buyer country sent in `country`, as a name.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.country","typeLabel":"string"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in common use for it.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.country_code","typeLabel":"string"},"region":{"oneOf":[{"type":"string","description":"The region that country belongs to. Null when it has none. These are the UN geographic regions, not the region values of `GET /v1/events`; to find events affecting the buyer's country, filter events by that country's ISO 3166-1 alpha-2 code.","enum":["Africa","Americas","Asia","Europe","Oceania"],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.region.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"The region that country belongs to. Null when it has none. These are the UN geographic regions, not the region values of `GET /v1/events`; to find events affecting the buyer's country, filter events by that country's ISO 3166-1 alpha-2 code.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.region.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.region","typeLabel":"enum\u003cstring> | null"},"summary":{"type":"string","description":"One sentence on stock near the buyer, for relaying as-is.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.summary","typeLabel":"string"},"distributors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.distributors.items.[INDEX].country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.distributors.items.[INDEX].country_code.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].country_code","typeLabel":"string | null"},"regions":{"type":"array","items":{"type":"string","enum":["Africa","Americas","Asia","Europe","Oceania"],"uniqueKey":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.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":"supply.nearby.oneOf.0.distributors.items.[INDEX].subregion.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].subregion","typeLabel":"enum\u003cstring> | null"},"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].stock","typeLabel":"object"},"proximity":{"type":"string","enum":["same_country","same_region"],"description":"`same_country`: in the buyer's country. `same_region`: elsewhere in its region.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX].proximity","typeLabel":"enum\u003cstring>"}},"required":["name","country","country_code","regions","subregion","stock","proximity"],"uniqueKey":"supply.nearby.oneOf.0.distributors.items.[INDEX]","typeLabel":"object"},"description":"Distributors holding stock in the buyer's country first, then elsewhere in its region, largest first within each. Empty when none do.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.0.distributors","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"supply.nearby.oneOf.0","typeLabel":"object"},{"type":"null","description":"Where to buy near the buyer, when the `country` parameter was sent. Null otherwise. The risk score does not depend on it.","isRequired":true,"uniqueKey":"supply.nearby.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"supply.nearby","typeLabel":"object | null"}},"required":["stock","lead_time_median","lead_time_min","lead_time_max","distributor_count","distributors","nearby"],"isRequired":true,"uniqueKey":"supply","typeLabel":"object"},"datasheet":{"type":"object","properties":{"url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"datasheet.url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","isRequired":true,"uniqueKey":"datasheet.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"datasheet.url","typeLabel":"string\u003curi> | null"},"source":{"oneOf":[{"type":"string","description":"`distributor` when the link came from a distributor listing, `other` otherwise. The document may be hosted by a distributor rather than the manufacturer.","enum":["distributor","other"],"isRequired":true,"uniqueKey":"datasheet.source.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"`distributor` when the link came from a distributor listing, `other` otherwise. The document may be hosted by a distributor rather than the manufacturer.","isRequired":true,"uniqueKey":"datasheet.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"datasheet.source","typeLabel":"enum\u003cstring> | null"}},"required":["url","source"],"isRequired":true,"uniqueKey":"datasheet","typeLabel":"object"},"disruption_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 part is made in or sold from is well under its usual level. `sea_route`: the same for a sea passage this part's trade uses.","isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"id":{"oneOf":[{"type":"integer","description":"The event id for `news`; null otherwise.","minimum":0,"isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].id.oneOf.0","typeLabel":"integer"},{"type":"null","description":"The event id for `news`; null otherwise.","isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].id","typeLabel":"integer | null"},"title":{"type":"string","isRequired":true,"uniqueKey":"disruption_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":"disruption_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":"disruption_events.items.[INDEX].root_cause.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].root_cause","typeLabel":"enum\u003cstring> | null"},"country":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].country.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].country.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_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 part. Null for `port_activity` and `sea_route`, whose `title` states the slowdown.","enum":["low","medium","high","critical"],"isRequired":true,"uniqueKey":"disruption_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 part. Null for `port_activity` and `sea_route`, whose `title` states the slowdown.","isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].severity.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_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":"disruption_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":"disruption_events.items.[INDEX].published_date.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_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":"disruption_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":"disruption_events.items.[INDEX].url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"disruption_events.items.[INDEX].url","typeLabel":"string\u003curi> | null"}},"required":["kind","id","title","root_cause","country","severity","published_date","url"],"uniqueKey":"disruption_events.items.[INDEX]","typeLabel":"object"},"description":"The reported events and current shipping conditions that most affect this part's `disruption_exposure`, strongest first: ordered by effect on this part's score, not by `severity`. Empty when none does.","isRequired":true,"uniqueKey":"disruption_events","typeLabel":"object[]"},"alternates":{"type":"array","items":{"type":"object","properties":{"mpn":{"type":"string","description":"The alternate's manufacturer part number.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].mpn","typeLabel":"string"},"manufacturer":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"alternates.items.[INDEX].manufacturer.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"alternates.items.[INDEX].manufacturer.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].manufacturer","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","description":"A one-line description of the part. Null when none is available.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","description":"A one-line description of the part. Null when none is available.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].description","typeLabel":"string | null"},"lifecycle":{"oneOf":[{"type":"string","description":"Where the part is in its life. Null when no source states one.","enum":["Active","Mature","NRND","EOL","Obsolete"],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].lifecycle.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Where the part is in its life. Null when no source states one.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].lifecycle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].lifecycle","typeLabel":"enum\u003cstring> | null"},"match":{"oneOf":[{"type":"string","description":"How a supplier catalogue classifies this part against the one you asked about: `direct`, `parametric_equivalent`, `similar` or `upgrade`. Null when the catalogue gives no classification. Confirm fit and specifications against both datasheets before substituting.","enum":["direct","parametric_equivalent","similar","upgrade"],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].match.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"How a supplier catalogue classifies this part against the one you asked about: `direct`, `parametric_equivalent`, `similar` or `upgrade`. Null when the catalogue gives no classification. Confirm fit and specifications against both datasheets before substituting.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].match.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].match","typeLabel":"enum\u003cstring> | null"},"supply":{"type":"object","properties":{"stock":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.stock.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.stock.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.stock.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.stock.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"alternates.items.[INDEX].supply.stock.reason","typeLabel":"string"}},"required":["value","unit"],"description":"Units held across the distributors we can see.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.stock","typeLabel":"object"},"distributor_count":{"oneOf":[{"type":"integer","description":"Distributors holding stock. Null when supply could not be read; `stock` says why.","minimum":0,"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.distributor_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Distributors holding stock. Null when supply could not be read; `stock` says why.","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.distributor_count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.distributor_count","typeLabel":"integer | null"},"lead_time_median":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.lead_time_median.value.oneOf.0","typeLabel":"number"},{"type":"null","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.lead_time_median.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.lead_time_median.value","typeLabel":"number | null"},"unit":{"type":"string","isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.lead_time_median.unit","typeLabel":"string"},"reason":{"description":"Present only when value is null.","type":"string","uniqueKey":"alternates.items.[INDEX].supply.lead_time_median.reason","typeLabel":"string"}},"required":["value","unit"],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply.lead_time_median","typeLabel":"object"}},"required":["stock","distributor_count","lead_time_median"],"isRequired":true,"uniqueKey":"alternates.items.[INDEX].supply","typeLabel":"object"}},"required":["mpn","manufacturer","description","lifecycle","match","supply"],"uniqueKey":"alternates.items.[INDEX]","typeLabel":"object"},"description":"Parts that could replace this one, up to five: the same list as `GET /v1/alternates`. Never this part itself or the same part in another package or ordering variant. Not ranked. Empty when none was found.","isRequired":true,"uniqueKey":"alternates","typeLabel":"object[]"},"recommended_actions":{"type":"array","items":{"type":"string","uniqueKey":"recommended_actions.items.[INDEX]","typeLabel":"string"},"description":"What a procurement team should do next.","isRequired":true,"uniqueKey":"recommended_actions","typeLabel":"string[]"}},"required":["as_of","summary","notice","notes","part","risk","supply","datasheet","disruption_events","alternates","recommended_actions"],"uniqueKey":"","typeLabel":"object"},"example":{"as_of":"2026-10-01T12:19:19.099Z","summary":"STM32F103RBT6 carries a supply-chain risk score of 33 out of 100 (medium). Flagged: manufacturing geography (medium), lead-time volatility (critical). 348,529 units are held across 28 distributors.","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.","notes":[],"part":{"mpn":"STM32F103RBT6","manufacturer":"STMicroelectronics","category":"ARM Cortex-M3 MCU","lifecycle":"Active","manufacturing_country":"Malaysia","manufacturing_country_code":"MY"},"risk":{"composite":{"value":33,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, lead-time volatility, live disruption exposure and how hard this part is to replace."},"tier":"medium","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of Malaysia."},"lead_time_volatility":{"tier":"critical","interpretation":"Critical. Lead times for this part are highly unstable."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 5 events and shipping conditions are listed in `disruption_events`."},"replacement_difficulty":{"tier":"low","interpretation":"Low. Easy to source from several places."}},"why_at_risk":"Made in Malaysia. 348,529 units in stock across 28 distributors. The middle half of quoted lead times runs 52 to 364 days. 5 disruptions and shipping conditions are listed for this part. No alternates are listed.","drivers_detail":[{"title":"Lead time","description":"The middle half of quoted lead times runs 52 to 364 days, with a median of 220 days."},{"title":"Disruptions","description":"5 are listed for this part, including: Red Sea / Suez ship transits 54% below the usual level for this time of year; Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures."}]},"supply":{"stock":{"value":348529,"unit":"units"},"lead_time_median":{"value":220,"unit":"days"},"lead_time_min":{"value":52,"unit":"days"},"lead_time_max":{"value":364,"unit":"days"},"distributor_count":28,"distributors":[{"name":"Win Source","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":91714,"unit":"units"}},{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":63767,"unit":"units"}}],"nearby":null},"datasheet":{"url":"https://apexcomponent.com/wp-content/uploads/2026/05/STM32F103RBT6-STMicroelectronics-Datasheet.pdf","source":"other"},"disruption_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":1178,"title":"Chinese rare-earth firms withhold U.S. shipments amid Beijing pressure","root_cause":"geopolitical_action","country":"China","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.usnews.com/news/top-news/articles/2026-09-04/china-rare-earth-firms-halt-some-us-shipments-over-geopolitical-worries-sources-say"},{"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"}],"alternates":[],"recommended_actions":["For factory orders, allow for the 220-day median quoted lead time.","Monitor Red Sea / Suez ship transits 54% below the usual level for this time of year."]},"examples":{"Example":{"title":"Example","value":{"as_of":"2026-10-01T12:19:19.099Z","summary":"STM32F103RBT6 carries a supply-chain risk score of 33 out of 100 (medium). Flagged: manufacturing geography (medium), lead-time volatility (critical). 348,529 units are held across 28 distributors.","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.","notes":[],"part":{"mpn":"STM32F103RBT6","manufacturer":"STMicroelectronics","category":"ARM Cortex-M3 MCU","lifecycle":"Active","manufacturing_country":"Malaysia","manufacturing_country_code":"MY"},"risk":{"composite":{"value":33,"scale":100,"direction":"higher_is_worse","interpretation":"Medium. Combined from manufacturing geography, lead-time volatility, live disruption exposure and how hard this part is to replace."},"tier":"medium","drivers":{"geography":{"tier":"medium","interpretation":"Medium. Reflects the risk profile of Malaysia."},"lead_time_volatility":{"tier":"critical","interpretation":"Critical. Lead times for this part are highly unstable."},"disruption_exposure":{"tier":"low","interpretation":"Low. Little exposure to active disruptions. 5 events and shipping conditions are listed in `disruption_events`."},"replacement_difficulty":{"tier":"low","interpretation":"Low. Easy to source from several places."}},"why_at_risk":"Made in Malaysia. 348,529 units in stock across 28 distributors. The middle half of quoted lead times runs 52 to 364 days. 5 disruptions and shipping conditions are listed for this part. No alternates are listed.","drivers_detail":[{"title":"Lead time","description":"The middle half of quoted lead times runs 52 to 364 days, with a median of 220 days."},{"title":"Disruptions","description":"5 are listed for this part, including: Red Sea / Suez ship transits 54% below the usual level for this time of year; Wacker Chemie may close Tennessee polysilicon plant amid U.S. trade measures."}]},"supply":{"stock":{"value":348529,"unit":"units"},"lead_time_median":{"value":220,"unit":"days"},"lead_time_min":{"value":52,"unit":"days"},"lead_time_max":{"value":364,"unit":"days"},"distributor_count":28,"distributors":[{"name":"Win Source","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":91714,"unit":"units"}},{"name":"Farnell","country":"United Kingdom","country_code":"GB","regions":["Europe"],"subregion":"Northern Europe","stock":{"value":63767,"unit":"units"}}],"nearby":null},"datasheet":{"url":"https://apexcomponent.com/wp-content/uploads/2026/05/STM32F103RBT6-STMicroelectronics-Datasheet.pdf","source":"other"},"disruption_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":1178,"title":"Chinese rare-earth firms withhold U.S. shipments amid Beijing pressure","root_cause":"geopolitical_action","country":"China","severity":"high","published_date":"2026-09-04T00:00:00.000Z","url":"https://www.usnews.com/news/top-news/articles/2026-09-04/china-rare-earth-firms-halt-some-us-shipments-over-geopolitical-worries-sources-say"},{"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"}],"alternates":[],"recommended_actions":["For factory orders, allow for the 220-day median quoted lead time.","Monitor Red Sea / Suez ship transits 54% below the usual level for this time of year."]}}},"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"},"0ab00fa0-f756-41cc-bc47-8a54cb199725":{"description":"The `mpn` parameter is missing, or `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"},"be90d0d4-df0c-4685-b831-51989f56b62b":{"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"},"dd3056c9-1dc0-4b2d-90cf-3acb945aabf3":{"description":"This request was not run and nothing was charged. The error code names the case. `credits_exhausted`: your plan's credits for this month are used up; upgrade the plan in the PartFinder console. `payment_method_required`: your organization is on pay as you go with no payment method; add one in the console, or choose a plan. `payment_failed`: pay as you go is paused because the last payment failed; update the payment method in the console. `usage_limit_reached`: your organization, on pay as you go, has reached its limit for unpaid usage; calls resume once the current payment goes through. With a key made with `POST /v1/keys`, the `summary` tells your customer to contact your organization, and the answer carries no `billing_url`. The `summary` can be relayed as is; retry once the case is resolved.","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"},"example":{"error":"credits_exhausted","summary":"Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.","reason":"This request needs 20 credits and 0 are left.","billing_url":"https://console.partfinder.dev/settings/billing"},"examples":{"Example":{"title":"Example","value":{"error":"credits_exhausted","summary":"Your organization's credits for this month are used up, so this request was not run. Upgrade your plan in the PartFinder console at https://console.partfinder.dev/settings/billing, then try again.","reason":"This request needs 20 credits and 0 are left.","billing_url":"https://console.partfinder.dev/settings/billing"}}},"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"},"daca493f-af6b-4942-a982-8f3c9d664c37":{"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"},"f182f129-b52b-4e42-8fd4-80b2bf3d0e0a":{"description":"No distributor catalogue lists that part number exactly. Usually a typo or a partial part number. No report is produced — we do not generate one for a part we cannot find. When listed part numbers begin with what you sent, `did_you_mean` carries up to five of them.","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"},"afd9c9a3-e6b3-4b36-ad90-302814ca8ecc":{"description":"The input does not identify one specific part — a question, a category, or a generic specification. When it described a class of parts, `did_you_mean` carries real part numbers to retry with.","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"},"19bbf014-b5b3-4f99-9e99-6761e0e516dd":{"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"},"66c1e775-a9da-43f3-b71a-64b4c27a2bed":{"description":"The report could not be produced right now. Retry shortly.","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"},"a9a0c576-6aa2-407c-8011-155016b8b23d":{"description":"We could not confirm the part number is real, because the supplier data needed to check it is momentarily unavailable. No report is produced for a part that cannot be verified. Temporary — retry shortly.","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"}},"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":"Research a part - PartFinder API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-01T08:04:57.791Z","originalFileLocation":"api-reference/parts/research-a-part.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=\"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions. A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.\">\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=\"Research a part - PartFinder API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions. A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.\">\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/parts/research-a-part\">\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=Parts\u0026amp;title=Research+a+part\u0026amp;description=Supply-chain+intelligence+for+one+industrial+part%3A+a+composite+risk+score+with+its+four+drivers%2C+current+distributor+availability%2C+a+datasheet+link%2C+the+live+di\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=ac5d5e0fc35c27bdd7f2234f50d913ec4128d26f53d497fb028f7f509b8c307d\">\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=\"Research a part - PartFinder API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions. A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://partfinder.mintlify.app/_mintlify/api/og/v2?division=Parts\u0026amp;title=Research+a+part\u0026amp;description=Supply-chain+intelligence+for+one+industrial+part%3A+a+composite+risk+score+with+its+four+drivers%2C+current+distributor+availability%2C+a+datasheet+link%2C+the+live+di\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=ac5d5e0fc35c27bdd7f2234f50d913ec4128d26f53d497fb028f7f509b8c307d\">\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/parts/research-a-part\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/parts/research-a-part.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/parts/research-a-part#webpage\",\"url\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part\",\"name\":\"Research a part\",\"description\":\"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions. A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.\",\"dateModified\":\"2026-11-01T08:04:57.791Z\",\"isPartOf\":{\"@id\":\"https://docs.partfinder.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part#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\":\"Research a part\",\"item\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part#apireference\",\"headline\":\"Research a part\",\"name\":\"Research a part\",\"description\":\"Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions. A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry Cache-Control: no-store.\",\"url\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part\",\"mainEntityOfPage\":{\"@id\":\"https://docs.partfinder.dev/api-reference/parts/research-a-part#webpage\"},\"dateModified\":\"2026-11-01T08:04:57.791Z\",\"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","description":"Returns the organization the key belongs to. Use it to confirm an integration is wired correctly before calling an endpoint that does real work.","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","description":"Parts that could replace one part, up to five, each with its current stock, distributor count, lead time and lifecycle. Never the part itself or the same part in another package.\n\nThe list is kept server-side for 48 hours, so repeat calls return quickly; stock is read fresh on every call. Responses carry `Cache-Control: no-store`. Confirm fit and specifications against the datasheets before substituting.","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","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","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":"Research a part - 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"]}