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

# HTTP API

> Formal quotes and orders from your own software.

For integrations without an agent. Quotes are issued by ProvenMetal for any fab or assembler. For instant JLCPCB prices, use the [MCP](/quickstart).

<CardGroup cols={2}>
  <Card title="Base URL" icon="globe">
    `https://api.provenmetal.com`
  </Card>

  <Card title="Auth" icon="key">
    `X-API-Key` header
  </Card>
</CardGroup>

## Authentication

Send your key (`pm_live_...`) as `X-API-Key` or a bearer token. Ask ProvenMetal for one.

```bash theme={"dark"}
curl https://api.provenmetal.com/auth/check -H "X-API-Key: $PROVENMETAL_API_KEY"
```

## Flow

<Steps>
  <Step title="Submit">
    [`POST /central/orders`](/api-reference/orders/submit-an-order-for-a-quote) with the files as multipart form data.

    ```bash theme={"dark"}
    curl https://api.provenmetal.com/central/orders \
      -H "X-API-Key: $PROVENMETAL_API_KEY" \
      -F name="Motor controller rev B" \
      -F qty=25 \
      -F gerbers=@gerbers.zip \
      -F bom=@bom.csv \
      -F cpl=@positions.csv \
      -F 'services={"fabrication":true,"part_procurement":true,"assembly":true}' \
      -F request_id=motor-ctrl-revb-0001
    ```

    Resending the same `request_id` returns the same order.
  </Step>

  <Step title="Read the quote">
    [`GET /central/orders/{identifier}`](/api-reference/orders/get-an-order) returns status and, once issued, the quote options.
  </Step>

  <Step title="Accept">
    After the customer approves, [`POST .../accept-quote`](/api-reference/orders/accept-a-quote) with the option exactly as shown:

    ```json theme={"dark"}
    {
      "customer_approved": true,
      "option_id": "opt_2",
      "quote_number": "Q-1042",
      "issued_at": "2026-10-19T17:20:00Z",
      "total_cents": 248500
    }
    ```

    If the quote changed, nothing is accepted.
  </Step>

  <Step title="Track">
    The same order endpoint returns dates and tracking. [Design reviews](/api-reference/orders/get-the-design-review) have their own endpoint.
  </Step>
</Steps>

## Errors

| Status | `error` | Meaning |
| - | - | - |
| 401 | | Bad or missing key |
| 404 | `order_not_found` | Not on your account |
| 413 | `invalid_file` | File over 20 MB |
| 422 | `design_or_bom_required` | Send Gerbers and/or a BOM |
| 422 | `gerbers_required_for_fabrication` | Fabrication needs Gerbers |
| 422 | `layers_required` | Send `board_layers` |
| 422 | `itar_origin` | ITAR must be `board_origin=us` |
| 422 | `explicit_approval_required` | `customer_approved` must be true |
| 400/409/422 | `quote_not_accepted` | Quote changed |
| 502 | `central_order_incomplete` | Resend with the same `request_id` |
| 502 | `central_unavailable` | Read the order and retry |


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