Skip to main content
The same flow as the MCP: upload the design, get a live JLCPCB price delivered with shipping, duty and tax, answer anything the files don’t state, and send the customer to the checkout link.

1. Upload

Send the files with your key. A KiCad project or a Gerber zip; for assembly also a BOM and pick-and-place (KiCad projects make their own); any fabrication drawing, stackup PDF or README goes to ProvenMetal’s team.
  • A whole project goes up fastest as one .zip, or a .tgz (unpacked on arrival): tar -czf - board/ | curl ... -F 'files=@-;filename=upload.tgz'.
  • Each part must be named files. Up to 20 files, 50 MB each, 100 MB in all.
  • upload_url takes more files for two hours with no key (the same multipart form), and POST /v1/uploads with no files returns only the link.
  • Files are kept six hours after the last one arrives. Treat upload_id as a secret: anyone with it can quote the files.

2. Quote

201 with an instant price:
Assembled quotes take seconds when JLCPCB stocks every part and up to about 2.5 minutes when parts are looked up at distributors. If it isn’t done within wait_s (default 30, at most 150) the answer is 202 with a request_id to poll:
Every argument of the MCP quote tool is accepted under the same name: board options (layers, thickness_mm, surface_finish, solder_mask, copper_oz, inner_copper_oz, material), advanced fabrication (jlc_options, via_process, impedance_controlled, jlc_stackup, file_stackup, separate_boards), parts (substitutions, customer_supplied_refs, do_not_fit_refs, staff_picks_parts), special_requirements, special_notes, standard_for_unstated, board, skip_board_checks, board_context and itar. GET /v1/capabilities lists JLCPCB’s materials and services.

3. Answer what the files don’t say

Options are read from the files (ODB++, Gerber job files, Altium reports, the KiCad board’s setup). Anything else comes back as 422 needs_details:
Ask the customer, then send the same quote with the answers ("surface_finish": "enig"), or with "standard_for_unstated": true if they accept JLCPCB’s standard for the rest (1.6 mm, lead-free HASL, 1 oz outer and 0.5 oz inner copper, green, FR-4, no special requirements).

4. Review quotes

mode: "review" means ProvenMetal’s team quotes it: options JLCPCB’s API can’t price (custom_quote_reasons), or parts that couldn’t be priced (unpriced_parts, each with why and what was searched). The customer requests the full quote at checkout_url. When only the assembly is unpriced, fabrication_quote is an instant price for the bare boards with its own checkout link. An unpriced part may carry a similar_part in stock. If the customer approves it, quote again with:
Only pass substitutions the customer approved. Passive parts with exact-spec replacements are handled without asking; active parts are never swapped automatically.

5. Checkout

Send the customer to checkout_url. With a full ship_to, delivery is already saved (delivery_saved: true) and they only pay; otherwise they enter the rest there. They make their ProvenMetal account when they pay. When the email in ship_to belongs to a returning customer with a saved card and address, the quote says saved_details: true. After the customer says yes to buying with them:
1

Email a code

POST /v1/quotes/{quote_id}/saved/code
2

Check it

POST /v1/quotes/{quote_id}/saved/verify with {"code": "123456"}. Show the customer summary (total, card, ship-to).
3

Pay

POST /v1/quotes/{quote_id}/saved/pay with {"confirm_token": "..."}. A declined card answers 402 with checkout_url.

6. Follow it

status is quote_ready, awaiting_payment, sourcing_ready, sourcing_requested, sourcing_quoted, expired, ordered, in_production or shipped, with order_ref once paid and tracking once shipped.
ITAR designs can’t be ordered through the API or the MCP: pass "itar": true and they are refused before anything is read. Use provenmetal.com.