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

# Check a design

> An uploaded board checked the way a fab would, with no quote or order: JLCPCB's limits, each partner fab's
estimated verdict, KiCad's own design-rule check, and with boards the BOM's parts. The fab verdicts are an
estimate from published limits, not the fab's review. 120 an hour per key.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/design-checks
openapi: 3.1.0
info:
  title: ProvenMetal API
  version: 1.0.0
  description: >-
    Everything the ProvenMetal MCP does, over HTTP with an API key: upload a
    design, get a live JLCPCB quote and checkout link, follow it to delivery,
    pay with saved details, and check parts and designs. Formal quotes for any
    fab or assembler are under Orders.
servers:
  - url: https://api.provenmetal.com
security:
  - ApiKey: []
tags:
  - name: Uploads
  - name: Quotes
  - name: Saved details
  - name: Checks
  - name: Buy links
  - name: Orders
  - name: Account
paths:
  /v1/design-checks:
    post:
      tags:
        - Checks
      summary: Check a design
      description: >-
        An uploaded board checked the way a fab would, with no quote or order:
        JLCPCB's limits, each partner fab's

        estimated verdict, KiCad's own design-rule check, and with boards the
        BOM's parts. The fab verdicts are an

        estimate from published limits, not the fab's review. 120 an hour per
        key.
      operationId: design_check_v1_design_checks_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DesignCheckRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DesignCheckReply'
        '422':
          description: >-
            A field was refused, or the design needs an answer first
            (needs_details...)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
        4XX:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
          description: Client Error
        5XX:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
          description: Server Error
components:
  schemas:
    DesignCheckRequest:
      properties:
        upload_id:
          type: string
          maxLength: 64
          title: Upload Id
          description: The upload_id from POST /v1/uploads.
        boards:
          anyOf:
            - type: integer
              maximum: 100000
              minimum: 1
            - type: 'null'
          title: Boards
          description: How many boards will be built, to check the BOM's parts.
        copper_oz:
          anyOf:
            - type: number
              maximum: 6
              minimum: 0.5
            - type: 'null'
          title: Copper Oz
          description: Outer copper weight in oz; JLCPCB's standard 1 oz if left out.
        thickness_mm:
          anyOf:
            - type: number
              maximum: 6
              minimum: 0.2
            - type: 'null'
          title: Thickness Mm
          description: Finished thickness in mm; JLCPCB's standard 1.6 mm if left out.
        board:
          anyOf:
            - type: string
            - type: 'null'
          title: Board
          description: Which .kicad_pcb to check when the upload holds more than one.
        wait_s:
          type: integer
          maximum: 50
          minimum: 0
          title: Wait S
          description: >-
            Seconds to wait for the distributors' answer. 0 returns JLCPCB's
            answer at once (about two seconds); the default covers most boards.
          default: 15
        itar:
          type: boolean
          title: Itar
          description: >-
            true if the design is ITAR-controlled: it is refused before anything
            is read.
          default: false
      additionalProperties: false
      type: object
      required:
        - upload_id
      title: DesignCheckRequest
    DesignCheckReply:
      properties:
        ok:
          type: boolean
          title: Ok
        status:
          type: string
          enum:
            - pass
            - warning
            - must_fix
            - checking
          title: Status
          description: >-
            checking: a large board's copper is still being measured; findings
            are those so far. Send the same check again after retry_after_s.
        retry_after_s:
          anyOf:
            - type: integer
            - type: 'null'
          title: Retry After S
          description: >-
            With checking: seconds until the full report. Also in the
            Retry-After header.
        board_check:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Board Check
          description: 'With checking: the board check still running, and where it is.'
        files:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Files
        assumed:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Assumed
        findings:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Findings
          description: 'Worst first: {level (must_fix, warning, note), check, what}.'
        more_findings:
          anyOf:
            - type: integer
            - type: 'null'
          title: More Findings
        fabricators_note:
          anyOf:
            - type: string
            - type: 'null'
          title: Fabricators Note
        fabricators:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Fabricators
          description: >-
            Each partner fab's estimated verdict from its published limits:
            can_build, cannot_build or not_fully_checked.
        parts:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Parts
          description: 'With boards: the BOM''s parts, as POST /v1/part-checks answers.'
        part_checks:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Part Checks
          description: >-
            With a BOM: datasheet, package and footprint checks, on a later
            call.
      additionalProperties: true
      type: object
      required:
        - ok
        - status
        - findings
        - fabricators
      title: DesignCheckReply
    ErrorReply:
      properties:
        ok:
          type: boolean
          const: false
          title: Ok
          default: false
        error:
          type: string
          title: Error
          description: >-
            The MCP's error code, for example needs_details, rate_limited or
            no_files.
        message:
          type: string
          title: Message
          description: What went wrong and what to do, in words to relay.
        questions:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Questions
          description: >-
            needs_details: each open question with its option, choices and usual
            answer. Answer them and send the same quote again with those fields.
        known:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Known
          description: 'needs_details: what the files already said.'
        parts:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Parts
          description: >-
            needs_part_numbers (and needs_details): the BOM lines to name
            exactly.
        off_board_parts:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Off Board Parts
          description: BOM lines with no pick-and-place position.
        retry_after_s:
          anyOf:
            - type: integer
            - type: 'null'
          title: Retry After S
          description: 'rate_limited: seconds to wait. Also in the Retry-After header.'
        checkout_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Checkout Url
          description: >-
            card_declined / authentication_required: where the customer pays
            instead.
        fields:
          anyOf:
            - items:
                additionalProperties:
                  type: string
                type: object
              type: array
            - type: 'null'
          title: Fields
          description: 'invalid_request: each field that was refused and why.'
      additionalProperties: true
      type: object
      required:
        - error
        - message
      title: ErrorReply
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Your ProvenMetal API key (`pm_live_...`). `Authorization: Bearer <key>`
        also works.

````

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