Skip to main content
POST
Get a quote

Authorizations

X-API-Key
string
header
required

Your ProvenMetal API key (pm_live_...). Authorization: Bearer <key> also works.

Query Parameters

wait_s
integer
default:30

Seconds to wait for the quote before answering 202 with a request to poll. Bare boards take about 5-25 s; assembled boards up to about 2.5 minutes.

Required range: 0 <= x <= 150

Body

application/json

Everything the MCP quote tool takes, with the delivery details as one ship_to object.

upload_id
string
required

The upload_id from POST /v1/uploads.

Maximum string length: 64
quantity
integer
required

How many boards, 1 to 100,000.

ship_to
ShipTo · object | null

Who receives the boards and where. Everything is optional; pass only what the customer gave, never a guess. With name, email, phone, line1, city, postal code and country (and state where couriers need one) the checkout opens with delivery saved. Without a destination the quote is priced for US delivery.

assembly
boolean
default:false

true for assembled boards (JLCPCB places the parts), false for bare boards. Parts JLCPCB doesn't stock are bought by ProvenMetal from authorized distributors and shipped to JLCPCB in one box; the price includes that.

layers
integer | null

Copper layers, when the files don't state them.

thickness_mm
number | null

Board thickness in mm, only when the user or the files state it; otherwise it is asked, or 1.6 mm with standard_for_unstated.

Required range: 0.1 <= x <= 10
surface_finish
enum<string> | null

The finishes JLCPCB's API prices. OSP, ENEPIG and immersion tin or silver aren't among them: they need special_requirements=true, a custom quote.

Available options:
enig,
hasl_lead_free,
hasl
solder_mask
enum<string> | null

The gloss colours JLCPCB's API prices. A matte mask isn't among them: it needs special_requirements=true, a custom quote.

Available options:
Green,
Red,
Blue,
White,
Black,
Yellow,
Purple,
Transparent
copper_oz
number | null

Outer copper in oz, only when the user or the files state it; otherwise it is asked, or 1 oz with standard_for_unstated.

Required range: 0.1 <= x <= 12
inner_copper_oz
number | null

Inner-layer copper of a 4+ layer board, in oz, only when the user or the design files state it. JLCPCB's standard is 0.5 oz. KiCad's default stackup lists 0.035 mm (1 oz) on every copper layer whether or not anyone chose it, so don't pass 1 from that. Left out, it is asked, or 0.5 oz with standard_for_unstated.

Required range: 0.1 <= x <= 12
material
enum<string> | null

Only when the user or the files state it. Any other laminate is special_requirements=true.

Available options:
FR-4,
FR-4 / TG155,
FR-4 / TG170,
Aluminum,
Copper core,
Rogers 4350B,
ZYF300CA-P,
ZYF300CA-C,
ZYF265D,
ZYF255DA,
Polyimide
jlc_options
Jlc Options · object | null

Exact selections from JLCPCB's documented PCB options object (call jlcpcb_capabilities): services (serviceConfigCode, serviceConfigShow, configOptionShow), gold fingers, castellations, electrical test, marking, rails, ENIG gold thickness and flex options; the live quote checks availability and fees. Blind slots need an order-owned image and take a reviewed quote.

via_process
enum<string> | null

Filled or plugged vias, priced instantly, when the user or the files call for them. Blind, buried or micro vias are special_requirements=true.

Available options:
tented,
untented,
plugged,
epoxy_filled_capped,
copper_paste_filled_capped
impedance_controlled
boolean | null

true, with jlc_stackup, for controlled impedance on the JLCPCB stackup the design was made for: priced instantly. Impedance on the board's own stackup is special_requirements=true.

jlc_stackup
string | null

The JLCPCB stackup the design was made for, for example JLC04161H-7628.

file_stackup
enum<string> | null

When the files carry their own layer stackup, ask the user: replace lets JLCPCB's be used; keep makes it a custom quote.

Available options:
replace,
keep
separate_boards
enum<string> | null

When one file holds several boards (two keyboard halves in one frame), ask the user: one_panel builds it as drawn, separately as separate boards. ProvenMetal's team quotes either.

Available options:
one_panel,
separately
special_requirements
boolean | null

