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

# Research a part

> Supply-chain intelligence for one industrial part: a composite risk score with its four drivers, current distributor availability, a datasheet link, the live disruption events that touch it, alternate parts, and recommended actions.

A cold part takes tens of seconds because it gathers live data. The result is kept server-side for 48 hours, so repeat calls return quickly; responses themselves are not HTTP-cacheable and carry `Cache-Control: no-store`.



## OpenAPI

````yaml https://api.partfinder.dev/v1/openapi.json get /v1/parts
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/parts:
    get:
      tags:
        - Parts
      summary: Research a part
      description: >-
        Supply-chain intelligence for one industrial part: a composite risk
        score with its four drivers, current distributor availability, a
        datasheet link, the live disruption events that touch it, alternate
        parts, and recommended actions.


        A cold part takes tens of seconds because it gathers live data. The
        result is kept server-side for 48 hours, so repeat calls return quickly;
        responses themselves are not HTTP-cacheable and carry `Cache-Control:
        no-store`.
      operationId: researchPart
      parameters:
        - name: mpn
          in: query
          required: true
          schema:
            type: string
          example: TPS54331DR
          description: The manufacturer part number.
        - name: manufacturer
          in: query
          required: false
          schema:
            type: string
          example: Texas Instruments
          description: >-
            Only needed for a part number several manufacturers make, such as
            NE555N. Omit it otherwise — a bare part number is the normal case.


            It narrows the supply figures to that manufacturer and, when known,
            the manufacturing origin to where that manufacturer makes the part,
            and with it the risk drivers that depend on where the part is made.
            A manufacturer that does not list the part returns a report with no
            supply data.
        - name: country
          in: query
          required: false
          schema:
            type: string
            pattern: ^[A-Za-z]{2}$
          example: SG
          description: >-
            The buyer's country, as a two-letter ISO 3166-1 code. Adds
            `supply.nearby`: the distributors holding stock in that country,
            then elsewhere in its region. The risk score and every other field
            are the same with or without it.
      responses:
        '200':
          description: The part report.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartReport'
              example:
                as_of: '2026-10-01T12:19:19.099Z'
                summary: >-
                  STM32F103RBT6 carries a supply-chain risk score of 33 out of
                  100 (medium). Flagged: manufacturing geography (medium),
                  lead-time volatility (critical). 348,529 units are held across
                  28 distributors.
                notice: >-
                  Informational only. Risk scores, stock levels, lead times and
                  alternate-part suggestions may be incomplete, delayed or
                  inaccurate. Independently verify before making procurement,
                  engineering, compliance, safety or sourcing decisions.
                notes: []
                part:
                  mpn: STM32F103RBT6
                  manufacturer: STMicroelectronics
                  category: ARM Cortex-M3 MCU
                  lifecycle: Active
                  manufacturing_country: Malaysia
                  manufacturing_country_code: MY
                risk:
                  composite:
                    value: 33
                    scale: 100
                    direction: higher_is_worse
                    interpretation: >-
                      Medium. Combined from manufacturing geography, lead-time
                      volatility, live disruption exposure and how hard this
                      part is to replace.
                  tier: medium
                  drivers:
                    geography:
                      tier: medium
                      interpretation: Medium. Reflects the risk profile of Malaysia.
                    lead_time_volatility:
                      tier: critical
                      interpretation: Critical. Lead times for this part are highly unstable.
                    disruption_exposure:
                      tier: low
                      interpretation: >-
                        Low. Little exposure to active disruptions. 5 events and
                        shipping conditions are listed in `disruption_events`.
                    replacement_difficulty:
                      tier: low
                      interpretation: Low. Easy to source from several places.
                  why_at_risk: >-
                    Made in Malaysia. 348,529 units in stock across 28
                    distributors. The middle half of quoted lead times runs 52
                    to 364 days. 5 disruptions and shipping conditions are
                    listed for this part. No alternates are listed.
                  drivers_detail:
                    - title: Lead time
                      description: >-
                        The middle half of quoted lead times runs 52 to 364
                        days, with a median of 220 days.
                    - title: Disruptions
                      description: >-
                        5 are listed for this part, including: Red Sea / Suez
                        ship transits 54% below the usual level for this time of
                        year; Wacker Chemie may close Tennessee polysilicon
                        plant amid U.S. trade measures.
                supply:
                  stock:
                    value: 348529
                    unit: units
                  lead_time_median:
                    value: 220
                    unit: days
                  lead_time_min:
                    value: 52
                    unit: days
                  lead_time_max:
                    value: 364
                    unit: days
                  distributor_count: 28
                  distributors:
                    - name: Win Source
                      country: United Kingdom
                      country_code: GB
                      regions:
                        - Europe
                      subregion: Northern Europe
                      stock:
                        value: 91714
                        unit: units
                    - name: Farnell
                      country: United Kingdom
                      country_code: GB
                      regions:
                        - Europe
                      subregion: Northern Europe
                      stock:
                        value: 63767
                        unit: units
                  nearby: null
                datasheet:
                  url: >-
                    https://apexcomponent.com/wp-content/uploads/2026/05/STM32F103RBT6-STMicroelectronics-Datasheet.pdf
                  source: other
                disruption_events:
                  - kind: sea_route
                    id: null
                    title: >-
                      Red Sea / Suez: ship transits 54% below the usual level
                      for this time of year
                    root_cause: null
                    country: null
                    severity: null
                    published_date: '2026-09-20T00:00:00.000Z'
                    url: null
                  - kind: news
                    id: 1179
                    title: >-
                      Wacker Chemie may close Tennessee polysilicon plant amid
                      U.S. trade measures
                    root_cause: geopolitical_action
                    country: United States
                    severity: high
                    published_date: '2026-09-04T00:00:00.000Z'
                    url: >-
                      https://www.reuters.com/business/trumps-bid-shield-chip-supply-chain-could-backfire-tennessee-2026-09-04/
                  - kind: news
                    id: 1178
                    title: >-
                      Chinese rare-earth firms withhold U.S. shipments amid
                      Beijing pressure
                    root_cause: geopolitical_action
                    country: China
                    severity: high
                    published_date: '2026-09-04T00:00:00.000Z'
                    url: >-
                      https://www.usnews.com/news/top-news/articles/2026-09-04/china-rare-earth-firms-halt-some-us-shipments-over-geopolitical-worries-sources-say
                  - kind: news
                    id: 1189
                    title: >-
                      China imposes provisional duties on Japanese semiconductor
                      chemical
                    root_cause: regulatory_change
                    country: China
                    severity: medium
                    published_date: '2026-09-09T00:00:00.000Z'
                    url: https://hk.epochtimes.com/news/2026-09-09/80403878
                  - kind: news
                    id: 1166
                    title: >-
                      China imposes helium export controls affecting global
                      high‑tech supply
                    root_cause: regulatory_change
                    country: China
                    severity: high
                    published_date: '2026-07-11T00:00:00.000Z'
                    url: >-
                      https://www.caixinglobal.com/2026-07-11/china-bans-helium-exports-as-global-supply-crunch-hits-chipmaking-gas-102462943.html
                alternates: []
                recommended_actions:
                  - >-
                    For factory orders, allow for the 220-day median quoted lead
                    time.
                  - >-
                    Monitor Red Sea / Suez ship transits 54% below the usual
                    level for this time of year.
          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 `mpn` parameter is missing, or `country` is not a country code.
          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 20 credits 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 distributor catalogue lists that part number exactly. Usually a
            typo or a partial part number. No report is produced — we do not
            generate one for a part we cannot find. When listed part numbers
            begin with what you sent, `did_you_mean` carries up to five of them.
          content:
            application/json:
              schema:
                $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 input does not identify one specific part — a question, a
            category, or a generic specification. When it described a class of
            parts, `did_you_mean` carries real part numbers to retry with.
          content:
            application/json:
              schema:
                $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 report could not be produced right now. 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
        '503':
          description: >-
            We could not confirm the part number is real, because the supplier
            data needed to check it is momentarily unavailable. No report is
            produced for a part that cannot be verified. Temporary — retry
            shortly.
          content:
            application/json:
              schema:
                $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:
    PartReport:
      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.
        notes:
          type: array
          items:
            $ref: '#/components/schemas/DataNote'
          description: >-
            Where supplier catalogues disagree with the `manufacturer` you
            passed for this part number. Empty when there is nothing to note.
        part:
          type: object
          properties:
            mpn:
              type: string
              description: >-
                The part number you sent, normalized in format only: an
                all-lowercase part number is uppercased, and a `manufacturer`
                value repeated inside it is removed.
            manufacturer:
              anyOf:
                - type: string
                - type: 'null'
            category:
              description: >-
                The specific type of part, e.g. "DC-DC Buck Converter". A BOM
                line gives the broad class instead, e.g. "Semiconductors".
              anyOf:
                - type: string
                - type: 'null'
            lifecycle:
              anyOf:
                - type: string
                  enum:
                    - Active
                    - Mature
                    - NRND
                    - EOL
                    - Obsolete
                - type: 'null'
              description: Where the part is in its life. Null when no source states one.
            manufacturing_country:
              description: >-
                Where the part is made, not where the company is headquartered.
                One country. When `manufacturer` is given, where that
                manufacturer makes the part, if known. Null when it could not be
                established.
              anyOf:
                - type: string
                - type: 'null'
            manufacturing_country_code:
              description: >-
                ISO 3166-1 alpha-2 code of `manufacturing_country`. Kosovo is
                `XK`, the code in common use for it.
              anyOf:
                - type: string
                - type: 'null'
          required:
            - mpn
            - manufacturer
            - category
            - lifecycle
            - manufacturing_country
            - manufacturing_country_code
        risk:
          type: object
          properties:
            composite:
              $ref: '#/components/schemas/Score'
              description: Combined from the four drivers below.
            tier:
              type: string
              enum:
                - low
                - medium
                - high
                - critical
              description: The band `composite` falls in.
            drivers:
              type: object
              properties:
                geography:
                  $ref: '#/components/schemas/DriverBand'
                  description: >-
                    Risk carried by the country the part is made in. `tier` is
                    null when the origin could not be established; treat that as
                    missing information, not as a level of risk.
                lead_time_volatility:
                  $ref: '#/components/schemas/DriverBand'
                  description: >-
                    How unstable the lead times suppliers are quoting now are.
                    `tier` is null when no supplier quotes one.
                disruption_exposure:
                  $ref: '#/components/schemas/DriverBand'
                  description: >-
                    Exposure to current disruption events affecting this part;
                    the events are in `disruption_events`.
                replacement_difficulty:
                  $ref: '#/components/schemas/DriverBand'
                  description: How hard this part would be to substitute.
              required:
                - geography
                - lead_time_volatility
                - disruption_exposure
                - replacement_difficulty
              description: What drives the score, each as a band and a sentence.
            why_at_risk:
              type: string
              description: >-
                The facts behind this part's risk, in plain sentences: where it
                is made, stock, quoted lead times, listed disruptions and
                alternates. Every figure in it is one this response carries.
            drivers_detail:
              type: array
              items:
                type: object
                properties:
                  title:
                    type: string
                  description:
                    type: string
                required:
                  - title
                  - description
              description: >-
                One item per factor this response has figures for (lead time,
                alternates, disruptions): a title and a sentence stating those
                figures. Empty when none applies.
          required:
            - composite
            - tier
            - drivers
            - why_at_risk
            - drivers_detail
          description: >-
            This part's risk on its own. A line in `GET /v1/bom/{id}` is scored
            within its BOM, with different drivers, so the same part can score
            differently on the two endpoints.
        supply:
          type: object
          properties:
            stock:
              $ref: '#/components/schemas/Measure'
              description: Units held across the distributors we can see.
            lead_time_median:
              $ref: '#/components/schemas/Measure'
            lead_time_min:
              $ref: '#/components/schemas/Measure'
              description: >-
                The 25th percentile of quoted lead times: the short end of the
                middle half of quotes. Null when no distributor quotes a lead
                time, or when the middle half of quotes is a single figure;
                `reason` says which.
            lead_time_max:
              $ref: '#/components/schemas/Measure'
              description: >-
                The 75th percentile of quoted lead times: the long end of the
                middle half of quotes. Null when no distributor quotes a lead
                time, or when the middle half of quotes is a single figure;
                `reason` says which.
            distributor_count:
              type: integer
              minimum: 0
              description: >-
                Distributors holding stock of this part. `distributors` shows
                only some of them.
            distributors:
              type: array
              items:
                $ref: '#/components/schemas/Distributor'
              description: >-
                The distributors holding the most stock, largest first. Not
                every distributor is listed: `distributor_count` is the total.
                Rows can share the same inventory, so do not add them up;
                `stock` is the total.
            nearby:
              anyOf:
                - $ref: '#/components/schemas/NearbySupply'
                - type: 'null'
              description: >-
                Where to buy near the buyer, when the `country` parameter was
                sent. Null otherwise. The risk score does not depend on it.
          required:
            - stock
            - lead_time_median
            - lead_time_min
            - lead_time_max
            - distributor_count
            - distributors
            - nearby
        datasheet:
          type: object
          properties:
            url:
              anyOf:
                - type: string
                  format: uri
                - type: 'null'
            source:
              anyOf:
                - type: string
                  enum:
                    - distributor
                    - other
                - type: 'null'
              description: >-
                `distributor` when the link came from a distributor listing,
                `other` otherwise. The document may be hosted by a distributor
                rather than the manufacturer.
          required:
            - url
            - source
        disruption_events:
          type: array
          items:
            type: object
            properties:
              kind:
                type: string
                enum:
                  - news
                  - port_activity
                  - sea_route
                description: >-
                  `news`: a reported disruption. `port_activity`: ship traffic
                  at the ports of a country this part is made in or sold from is
                  well under its usual level. `sea_route`: the same for a sea
                  passage this part's trade uses.
              id:
                anyOf:
                  - type: integer
                    minimum: 0
                  - type: 'null'
                description: The event id for `news`; null otherwise.
              title:
                type: string
              root_cause:
                anyOf:
                  - type: string
                    enum:
                      - natural_disaster
                      - geopolitical_action
                      - regulatory_change
                      - labor_disruption
                      - industrial_incident
                      - infrastructure_failure
                      - cyber_attack
                  - type: 'null'
                description: >-
                  What kind of cause lies behind a `news` event, as on `GET
                  /v1/events`. Null otherwise.
              country:
                anyOf:
                  - type: string
                  - type: 'null'
              severity:
                anyOf:
                  - type: string
                    enum:
                      - low
                      - medium
                      - high
                      - critical
                  - type: 'null'
                description: >-
                  For `news`: how serious the event is in itself, not its effect
                  on this part. Null for `port_activity` and `sea_route`, whose
                  `title` states the slowdown.
              published_date:
                anyOf:
                  - type: string
                    format: date-time
                  - type: 'null'
                description: >-
                  For `news`, when it was reported; otherwise the last day of
                  the week it covers.
              url:
                anyOf:
                  - type: string
                    format: uri
                  - type: 'null'
                description: >-
                  A source article for `news`; may be null. Always null
                  otherwise.
            required:
              - kind
              - id
              - title
              - root_cause
              - country
              - severity
              - published_date
              - url
          description: >-
            The reported events and current shipping conditions that most affect
            this part's `disruption_exposure`, strongest first: ordered by
            effect on this part's score, not by `severity`. Empty when none
            does.
        alternates:
          type: array
          items:
            $ref: '#/components/schemas/Alternate'
          description: >-
            Parts that could replace this one, up to five: the same list as `GET
            /v1/alternates`. Never this part itself or the same part in another
            package or ordering variant. Not ranked. Empty when none was found.
        recommended_actions:
          type: array
          items:
            type: string
          description: What a procurement team should do next.
      required:
        - as_of
        - summary
        - notice
        - notes
        - part
        - risk
        - supply
        - datasheet
        - disruption_events
        - alternates
        - recommended_actions
    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
    DataNote:
      type: object
      properties:
        kind:
          type: string
          enum:
            - manufacturer_not_listed
            - part_not_listed
            - part_number_identified
            - part_number_needed
          description: >-
            `manufacturer_not_listed`: the manufacturer given is not among the
            makers distributors list for this part number. `part_not_listed`: no
            distributor lists this part number. `part_number_identified`: the
            line was analyzed under a different part number than the one
            submitted. `part_number_needed`: what was submitted is not a
            manufacturer part number that can be identified, so the line is not
            scored; the `summary` says where to add one (the spreadsheet cell
            for an uploaded file).
        summary:
          type: string
          description: One sentence describing what was found, to relay as written.
        suggestions:
          type: array
          items:
            type: string
          description: >-
            For `manufacturer_not_listed`, the makers distributors list for this
            part number, most listed first. For `part_not_listed`, real part
            numbers that begin with the one submitted. For
            `part_number_identified`, the part number the line was analyzed as.
            For `part_number_needed`, a part number the line may refer to, to be
            confirmed before use. May be empty.
      required:
        - kind
        - summary
        - suggestions
    Score:
      type: object
      properties:
        value:
          type: number
        scale:
          type: number
          description: The maximum, e.g. 100 for a 0-100 score.
        direction:
          type: string
          enum:
            - higher_is_worse
            - higher_is_better
        interpretation:
          type: string
          description: 'One line of plain language: what this number means.'
      required:
        - value
        - scale
        - direction
        - interpretation
    DriverBand:
      type: object
      properties:
        tier:
          anyOf:
            - type: string
              enum:
                - low
                - medium
                - high
                - critical
            - type: 'null'
          description: >-
            The band this driver falls in. Null when there is no data for it;
            `interpretation` says why.
        interpretation:
          type: string
          description: One line of plain language about this driver for this part.
      required:
        - tier
        - interpretation
    Measure:
      type: object
      properties:
        value:
          anyOf:
            - type: number
            - type: 'null'
        unit:
          type: string
        reason:
          description: Present only when value is null.
          type: string
      required:
        - value
        - unit
    Distributor:
      type: object
      properties:
        name:
          type: string
        country:
          description: The distributor's country. Null when it is not a single country.
          anyOf:
            - type: string
            - type: 'null'
        country_code:
          description: >-
            ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in
            common use for it.
          anyOf:
            - type: string
            - type: 'null'
        regions:
          type: array
          items:
            type: string
            enum:
              - Africa
              - Americas
              - Asia
              - Europe
              - Oceania
          description: >-
            The regions this listing serves: the region of `country` when a
            country is known, otherwise the regions the distributor states for
            this storefront. Not where the part is made. Empty when no region is
            stated. These are the UN geographic regions, not the region values
            of `GET /v1/events`; to find events affecting a distributor, filter
            events by its `country_code`.
        subregion:
          anyOf:
            - type: string
              enum:
                - Australia and New Zealand
                - Central Asia
                - Eastern Asia
                - Eastern Europe
                - Latin America and the Caribbean
                - Melanesia
                - Micronesia
                - Northern Africa
                - Northern America
                - Northern Europe
                - Polynesia
                - South-eastern Asia
                - Southern Asia
                - Southern Europe
                - Sub-Saharan Africa
                - Western Asia
                - Western Europe
            - type: 'null'
          description: >-
            The UN sub-region of `country` (for example Western Asia). Not where
            the part is made. Null when no country is known. These are UN
            geographic sub-regions, not the region values of `GET /v1/events`;
            to find events affecting a distributor, filter events by its
            `country_code`.
        stock:
          $ref: '#/components/schemas/Measure'
      required:
        - name
        - country
        - country_code
        - regions
        - subregion
        - stock
    NearbySupply:
      type: object
      properties:
        country:
          type: string
          description: The buyer country sent in `country`, as a name.
        country_code:
          type: string
          description: >-
            ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code in
            common use for it.
        region:
          anyOf:
            - type: string
              enum:
                - Africa
                - Americas
                - Asia
                - Europe
                - Oceania
            - type: 'null'
          description: >-
            The region that country belongs to. Null when it has none. These are
            the UN geographic regions, not the region values of `GET
            /v1/events`; to find events affecting the buyer's country, filter
            events by that country's ISO 3166-1 alpha-2 code.
        summary:
          type: string
          description: One sentence on stock near the buyer, for relaying as-is.
        distributors:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              country:
                description: >-
                  The distributor's country. Null when it is not a single
                  country.
                anyOf:
                  - type: string
                  - type: 'null'
              country_code:
                description: >-
                  ISO 3166-1 alpha-2 code of `country`. Kosovo is `XK`, the code
                  in common use for it.
                anyOf:
                  - type: string
                  - type: 'null'
              regions:
                type: array
                items:
                  type: string
                  enum:
                    - Africa
                    - Americas
                    - Asia
                    - Europe
                    - Oceania
                description: >-
                  The regions this listing serves: the region of `country` when
                  a country is known, otherwise the regions the distributor
                  states for this storefront. Not where the part is made. Empty
                  when no region is stated. These are the UN geographic regions,
                  not the region values of `GET /v1/events`; to find events
                  affecting a distributor, filter events by its `country_code`.
              subregion:
                anyOf:
                  - type: string
                    enum:
                      - Australia and New Zealand
                      - Central Asia
                      - Eastern Asia
                      - Eastern Europe
                      - Latin America and the Caribbean
                      - Melanesia
                      - Micronesia
                      - Northern Africa
                      - Northern America
                      - Northern Europe
                      - Polynesia
                      - South-eastern Asia
                      - Southern Asia
                      - Southern Europe
                      - Sub-Saharan Africa
                      - Western Asia
                      - Western Europe
                  - type: 'null'
                description: >-
                  The UN sub-region of `country` (for example Western Asia). Not
                  where the part is made. Null when no country is known. These
                  are UN geographic sub-regions, not the region values of `GET
                  /v1/events`; to find events affecting a distributor, filter
                  events by its `country_code`.
              stock:
                $ref: '#/components/schemas/Measure'
              proximity:
                type: string
                enum:
                  - same_country
                  - same_region
                description: >-
                  `same_country`: in the buyer's country. `same_region`:
                  elsewhere in its region.
            required:
              - name
              - country
              - country_code
              - regions
              - subregion
              - stock
              - proximity
          description: >-
            Distributors holding stock in the buyer's country first, then
            elsewhere in its region, largest first within each. Empty when none
            do.
      required:
        - country
        - country_code
        - region
        - summary
        - distributors
    Alternate:
      type: object
      properties:
        mpn:
          type: string
          description: The alternate's manufacturer part number.
        manufacturer:
          anyOf:
            - type: string
            - type: 'null'
        description:
          description: A one-line description of the part. Null when none is available.
          anyOf:
            - type: string
            - type: 'null'
        lifecycle:
          anyOf:
            - type: string
              enum:
                - Active
                - Mature
                - NRND
                - EOL
                - Obsolete
            - type: 'null'
          description: Where the part is in its life. Null when no source states one.
        match:
          anyOf:
            - type: string
              enum:
                - direct
                - parametric_equivalent
                - similar
                - upgrade
            - type: 'null'
          description: >-
            How a supplier catalogue classifies this part against the one you
            asked about: `direct`, `parametric_equivalent`, `similar` or
            `upgrade`. Null when the catalogue gives no classification. Confirm
            fit and specifications against both datasheets before substituting.
        supply:
          type: object
          properties:
            stock:
              $ref: '#/components/schemas/Measure'
              description: Units held across the distributors we can see.
            distributor_count:
              anyOf:
                - type: integer
                  minimum: 0
                - type: 'null'
              description: >-
                Distributors holding stock. Null when supply could not be read;
                `stock` says why.
            lead_time_median:
              $ref: '#/components/schemas/Measure'
          required:
            - stock
            - distributor_count
            - lead_time_median
      required:
        - mpn
        - manufacturer
        - description
        - lifecycle
        - match
        - supply
  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.