> ## Documentation Index
> Fetch the complete documentation index at: https://docs.partfinder.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent 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.

# Send a message in a request for quote

> Answer the supplier, or send a reminder, in the same email thread as the request for quote. The text is sent as written, under the requester's name.



## OpenAPI

````yaml https://api.partfinder.dev/v1/openapi.json post /v1/rfq/{id}/messages
openapi: 3.1.0
info:
  title: PartFinder API
  version: 1.0.0
  license:
    name: Proprietary
    url: https://partfinder.dev/terms
  description: >-
    Supply-chain intelligence for industrial parts: risk scoring, supply
    availability, datasheets, disruption events, BOM analysis, alternates, part
    search and part comparison. Responses are structured for an AI agent to read
    — every score carries its scale, direction and an interpretation, every
    measure carries its unit, every successful response carries `as_of`, and
    every error carries an `error` code, usually with a `summary` you can relay,
    except a 413 (request body too large), which has no body.
servers:
  - url: https://api.partfinder.dev
security:
  - bearerAuth: []
tags:
  - name: Authentication
    description: Confirm an API key works.
  - name: Parts
    description: 'Research one part: risk, supply, datasheet, events, alternates.'
  - name: BOMs
    description: Analyze a bill of materials line by line.
  - name: Events
    description: >-
      Supply-chain disruptions: events, the countries they hit, and port and
      sea-route activity.
  - name: Search
    description: >-
      Find parts for a part number or a description, with specifications and
      stock.
  - name: Compare
    description: >-
      Put parts side by side on their specifications, with a verdict per
      specification.
  - name: RFQs
    description: Send requests for quote to suppliers and read their replies.
  - name: Keys
    description: Give each of your own customers a key that sees only its own data.
  - name: Webhooks
    description: >-
      Be told when a supplier replies, or a search or a comparison ends, instead
      of polling.
paths:
  /v1/rfq/{id}/messages:
    post:
      tags:
        - RFQs
      summary: Send a message in a request for quote
      description: >-
        Answer the supplier, or send a reminder, in the same email thread as the
        request for quote. The text is sent as written, under the requester's
        name.
      operationId: sendRfqMessage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: The request for quote id.
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: 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 message, and send the same value again only
            when retrying that same message after a timeout. A retry with the
            same key on the same request for quote sends nothing and returns the
            request for quote with the message the first call sent. A key is
            recognised only from the same API key that sent it. Optional.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RfqMessageRequest'
            example:
              body: >-
                Hi Tom,


                Thank you. Can you ship to Singapore, and does the price hold
                for 1,000 units?


                Best regards,

                Jane Smith

                Acme Corp
      responses:
        '201':
          description: Sent. The body is the request for quote with the new message last.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RfqResponse'
              example:
                as_of: '2026-10-07T09:20:44.903Z'
                summary: >-
                  Sent to sales@supplier.example in the same thread. 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: replied
                  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: '2026-10-06T14:27:40.551Z'
                  follow_up_count: 1
                  replies_received: 1
                  quotes_received: 1
                  messages:
                    - id: 9e4d2c7a-1b3f-4a5e-8d6c-0f1e2d3c4b5a
                      direction: outbound
                      subject: >-
                        Request for quote: TPS54331DR, 500 units, needed by 30
                        November 2026
                      body: >-
                        Hi Tom,


                        My 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?


                        Thank you,


                        Jane Smith

                        Acme Corp
                      sent_at: '2026-10-05T16:02:11.307Z'
                      attachments: []
                      reply_kind: null
                      quote: null
                    - id: 2c8b6e1f-7d3a-4e9b-a1c5-6f0d2e4b8a73
                      direction: inbound
                      subject: >-
                        Re: Request for quote: TPS54331DR, 500 units, needed by
                        30 November 2026
                      body: >-
                        Hi Jane,


                        We can offer TPS54331DR at $1.85 each for 500 units, 6
                        weeks lead time, MOQ 250. Quote valid for 30 days.


                        Best regards,

                        Tom Lee

                        Example Supplier
                      sent_at: '2026-10-06T14:27:40.551Z'
                      attachments: []
                      reply_kind: quote
                      quote:
                        unit_price:
                          value: 1.85
                          words: $1.85 each
                          reason: null
                        currency:
                          value: null
                          words: $1.85 each
                          reason: The reply gives "$" without saying which dollar.
                        quantity:
                          value: 500
                          words: 500 units
                          reason: null
                        lead_time_days:
                          value: 42
                          words: 6 weeks
                          reason: null
                        moq:
                          value: 250
                          words: MOQ 250
                          reason: null
                    - id: 7a1e9d3c-5b2f-4c8a-9e6d-3f1b0c2a4d58
                      direction: outbound
                      subject: >-
                        Re: Request for quote: TPS54331DR, 500 units, needed by
                        30 November 2026
                      body: >-
                        Hi Tom,


                        Thank you. Can you ship to Singapore, and does the price
                        hold for 1,000 units?


                        Best regards,

                        Jane Smith

                        Acme Corp
                      sent_at: '2026-10-07T09:20:44.512Z'
                      attachments: []
                      reply_kind: null
                      quote: null
          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
        '400':
          description: 'The body is not valid: `body` is missing or empty.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          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
        '401':
          description: Missing, unknown, revoked or expired key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          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:
                $ref: '#/components/schemas/Error'
              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
          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
        '403':
          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:
                $ref: '#/components/schemas/Error'
          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
        '404':
          description: >-
            No request for quote with that id belongs to your organization (with
            a key made with `POST /v1/keys`, to that customer).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          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
        '409':
          description: >-
            The supplier's address bounced, or the supplier asked not to receive
            requests for quote.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          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
        '422':
          description: >-
            The message was not sent: `summary` says what to change before
            sending again.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          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
        '429':
          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:
                $ref: '#/components/schemas/Error'
        '502':
          description: The message could not be sent. Nothing was sent; retry shortly.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          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