true only when the board needs something the other options can't express: an OSP, ENEPIG or immersion tin or silver finish or a matte mask (none of which JLCPCB's API offers), blind, buried or micro vias, rigid-flex, an unmapped laminate, or impedance on the board's own stackup; describe it in special_notes. It makes a custom quote with no instant price, and its parts aren't checked: tell the user before quoting, so they choose. Notes alone don't need it: send them in special_notes with false.

special_notes
string | null

The user's words for ProvenMetal's team. With special_requirements=true, what is special about the board; with false, notes that don't change it, which reach the team with the order while the price stays instant.

standard_for_unstated
boolean
default:false

true only when the user accepts JLCPCB's standard for whatever neither they nor the files state: 1.6 mm, lead-free HASL, 1 oz outer and 0.5 oz inner copper, green, FR-4 and no special requirements. What the files call for (filled vias, impedance, their own stackup) is still asked.

board
string | null

Which .kicad_pcb to use when the upload holds more than one.

skip_board_checks
boolean
default:false

true only if the user wants a KiCad board with shorts or unrouted connections built as designed anyway; the quote says so.

project_name
string | null

A name for the board, shown on the order.

Maximum string length: 200
board_context
string | null

If the user described what the board is for or stated preferences (deadline, budget, quantities, priorities) in this conversation or a project file, a sentence or two summarising it; leave it out otherwise and never include personal details.

customer_supplied_refs
string[] | null

References of parts the user says they will send (for example U1, L1, Y1), never to get around a review. They stay assembled; the customer ships them to ProvenMetal, 1230 Howard Street, San Francisco (also in the notes and at checkout).

do_not_fit_refs
string[] | null

Whole BOM lines the user says to leave unfitted (for example R21, R24); the reply says they were left off. Never delete or change the user's files to leave a part off. A line the BOM marks do-not-fit, or one with no pick-and-place position (off_board_parts: JLCPCB wouldn't assemble it), comes back asking: pass it here only if the user says so.

substitutions
Substitution · object[] | null

Component changes, only with the customer's explicit approval: one entry per reference. To approve a similar_part, its mpn is the replacement. At most 300.

staff_picks_parts
boolean
default:false

true only if the user wants ProvenMetal to choose the parts the BOM doesn't name exactly (turnkey): each choice comes back in picked_parts with other options. Tell the user; to change one, put its exact part number in the BOM, upload again and quote. Lines that don't say what part they are still come back as needs_part_numbers.

itar
boolean
default:false

true only if the user says the design is ITAR-controlled: it can't be ordered here.

Response

Successful Response

ok
boolean
required
mode
enum<string>
required

instant: a live price the customer pays at checkout_url. review: ProvenMetal's team quotes it (custom options, or parts that couldn't be priced); the customer requests it at checkout_url.

Available options:
instant,
review
quote_id
string
required

64 hex characters: GET /v1/quotes/{quote_id} reports where it stands.

checkout_url
string
required
quantity
integer
required
request_id
string | null

The quote request that made it.

total
string | null

Total in USD, delivered, with tax (instant). null for review.

per_board
string | null
tax
string | null
currency
string | null

instant: USD.

total_cents
integer | null

instant: the total in cents.

per_board_cents
integer | null
tax_cents
integer | null
lines
Lines · object[] | null

instant: what the total is made of, each {label, cents}.

board_details
Board Details · object | null

instant: the board as priced (layers, width_mm, height_mm, thickness_mm, copper_oz, inner_copper_oz, surface_finish, solder_mask, material).

assembled
boolean | null
lead_time
string | null

Build time.

delivery
string | null

From payment to the door, build included.

includes
string[] | null

The total's lines, as words.

board
string | null

The board in one line.

board_image_url
string | null

A PNG of the board.

delivery_saved
boolean | null

Checkout opens with the delivery details already saved.

saved_details
boolean | null

The email in ship_to has a saved card and address: the customer can pay through /saved/code, /saved/verify and /saved/pay after saying yes.

unpriced_parts
Unpriced Parts · object[] | null

review: each part that couldn't be priced, with why and what was searched, and any similar_part to offer.

picked_parts
Picked Parts · object[] | null

staff_picks_parts: the parts ProvenMetal chose.

requested_substitutions
Requested Substitutions · object[] | null
custom_quote_reasons
string[] | null

review: why it needs ProvenMetal's team.

fabrication_quote
Fabrication Quote · object | null

review of an assembly: an instant price for the bare boards alone, with its own checkout_url.

notes
string[] | null
expires_at
string | null
next
string | null

What to do next, in words to relay.