POST /v1/quotes

Create Quote

Summary

Create a deterministic quote from a Gerber zip or DFM run

Description

Creates a quote from DFM analysis and pricing. Accepts dfm_run_id (preferred for audit), board_id, or file upload. When using dfm_run_id, pricing is locked to that specific DFM snapshot.

Request Example

# Quote from DFM run (preferred for audit)
curl -X POST "http://127.0.0.1:8000/api/v1/quotes" \
  -H "Authorization: Bearer $ASAP_API_KEY" \
  -F 'quote_request_json={"dfm_run_id":"dfm_...","quantity":10,"lead_time":"standard","build":{"type":"bare_pcb"},"ship_to":{"country":"US","postal_code":"94107","state":"CA"}}'

# Quote from board_id
curl -X POST "http://127.0.0.1:8000/api/v1/quotes" \
  -H "Authorization: Bearer $ASAP_API_KEY" \
  -F 'quote_request_json={"board_id":"brd_...","quantity":10,"lead_time":"standard","build":{"type":"bare_pcb"},"ship_to":{"country":"US","postal_code":"94107","state":"CA"}}'

# Quote with file upload
curl -X POST "http://127.0.0.1:8000/api/v1/quotes" \
  -H "Authorization: Bearer $ASAP_API_KEY" \
  -F "file=@board.zip" \
  -F 'quote_request_json={"quantity":10,"lead_time":"standard","build":{"type":"bare_pcb"},"ship_to":{"country":"US","postal_code":"94107","state":"CA"}}'

Response Example

{
  "request_id": "req_1234567890abcdef",
  "quote_id": "quo_1234567890abcdef",
  "status": "approved",
  "board_id": "brd_1234567890abcdef",
  "dfm_run_id": "dfm_1234567890abcdef",
  "pricing": {
    "currency": "USD",
    "subtotal": 182.00,
    "shipping": 24.00,
    "tax": 0.00,
    "total": 206.00,
    "unit_price": 18.20
  },
  "lead_time": {
    "option": "standard",
    "estimated_ship_date": "2026-01-28",
    "estimated_delivery_date": "2026-01-31"
  },
  "gates": {
    "dfm": {"status": "pass"},
    "policy": {"status": "pass", "violations": []}
  },
  "warnings": [],
  "expires_at": "2026-01-26T11:00:00Z"
}

Error Codes

This endpoint may return the following error codes:

Code Status Meaning
missing_auth 401 No Authorization header provided
invalid_api_key 403 API key is invalid or missing
invalid_file 400 Uploaded file is not a .zip file
empty_file 400 Uploaded file is empty
invalid_quote_request 400 Bad JSON in quote_request_json
board_not_found 404 board_id not found
dfm_run_not_found 404 dfm_run_id not found
missing_input 400 Provide dfm_run_id or board_id or file
dfm_failed 500 DFM execution failed

Authentication

This endpoint requires Bearer token authentication:

Authorization: Bearer YOUR_API_KEY