components:
  schemas:
    RfqMessageRequest:
      type: object
      properties:
        body:
          type: string
          minLength: 1
          description: >-
            The text to send, as written. Sent under the requester's name in the
            same email thread.
        subject:
          description: >-
            Omit it to reply under the thread's subject ("Re: …"), which keeps
            the conversation together.
          anyOf:
            - type: string
              minLength: 1
            - type: 'null'
      required:
        - body
    RfqResponse:
      type: object
      properties:
        as_of:
          type: string
          format: date-time
          description: ISO 8601. How current the data in this response is.
        summary:
          type: string
          description: Plain language an agent can relay without re-deriving it.
        notice:
          type: string
          description: Informational-use notice. Always present.
        rfq:
          $ref: '#/components/schemas/Rfq'
      required:
        - as_of
        - summary
        - notice
        - rfq
    Error:
      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.
        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
        reason:
          description: The specific detail behind the error.
          type: 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
        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
      required:
        - error
    Rfq:
      type: object
      properties:
        id:
          type: 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.
        supplier:
          type: object
          properties:
            email:
              type: string
            name:
              anyOf:
                - type: string
                - type: 'null'
            contact_name:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - email
            - name
            - contact_name
        requester:
          type: object
          properties:
            company:
              type: string
            contact_name:
              type: string
            title:
              anyOf:
                - type: string
                - type: 'null'
          required:
            - company
            - contact_name
            - title
        parts:
          type: array
          items:
            $ref: '#/components/schemas/RfqPart'
        needed_by:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          description: The date the parts are needed by.
        notify_email:
          description: Who is emailed when the supplier replies; null when none was given.
          anyOf:
            - type: string
            - type: 'null'
        created_at:
          type: string
          format: date-time
        first_reply_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
        follow_up_count:
          type: integer
          minimum: 0
          description: Messages sent after the first.
        replies_received:
          type: integer
          minimum: 0
          description: Replies received from the supplier.
        quotes_received:
          type: integer
          minimum: 0
          description: Of those replies, the ones that give a quote.
        messages:
          type: array
          items:
            $ref: '#/components/schemas/RfqMessage'
          description: The thread, oldest first.
      required:
        - id
        - status
        - supplier
        - requester
        - parts
        - needed_by
        - notify_email
        - created_at
        - first_reply_at
        - follow_up_count
        - replies_received
        - quotes_received
        - messages
    RfqPart:
      type: object
      properties:
        mpn:
          type: string
          minLength: 1
          description: The manufacturer part number.
        manufacturer:
          description: The manufacturer, when you know it.
          anyOf:
            - type: string
            - type: 'null'
        quantity:
          type: integer
          exclusiveMinimum: 0
          description: Units you want quoted.
      required:
        - mpn
        - quantity
    RfqMessage:
      type: object
      properties:
        id:
          type: string
        direction:
          type: string
          enum:
            - outbound
            - inbound
          description: '`outbound` from the requester, `inbound` from the supplier.'
        subject:
          anyOf:
            - type: string
            - type: 'null'
        body:
          description: The text as sent, or what the supplier wrote in this reply.
          anyOf:
            - type: string
            - type: 'null'
        sent_at:
          type: string
          format: date-time
        attachments:
          type: array
          items:
            type: object
            properties:
              filename:
                type: string
              size:
                type: integer
                minimum: 0
                description: Bytes.
            required:
              - filename
              - size
          description: The names and sizes of files the message carried.
        reply_kind:
          anyOf:
            - type: string
              enum:
                - quote
                - question
                - decline
                - other
            - 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.
        quote:
          anyOf:
            - $ref: '#/components/schemas/RfqQuote'
              description: >-
                The quote stated in this reply. A field the reply does not state
                is null, with `reason`; `words` holds the supplier's own words.
            - 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.
      required:
        - id
        - direction
        - subject
        - body
        - sent_at
        - attachments
        - reply_kind
        - quote
    RfqQuote:
      type: object
      properties:
        unit_price:
          type: object
          properties:
            value:
              anyOf:
                - type: number
                  minimum: 0
                - type: 'null'
              description: Price per unit.
            words:
              description: >-
                The supplier's exact words for this field. Null when the reply
                does not state it.
              anyOf:
                - type: string
                - type: 'null'
            reason:
              description: Why `value` is null; null when it is filled.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - value
            - words
            - reason
        currency:
          type: object
          properties:
            value:
              description: ISO 4217 code.
              anyOf:
                - type: string
                - type: 'null'
            words:
              description: >-
                The supplier's exact words for this field. Null when the reply
                does not state it.
              anyOf:
                - type: string
                - type: 'null'
            reason:
              description: Why `value` is null; null when it is filled.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - value
            - words
            - reason
        quantity:
          type: object
          properties:
            value:
              anyOf:
                - type: integer
                  minimum: 0
                - type: 'null'
              description: Units the price is for.
            words:
              description: >-
                The supplier's exact words for this field. Null when the reply
                does not state it.
              anyOf:
                - type: string
                - type: 'null'
            reason:
              description: Why `value` is null; null when it is filled.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - value
            - words
            - reason
        lead_time_days:
          type: object
          properties:
            value:
              anyOf:
                - type: integer
                  minimum: 0
                - type: 'null'
              description: Lead time in days.
            words:
              description: >-
                The supplier's exact words for this field. Null when the reply
                does not state it.
              anyOf:
                - type: string
                - type: 'null'
            reason:
              description: Why `value` is null; null when it is filled.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - value
            - words
            - reason
        moq:
          type: object
          properties:
            value:
              anyOf:
                - type: integer
                  minimum: 0
                - type: 'null'
              description: Minimum order quantity.
            words:
              description: >-
                The supplier's exact words for this field. Null when the reply
                does not state it.
              anyOf:
                - type: string
                - type: 'null'
            reason:
              description: Why `value` is null; null when it is filled.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - value
            - words
            - reason
      required:
        - unit_price
        - currency
        - quantity
        - lead_time_days
        - moq
  securitySchemes:
    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 <key>`. Revocation takes
        effect within approximately one minute.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.