Email a request for quote to a supplier you name, under the requester’s name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier’s email, the requester’s name, and the requester’s company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.
{
"as_of": "2026-10-05T16:02:11.482Z",
"summary": "Request for quote sent to sales@supplier.example. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.",
"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.",
"rfq": {
"id": "5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e",
"status": "sent",
"supplier": {
"email": "sales@supplier.example",
"name": "Example Supplier",
"contact_name": "Tom Lee"
},
"requester": {
"company": "Acme Corp",
"contact_name": "Jane Smith",
"title": "Procurement Manager"
},
"parts": [
{
"mpn": "TPS54331DR",
"manufacturer": "Texas Instruments",
"quantity": 500
}
],
"needed_by": "2026-11-30",
"notify_email": null,
"created_at": "2026-10-05T16:02:09.913Z",
"first_reply_at": null,
"follow_up_count": 0,
"replies_received": 0,
"quotes_received": 0,
"messages": [
{
"id": "9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a",
"direction": "outbound",
"subject": "Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp",
"sent_at": "2026-10-05T16:02:11.307Z",
"attachments": [],
"reply_kind": null,
"quote": null
}
]
}
}
{
"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 1 credit 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.
Set by your client code, not by a person or a model: generate a new value (a UUID) for each request for quote, and send the same value again only when retrying that same request after a timeout. A retry with the same key returns the request the first call created and sends no second email. A key is recognised only from the same API key that sent it. Optional.
Who is emailed when the supplier replies. Required with a key you created for one of your customers (POST /v1/keys): only this address is told, never your organization. Optional with your organization's own keys.
Response
Sent. The body is the request for quote with its first message.
{
"as_of": "2026-10-05T16:02:11.482Z",
"summary": "Request for quote sent to sales@supplier.example. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.",
"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.",
"rfq": {
"id": "5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e",
"status": "sent",
"supplier": {
"email": "sales@supplier.example",
"name": "Example Supplier",
"contact_name": "Tom Lee"
},
"requester": {
"company": "Acme Corp",
"contact_name": "Jane Smith",
"title": "Procurement Manager"
},
"parts": [
{
"mpn": "TPS54331DR",
"manufacturer": "Texas Instruments",
"quantity": 500
}
],
"needed_by": "2026-11-30",
"notify_email": null,
"created_at": "2026-10-05T16:02:09.913Z",
"first_reply_at": null,
"follow_up_count": 0,
"replies_received": 0,
"quotes_received": 0,
"messages": [
{
"id": "9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a",
"direction": "outbound",
"subject": "Request for quote: TPS54331DR, 500 units, needed by 30 November 2026",
"body": "Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp",
"sent_at": "2026-10-05T16:02:11.307Z",
"attachments": [],
"reply_kind": null,
"quote": null
}
]
}
}
{
"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 1 credit 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/rfqs/send-a-request-for-quote","slug":"/api-reference/rfqs/send-a-request-for-quote","pageMetadata":{"title":"Send a request for quote","description":"Email a request for quote to a supplier you name, under the requester's name. This sends a real email to `supplier.email`: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier's email, the requester's name, and the requester's company when it is neither your organization nor, with a key made with `POST /v1/keys`, that customer. Everything else is optional: leave out what they did not give. Send `message` only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on `GET /v1/rfq/{id}`. A supplier who asked not to receive requests for quote is refused with `409`.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/rfq","href":"/api-reference/rfqs/send-a-request-for-quote","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Email a request for quote to a supplier you name, under the requester’s name. This sends a real email to \", _jsx(_components.code, {\n children: \"supplier.email\"\n }), \": every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier’s email, the requester’s name, and the requester’s company when it is neither your organization nor, with a key made with \", _jsx(_components.code, {\n children: \"POST /v1/keys\"\n }), \", that customer. Everything else is optional: leave out what they did not give. Send \", _jsx(_components.code, {\n children: \"message\"\n }), \" only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on \", _jsx(_components.code, {\n children: \"GET /v1/rfq/{id}\"\n }), \". A supplier who asked not to receive requests for quote is refused with \", _jsx(_components.code, {\n children: \"409\"\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":"Send a request for quote","description":"Email a request for quote to a supplier you name, under the requester's name. This sends a real email to `supplier.email`: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier's email, the requester's name, and the requester's company when it is neither your organization nor, with a key made with `POST /v1/keys`, that customer. Everything else is optional: leave out what they did not give. Send `message` only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on `GET /v1/rfq/{id}`. A supplier who asked not to receive requests for quote is refused with `409`.","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/rfq","href":"/api-reference/rfqs/send-a-request-for-quote","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"sendRfq","tags":["RFQs"],"parameters":["4772fe97-1eb9-402e-aebc-08fec94abf17"],"summary":"Send a request for quote","description":"Email a request for quote to a supplier you name, under the requester's name. This sends a real email to `supplier.email`: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier's email, the requester's name, and the requester's company when it is neither your organization nor, with a key made with `POST /v1/keys`, that customer. Everything else is optional: leave out what they did not give. Send `message` only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on `GET /v1/rfq/{id}`. A supplier who asked not to receive requests for quote is refused with `409`.","requestBody":"d904e51b-3853-4266-967a-644d97562082","responses":{"201":"af914a61-cba8-4fa9-8911-0a7c230c2c8c","400":"ab35e925-a1e7-4bea-9ac8-96246752fc49","401":"b5f5b4ba-a41f-49cd-a1a0-0cd683157591","402":"f11f70f9-cbb5-4711-9026-2f45bfdabb6d","403":"e3275ba7-afa3-436d-8101-db823c4f299c","409":"f8f9b18b-25cc-4643-8f9f-d0750f722ddb","422":"db899a7f-45db-49a7-b45c-b1fe81021093","429":"a53e9783-b2e1-452a-b8e8-8282a7376327","502":"806d84aa-653f-43ea-9160-1ad81875b98a"},"method":"post","type":"path","servers":["0fd180cc-370f-4a5d-b567-97592ff7113e"],"security":["ff9e9b82-f90e-4a4b-b1b1-0a91012e4b98"],"path":"/v1/rfq","baseUrlOptions":["https://api.partfinder.dev"],"title":"Send a request for quote","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"4772fe97-1eb9-402e-aebc-08fec94abf17":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","isRequired":false,"description":"Set by your client code, not by a person or a model: generate a new value (a UUID) for each request for quote, and send the same value again only when retrying that same request after a timeout. A retry with the same key returns the request the first call created and sends no second email. A key is recognised only from the same API key that sent it. Optional.","uniqueKey":"","typeLabel":"string"},"example":"3d9a7f2e-6c41-4b8e-a5d0-7e2f19c4b863","description":"Set by your client code, not by a person or a model: generate a new value (a UUID) for each request for quote, and send the same value again only when retrying that same request after a timeout. A retry with the same key returns the request the first call created and sends no second email. A key is recognised only from the same API key that sent it. Optional."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"supplier":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"Where the request is sent: a real email goes to this address. Use only an address your user gave; never guess one.","isRequired":true,"uniqueKey":"supplier.email","typeLabel":"string\u003cemail>"},"name":{"oneOf":[{"type":"string","description":"The supplier company.","minLength":1,"uniqueKey":"supplier.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier company.","uniqueKey":"supplier.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"supplier.name","typeLabel":"string | null"},"contact_name":{"oneOf":[{"type":"string","description":"The person you are writing to at the supplier, when you know them.","minLength":1,"uniqueKey":"supplier.contact_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The person you are writing to at the supplier, when you know them.","uniqueKey":"supplier.contact_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"supplier.contact_name","typeLabel":"string | null"}},"required":["email"],"isRequired":true,"uniqueKey":"supplier","typeLabel":"object"},"requester":{"type":"object","properties":{"contact_name":{"type":"string","minLength":1,"description":"The person asking. The email is sent under \"\u003ccontact_name>, \u003ccompany>\".","isRequired":true,"uniqueKey":"requester.contact_name","typeLabel":"string"},"company":{"oneOf":[{"type":"string","description":"The company asking for the quote. When omitted: with a key made with `POST /v1/keys`, that customer's company; otherwise your organization's name.","minLength":1,"uniqueKey":"requester.company.oneOf.0","typeLabel":"string"},{"type":"null","description":"The company asking for the quote. When omitted: with a key made with `POST /v1/keys`, that customer's company; otherwise your organization's name.","uniqueKey":"requester.company.oneOf.1","typeLabel":"null"}],"uniqueKey":"requester.company","typeLabel":"string | null"},"title":{"oneOf":[{"type":"string","description":"Their role, for example \"Procurement Manager\", used when they introduce themselves.","minLength":1,"uniqueKey":"requester.title.oneOf.0","typeLabel":"string"},{"type":"null","description":"Their role, for example \"Procurement Manager\", used when they introduce themselves.","uniqueKey":"requester.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"requester.title","typeLabel":"string | null"}},"required":["contact_name"],"description":"Who the request is from.","isRequired":true,"uniqueKey":"requester","typeLabel":"object"},"parts":{"minItems":1,"type":"array","items":{"type":"object","properties":{"mpn":{"type":"string","minLength":1,"description":"The manufacturer part number.","isRequired":true,"uniqueKey":"parts.items.[INDEX].mpn","typeLabel":"string"},"quantity":{"type":"integer","exclusiveMinimum":0,"description":"Units you want quoted.","isRequired":true,"uniqueKey":"parts.items.[INDEX].quantity","typeLabel":"integer"},"manufacturer":{"oneOf":[{"type":"string","description":"The manufacturer, when you know it.","uniqueKey":"parts.items.[INDEX].manufacturer.oneOf.0","typeLabel":"string"},{"type":"null","description":"The manufacturer, when you know it.","uniqueKey":"parts.items.[INDEX].manufacturer.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.items.[INDEX].manufacturer","typeLabel":"string | null"}},"required":["mpn","quantity"],"uniqueKey":"parts.items.[INDEX]","typeLabel":"object"},"description":"The parts and quantities to quote.","isRequired":true,"uniqueKey":"parts","typeLabel":"object[]"},"needed_by":{"oneOf":[{"type":"string","description":"The date you need the parts delivered by, YYYY-MM-DD. Stated in the email so the supplier can say whether they can meet it.","format":"date","uniqueKey":"needed_by.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"The date you need the parts delivered by, YYYY-MM-DD. Stated in the email so the supplier can say whether they can meet it.","uniqueKey":"needed_by.oneOf.1","typeLabel":"null"}],"uniqueKey":"needed_by","typeLabel":"string\u003cdate> | null"},"message":{"oneOf":[{"type":"object","description":"Email text your user wrote, sent as written. Omit it unless your user gave the text; an email is then written for you.","required":["body"],"properties":{"body":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"message.oneOf.0.body","typeLabel":"string"},"subject":{"oneOf":[{"type":"string","description":"Without a subject, one is written for you.","minLength":1,"uniqueKey":"message.oneOf.0.subject.oneOf.0","typeLabel":"string"},{"type":"null","description":"Without a subject, one is written for you.","uniqueKey":"message.oneOf.0.subject.oneOf.1","typeLabel":"null"}],"uniqueKey":"message.oneOf.0.subject","typeLabel":"string | null"}},"uniqueKey":"message.oneOf.0","typeLabel":"object"},{"type":"null","description":"Email text your user wrote, sent as written. Omit it unless your user gave the text; an email is then written for you.","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"object | null"},"notify_email":{"oneOf":[{"type":"string","description":"Who is emailed when the supplier replies. Required with a key you created for one of your customers (`POST /v1/keys`): only this address is told, never your organization. Optional with your organization's own keys.","format":"email","uniqueKey":"notify_email.oneOf.0","typeLabel":"string\u003cemail>"},{"type":"null","description":"Who is emailed when the supplier replies. Required with a key you created for one of your customers (`POST /v1/keys`): only this address is told, never your organization. Optional with your organization's own keys.","uniqueKey":"notify_email.oneOf.1","typeLabel":"null"}],"uniqueKey":"notify_email","typeLabel":"string\u003cemail> | null"}},"required":["supplier","requester","parts"],"uniqueKey":"","typeLabel":"object"},"example":{"supplier":{"email":"sales@supplier.example","name":"Example Supplier","contact_name":"Tom Lee"},"requester":{"company":"Acme Corp","contact_name":"Jane Smith","title":"Procurement Manager"},"parts":[{"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":500}],"needed_by":"2026-11-30"},"examples":{"Example":{"title":"Example","value":{"supplier":{"email":"sales@supplier.example","name":"Example Supplier","contact_name":"Tom Lee"},"requester":{"company":"Acme Corp","contact_name":"Jane Smith","title":"Procurement Manager"},"parts":[{"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":500}],"needed_by":"2026-11-30"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"af914a61-cba8-4fa9-8911-0a7c230c2c8c":{"description":"Sent. The body is the request for quote with its first message.","headers":{"Location":{"description":"The absolute URL of the request for quote, `GET /v1/rfq/{id}`.","schema":{"type":"string"}},"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":{"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"},"rfq":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"rfq.id","typeLabel":"string"},"status":{"type":"string","enum":["sent","replied","bounced"],"description":"`sent` until the supplier answers, `replied` once they have, `bounced` when the address could not receive mail.","isRequired":true,"uniqueKey":"rfq.status","typeLabel":"enum\u003cstring>"},"supplier":{"type":"object","properties":{"email":{"type":"string","isRequired":true,"uniqueKey":"rfq.supplier.email","typeLabel":"string"},"name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"rfq.supplier.name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"rfq.supplier.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.supplier.name","typeLabel":"string | null"},"contact_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"rfq.supplier.contact_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"rfq.supplier.contact_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.supplier.contact_name","typeLabel":"string | null"}},"required":["email","name","contact_name"],"isRequired":true,"uniqueKey":"rfq.supplier","typeLabel":"object"},"requester":{"type":"object","properties":{"company":{"type":"string","isRequired":true,"uniqueKey":"rfq.requester.company","typeLabel":"string"},"contact_name":{"type":"string","isRequired":true,"uniqueKey":"rfq.requester.contact_name","typeLabel":"string"},"title":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"rfq.requester.title.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"rfq.requester.title.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.requester.title","typeLabel":"string | null"}},"required":["company","contact_name","title"],"isRequired":true,"uniqueKey":"rfq.requester","typeLabel":"object"},"parts":{"type":"array","items":{"type":"object","properties":{"mpn":{"type":"string","minLength":1,"description":"The manufacturer part number.","isRequired":true,"uniqueKey":"rfq.parts.items.[INDEX].mpn","typeLabel":"string"},"quantity":{"type":"integer","exclusiveMinimum":0,"description":"Units you want quoted.","isRequired":true,"uniqueKey":"rfq.parts.items.[INDEX].quantity","typeLabel":"integer"},"manufacturer":{"oneOf":[{"type":"string","description":"The manufacturer, when you know it.","uniqueKey":"rfq.parts.items.[INDEX].manufacturer.oneOf.0","typeLabel":"string"},{"type":"null","description":"The manufacturer, when you know it.","uniqueKey":"rfq.parts.items.[INDEX].manufacturer.oneOf.1","typeLabel":"null"}],"uniqueKey":"rfq.parts.items.[INDEX].manufacturer","typeLabel":"string | null"}},"required":["mpn","quantity"],"uniqueKey":"rfq.parts.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"rfq.parts","typeLabel":"object[]"},"needed_by":{"oneOf":[{"type":"string","description":"The date the parts are needed by.","format":"date","isRequired":true,"uniqueKey":"rfq.needed_by.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","description":"The date the parts are needed by.","isRequired":true,"uniqueKey":"rfq.needed_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.needed_by","typeLabel":"string\u003cdate> | null"},"notify_email":{"oneOf":[{"type":"string","description":"Who is emailed when the supplier replies; null when none was given.","isRequired":true,"uniqueKey":"rfq.notify_email.oneOf.0","typeLabel":"string"},{"type":"null","description":"Who is emailed when the supplier replies; null when none was given.","isRequired":true,"uniqueKey":"rfq.notify_email.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.notify_email","typeLabel":"string | null"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"rfq.created_at","typeLabel":"string\u003cdate-time>"},"first_reply_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"rfq.first_reply_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","isRequired":true,"uniqueKey":"rfq.first_reply_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.first_reply_at","typeLabel":"string\u003cdate-time> | null"},"follow_up_count":{"type":"integer","minimum":0,"description":"Messages sent after the first.","isRequired":true,"uniqueKey":"rfq.follow_up_count","typeLabel":"integer"},"replies_received":{"type":"integer","minimum":0,"description":"Replies received from the supplier.","isRequired":true,"uniqueKey":"rfq.replies_received","typeLabel":"integer"},"quotes_received":{"type":"integer","minimum":0,"description":"Of those replies, the ones that give a quote.","isRequired":true,"uniqueKey":"rfq.quotes_received","typeLabel":"integer"},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].id","typeLabel":"string"},"direction":{"type":"string","enum":["outbound","inbound"],"description":"`outbound` from the requester, `inbound` from the supplier.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].direction","typeLabel":"enum\u003cstring>"},"subject":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].subject.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].subject.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].subject","typeLabel":"string | null"},"body":{"oneOf":[{"type":"string","description":"The text as sent, or what the supplier wrote in this reply.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].body.oneOf.0","typeLabel":"string"},{"type":"null","description":"The text as sent, or what the supplier wrote in this reply.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].body.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].body","typeLabel":"string | null"},"sent_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].sent_at","typeLabel":"string\u003cdate-time>"},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].attachments.items.[INDEX].filename","typeLabel":"string"},"size":{"type":"integer","minimum":0,"description":"Bytes.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].attachments.items.[INDEX].size","typeLabel":"integer"}},"required":["filename","size"],"uniqueKey":"rfq.messages.items.[INDEX].attachments.items.[INDEX]","typeLabel":"object"},"description":"The names and sizes of files the message carried.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].attachments","typeLabel":"object[]"},"reply_kind":{"oneOf":[{"type":"string","description":"On a supplier reply: `quote` when it gives a price or lead time, `question` when the supplier asks something before quoting, `decline` when they will not quote, `other` for anything else. Null on messages sent by the requester, or while it is not yet available.","enum":["quote","question","decline","other"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].reply_kind.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"On a supplier reply: `quote` when it gives a price or lead time, `question` when the supplier asks something before quoting, `decline` when they will not quote, `other` for anything else. Null on messages sent by the requester, or while it is not yet available.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].reply_kind.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].reply_kind","typeLabel":"enum\u003cstring> | null"},"quote":{"oneOf":[{"type":"object","description":"On a supplier reply: the quote it states. Null on messages sent by the requester, or while it is not yet available.","required":["unit_price","currency","quantity","lead_time_days","moq"],"properties":{"unit_price":{"type":"object","properties":{"value":{"oneOf":[{"type":"number","description":"Price per unit.","minimum":0,"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.value.oneOf.0","typeLabel":"number"},{"type":"null","description":"Price per unit.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.value","typeLabel":"number | null"},"words":{"oneOf":[{"type":"string","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.words.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.words.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.words","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price.reason","typeLabel":"string | null"}},"required":["value","words","reason"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.unit_price","typeLabel":"object"},"currency":{"type":"object","properties":{"value":{"oneOf":[{"type":"string","description":"ISO 4217 code.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.value.oneOf.0","typeLabel":"string"},{"type":"null","description":"ISO 4217 code.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.value","typeLabel":"string | null"},"words":{"oneOf":[{"type":"string","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.words.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.words.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.words","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency.reason","typeLabel":"string | null"}},"required":["value","words","reason"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.currency","typeLabel":"object"},"quantity":{"type":"object","properties":{"value":{"oneOf":[{"type":"integer","description":"Units the price is for.","minimum":0,"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.value.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Units the price is for.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.value","typeLabel":"integer | null"},"words":{"oneOf":[{"type":"string","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.words.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.words.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.words","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity.reason","typeLabel":"string | null"}},"required":["value","words","reason"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.quantity","typeLabel":"object"},"lead_time_days":{"type":"object","properties":{"value":{"oneOf":[{"type":"integer","description":"Lead time in days.","minimum":0,"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.value.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Lead time in days.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.value","typeLabel":"integer | null"},"words":{"oneOf":[{"type":"string","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.words.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.words.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.words","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days.reason","typeLabel":"string | null"}},"required":["value","words","reason"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.lead_time_days","typeLabel":"object"},"moq":{"type":"object","properties":{"value":{"oneOf":[{"type":"integer","description":"Minimum order quantity.","minimum":0,"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.value.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Minimum order quantity.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.value","typeLabel":"integer | null"},"words":{"oneOf":[{"type":"string","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.words.oneOf.0","typeLabel":"string"},{"type":"null","description":"The supplier's exact words for this field. Null when the reply does not state it.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.words.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.words","typeLabel":"string | null"},"reason":{"oneOf":[{"type":"string","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why `value` is null; null when it is filled.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq.reason","typeLabel":"string | null"}},"required":["value","words","reason"],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0.moq","typeLabel":"object"}},"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.0","typeLabel":"object"},{"type":"null","description":"On a supplier reply: the quote it states. Null on messages sent by the requester, or while it is not yet available.","isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rfq.messages.items.[INDEX].quote","typeLabel":"object | null"}},"required":["id","direction","subject","body","sent_at","attachments","reply_kind","quote"],"uniqueKey":"rfq.messages.items.[INDEX]","typeLabel":"object"},"description":"The thread, oldest first.","isRequired":true,"uniqueKey":"rfq.messages","typeLabel":"object[]"}},"required":["id","status","supplier","requester","parts","needed_by","notify_email","created_at","first_reply_at","follow_up_count","replies_received","quotes_received","messages"],"isRequired":true,"uniqueKey":"rfq","typeLabel":"object"}},"required":["as_of","summary","notice","rfq"],"uniqueKey":"","typeLabel":"object"},"example":{"as_of":"2026-10-05T16:02:11.482Z","summary":"Request for quote sent to sales@supplier.example. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.","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.","rfq":{"id":"5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e","status":"sent","supplier":{"email":"sales@supplier.example","name":"Example Supplier","contact_name":"Tom Lee"},"requester":{"company":"Acme Corp","contact_name":"Jane Smith","title":"Procurement Manager"},"parts":[{"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":500}],"needed_by":"2026-11-30","notify_email":null,"created_at":"2026-10-05T16:02:09.913Z","first_reply_at":null,"follow_up_count":0,"replies_received":0,"quotes_received":0,"messages":[{"id":"9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a","direction":"outbound","subject":"Request for quote: TPS54331DR, 500 units, needed by 30 November 2026","body":"Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp","sent_at":"2026-10-05T16:02:11.307Z","attachments":[],"reply_kind":null,"quote":null}]}},"examples":{"Example":{"title":"Example","value":{"as_of":"2026-10-05T16:02:11.482Z","summary":"Request for quote sent to sales@supplier.example. Replies appear on GET /v1/rfq/5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e.","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.","rfq":{"id":"5b0f3c1e-8a2d-4f6b-9c7e-1d2a3b4c5d6e","status":"sent","supplier":{"email":"sales@supplier.example","name":"Example Supplier","contact_name":"Tom Lee"},"requester":{"company":"Acme Corp","contact_name":"Jane Smith","title":"Procurement Manager"},"parts":[{"mpn":"TPS54331DR","manufacturer":"Texas Instruments","quantity":500}],"needed_by":"2026-11-30","notify_email":null,"created_at":"2026-10-05T16:02:09.913Z","first_reply_at":null,"follow_up_count":0,"replies_received":0,"quotes_received":0,"messages":[{"id":"9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a","direction":"outbound","subject":"Request for quote: TPS54331DR, 500 units, needed by 30 November 2026","body":"Hi Tom,\n\nMy name is Jane Smith, Procurement Manager at Acme Corp. We're looking for 500 units of the Texas Instruments TPS54331DR and need them delivered by 30 November 2026. Could you send your best unit price, availability and lead time, along with any minimum order quantity and how long the quote is valid?\n\nThank you,\n\nJane Smith\nAcme Corp","sent_at":"2026-10-05T16:02:11.307Z","attachments":[],"reply_kind":null,"quote":null}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"ab35e925-a1e7-4bea-9ac8-96246752fc49":{"description":"The body is not valid, `supplier.email` is not an address mail can be sent to, or, with a key made with `POST /v1/keys`, `notify_email` is missing.","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"},"b5f5b4ba-a41f-49cd-a1a0-0cd683157591":{"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"},"f11f70f9-cbb5-4711-9026-2f45bfdabb6d":{"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 1 credit 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 1 credit 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"},"e3275ba7-afa3-436d-8101-db823c4f299c":{"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"},"f8f9b18b-25cc-4643-8f9f-d0750f722ddb":{"description":"The supplier asked not to receive requests for quote from you, or from anyone through PartFinder.","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"},"db899a7f-45db-49a7-b45c-b1fe81021093":{"description":"Your `message` was not sent: `summary` says what to change before sending again.","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"},"a53e9783-b2e1-452a-b8e8-8282a7376327":{"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"},"806d84aa-653f-43ea-9160-1ad81875b98a":{"description":"The email text could not be written, or the email could not be sent. Nothing was sent; 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":"Send a request for quote - PartFinder API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-01T08:04:58.033Z","originalFileLocation":"api-reference/rfqs/send-a-request-for-quote.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=\"Email a request for quote to a supplier you name, under the requester\u0026#x27;s name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier\u0026#x27;s email, the requester\u0026#x27;s name, and the requester\u0026#x27;s company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.\">\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=\"Send a request for quote - PartFinder API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Email a request for quote to a supplier you name, under the requester\u0026#x27;s name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier\u0026#x27;s email, the requester\u0026#x27;s name, and the requester\u0026#x27;s company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.\">\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/rfqs/send-a-request-for-quote\">\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=RFQs\u0026amp;title=Send+a+request+for+quote\u0026amp;description=Email+a+request+for+quote+to+a+supplier+you+name%2C+under+the+requester%27s+name.+This+sends+a+real+email+to+%60supplier.email%60%3A+every+address+and+name+in+the+request\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=0e62cce65f47d7a33017118baccbf4ca7acfd1022370bb07578f57bb58002f19\">\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=\"Send a request for quote - PartFinder API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Email a request for quote to a supplier you name, under the requester\u0026#x27;s name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier\u0026#x27;s email, the requester\u0026#x27;s name, and the requester\u0026#x27;s company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://partfinder.mintlify.app/_mintlify/api/og/v2?division=RFQs\u0026amp;title=Send+a+request+for+quote\u0026amp;description=Email+a+request+for+quote+to+a+supplier+you+name%2C+under+the+requester%27s+name.+This+sends+a+real+email+to+%60supplier.email%60%3A+every+address+and+name+in+the+request\u0026amp;theme=2915c8e57862f94fe512378b\u0026amp;signature=0e62cce65f47d7a33017118baccbf4ca7acfd1022370bb07578f57bb58002f19\">\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/rfqs/send-a-request-for-quote\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/rfqs/send-a-request-for-quote.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/rfqs/send-a-request-for-quote#webpage\",\"url\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote\",\"name\":\"Send a request for quote\",\"description\":\"Email a request for quote to a supplier you name, under the requester's name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier's email, the requester's name, and the requester's company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.\",\"dateModified\":\"2026-11-01T08:04:58.033Z\",\"isPartOf\":{\"@id\":\"https://docs.partfinder.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote#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\":\"RFQs\",\"item\":\"https://docs.partfinder.dev/api-reference/rfqs/list-your-requests-for-quote\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Send a request for quote\",\"item\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote#apireference\",\"headline\":\"Send a request for quote\",\"name\":\"Send a request for quote\",\"description\":\"Email a request for quote to a supplier you name, under the requester's name. This sends a real email to supplier.email: every address and name in the request must come from your user, never be guessed or suggested; ask your user for any that are missing. Only these are required: the supplier's email, the requester's name, and the requester's company when it is neither your organization nor, with a key made with POST /v1/keys, that customer. Everything else is optional: leave out what they did not give. Send message only with text your user wrote; omit it and an email is written for you. The supplier replies to the email as usual, and their replies appear on GET /v1/rfq/{id}. A supplier who asked not to receive requests for quote is refused with 409.\",\"url\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote\",\"mainEntityOfPage\":{\"@id\":\"https://docs.partfinder.dev/api-reference/rfqs/send-a-request-for-quote#webpage\"},\"dateModified\":\"2026-11-01T08:04:58.033Z\",\"publisher\":{\"@id\":\"https://docs.partfinder.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.partfinder.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"PartFinder API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"PartFinder API","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":""}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"PartFinder REST API: reference overview and endpoints","sidebarTitle":"Overview","href":"/api-reference/overview"}]},{"group":"Endpoints","pages":[{"group":"Authentication","pages":[{"title":"Verify an API key","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/ping","href":"/api-reference/authentication/verify-an-api-key"}]},{"group":"Parts","pages":[{"title":"Research a part","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/parts","href":"/api-reference/parts/research-a-part"},{"title":"Find alternate parts","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/alternates","href":"/api-reference/parts/find-alternate-parts"}]},{"group":"BOMs","pages":[{"title":"List your BOMs","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json get /v1/bom","href":"/api-reference/boms/list-your-boms"},{"title":"Analyze a BOM","deprecated":null,"version":null,"openapi":"https://api.partfinder.dev/v1/openapi.json post /v1/bom","href":"/api-reference/boms/analyze-a-bom"},{"title":"Upload a BOM file","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","description":"Every request for quote your organization has sent (with a key made with `POST /v1/keys`, only that customer's), newest first, with its status, one page at a time. When `next_cursor` is not null, call again with `cursor` set to it for the next page. Read one with `GET /v1/rfq/{id}` for its messages.","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","description":"A request for quote and its email thread, oldest first: what was sent and every reply from the supplier. `status` is `replied` once the supplier has answered. Poll this to see new replies.","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":"Send a request for quote - 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"]}