curl --request POST \
--url https://api.provenmetal.com/v1/quotes \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"upload_id": "<string>",
"quantity": 123,
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"assembly": false,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"impedance_controlled": true,
"jlc_stackup": "<string>",
"special_requirements": true,
"special_notes": "<string>",
"standard_for_unstated": false,
"board": "<string>",
"skip_board_checks": false,
"project_name": "<string>",
"board_context": "<string>",
"customer_supplied_refs": [
"<string>"
],
"do_not_fit_refs": [
"<string>"
],
"substitutions": [
{
"reference": "<string>",
"original_mpn": "<string>",
"replacement_mpn": "<string>",
"reason": "<string>",
"replacement_manufacturer": "<string>"
}
],
"staff_picks_parts": false,
"itar": false
}
'import requests
url = "https://api.provenmetal.com/v1/quotes"
payload = {
"upload_id": "<string>",
"quantity": 123,
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"assembly": False,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"impedance_controlled": True,
"jlc_stackup": "<string>",
"special_requirements": True,
"special_notes": "<string>",
"standard_for_unstated": False,
"board": "<string>",
"skip_board_checks": False,
"project_name": "<string>",
"board_context": "<string>",
"customer_supplied_refs": ["<string>"],
"do_not_fit_refs": ["<string>"],
"substitutions": [
{
"reference": "<string>",
"original_mpn": "<string>",
"replacement_mpn": "<string>",
"reason": "<string>",
"replacement_manufacturer": "<string>"
}
],
"staff_picks_parts": False,
"itar": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
upload_id: '<string>',
quantity: 123,
ship_to: {
name: '',
email: '',
phone: '',
company: '',
line1: '',
line2: '',
city: '',
state: '',
postal_code: '',
country: '',
tax_id: ''
},
assembly: false,
layers: 123,
thickness_mm: 5.05,
copper_oz: 6.05,
inner_copper_oz: 6.05,
jlc_options: {},
impedance_controlled: true,
jlc_stackup: '<string>',
special_requirements: true,
special_notes: '<string>',
standard_for_unstated: false,
board: '<string>',
skip_board_checks: false,
project_name: '<string>',
board_context: '<string>',
customer_supplied_refs: ['<string>'],
do_not_fit_refs: ['<string>'],
substitutions: [
{
reference: '<string>',
original_mpn: '<string>',
replacement_mpn: '<string>',
reason: '<string>',
replacement_manufacturer: '<string>'
}
],
staff_picks_parts: false,
itar: false
})
};
fetch('https://api.provenmetal.com/v1/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provenmetal.com/v1/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'upload_id' => '<string>',
'quantity' => 123,
'ship_to' => [
'name' => '',
'email' => '',
'phone' => '',
'company' => '',
'line1' => '',
'line2' => '',
'city' => '',
'state' => '',
'postal_code' => '',
'country' => '',
'tax_id' => ''
],
'assembly' => false,
'layers' => 123,
'thickness_mm' => 5.05,
'copper_oz' => 6.05,
'inner_copper_oz' => 6.05,
'jlc_options' => [
],
'impedance_controlled' => true,
'jlc_stackup' => '<string>',
'special_requirements' => true,
'special_notes' => '<string>',
'standard_for_unstated' => false,
'board' => '<string>',
'skip_board_checks' => false,
'project_name' => '<string>',
'board_context' => '<string>',
'customer_supplied_refs' => [
'<string>'
],
'do_not_fit_refs' => [
'<string>'
],
'substitutions' => [
[
'reference' => '<string>',
'original_mpn' => '<string>',
'replacement_mpn' => '<string>',
'reason' => '<string>',
'replacement_manufacturer' => '<string>'
]
],
'staff_picks_parts' => false,
'itar' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.provenmetal.com/v1/quotes"
payload := strings.NewReader("{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.provenmetal.com/v1/quotes")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.provenmetal.com/v1/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"mode": "instant",
"quote_id": "<string>",
"checkout_url": "<string>",
"quantity": 123,
"request_id": "<string>",
"total": "<string>",
"per_board": "<string>",
"tax": "<string>",
"currency": "<string>",
"total_cents": 123,
"per_board_cents": 123,
"tax_cents": 123,
"lines": [
{}
],
"board_details": {},
"assembled": true,
"lead_time": "<string>",
"delivery": "<string>",
"includes": [
"<string>"
],
"board": "<string>",
"board_image_url": "<string>",
"delivery_saved": true,
"saved_details": true,
"unpriced_parts": [
{}
],
"picked_parts": [
{}
],
"requested_substitutions": [
{}
],
"custom_quote_reasons": [
"<string>"
],
"fabrication_quote": {},
"notes": [
"<string>"
],
"expires_at": "<string>",
"next": "<string>"
}{
"ok": true,
"status": "pending",
"request_id": "<string>",
"poll_url": "<string>",
"retry_after_s": 123,
"elapsed_s": 123,
"progress": "<string>"
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}Get a quote
A live JLCPCB price for the upload, delivered with shipping, duty and tax; a custom-quote link (mode review); or what to answer first (needs_details, needs_part_numbers). The same body within ten minutes is the same request: it joins the one pricing or answers the quote it priced, and never prices twice.
curl --request POST \
--url https://api.provenmetal.com/v1/quotes \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"upload_id": "<string>",
"quantity": 123,
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"assembly": false,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"impedance_controlled": true,
"jlc_stackup": "<string>",
"special_requirements": true,
"special_notes": "<string>",
"standard_for_unstated": false,
"board": "<string>",
"skip_board_checks": false,
"project_name": "<string>",
"board_context": "<string>",
"customer_supplied_refs": [
"<string>"
],
"do_not_fit_refs": [
"<string>"
],
"substitutions": [
{
"reference": "<string>",
"original_mpn": "<string>",
"replacement_mpn": "<string>",
"reason": "<string>",
"replacement_manufacturer": "<string>"
}
],
"staff_picks_parts": false,
"itar": false
}
'import requests
url = "https://api.provenmetal.com/v1/quotes"
payload = {
"upload_id": "<string>",
"quantity": 123,
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"assembly": False,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"impedance_controlled": True,
"jlc_stackup": "<string>",
"special_requirements": True,
"special_notes": "<string>",
"standard_for_unstated": False,
"board": "<string>",
"skip_board_checks": False,
"project_name": "<string>",
"board_context": "<string>",
"customer_supplied_refs": ["<string>"],
"do_not_fit_refs": ["<string>"],
"substitutions": [
{
"reference": "<string>",
"original_mpn": "<string>",
"replacement_mpn": "<string>",
"reason": "<string>",
"replacement_manufacturer": "<string>"
}
],
"staff_picks_parts": False,
"itar": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
upload_id: '<string>',
quantity: 123,
ship_to: {
name: '',
email: '',
phone: '',
company: '',
line1: '',
line2: '',
city: '',
state: '',
postal_code: '',
country: '',
tax_id: ''
},
assembly: false,
layers: 123,
thickness_mm: 5.05,
copper_oz: 6.05,
inner_copper_oz: 6.05,
jlc_options: {},
impedance_controlled: true,
jlc_stackup: '<string>',
special_requirements: true,
special_notes: '<string>',
standard_for_unstated: false,
board: '<string>',
skip_board_checks: false,
project_name: '<string>',
board_context: '<string>',
customer_supplied_refs: ['<string>'],
do_not_fit_refs: ['<string>'],
substitutions: [
{
reference: '<string>',
original_mpn: '<string>',
replacement_mpn: '<string>',
reason: '<string>',
replacement_manufacturer: '<string>'
}
],
staff_picks_parts: false,
itar: false
})
};
fetch('https://api.provenmetal.com/v1/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provenmetal.com/v1/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'upload_id' => '<string>',
'quantity' => 123,
'ship_to' => [
'name' => '',
'email' => '',
'phone' => '',
'company' => '',
'line1' => '',
'line2' => '',
'city' => '',
'state' => '',
'postal_code' => '',
'country' => '',
'tax_id' => ''
],
'assembly' => false,
'layers' => 123,
'thickness_mm' => 5.05,
'copper_oz' => 6.05,
'inner_copper_oz' => 6.05,
'jlc_options' => [
],
'impedance_controlled' => true,
'jlc_stackup' => '<string>',
'special_requirements' => true,
'special_notes' => '<string>',
'standard_for_unstated' => false,
'board' => '<string>',
'skip_board_checks' => false,
'project_name' => '<string>',
'board_context' => '<string>',
'customer_supplied_refs' => [
'<string>'
],
'do_not_fit_refs' => [
'<string>'
],
'substitutions' => [
[
'reference' => '<string>',
'original_mpn' => '<string>',
'replacement_mpn' => '<string>',
'reason' => '<string>',
'replacement_manufacturer' => '<string>'
]
],
'staff_picks_parts' => false,
'itar' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.provenmetal.com/v1/quotes"
payload := strings.NewReader("{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.provenmetal.com/v1/quotes")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.provenmetal.com/v1/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"upload_id\": \"<string>\",\n \"quantity\": 123,\n \"ship_to\": {\n \"name\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"company\": \"\",\n \"line1\": \"\",\n \"line2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postal_code\": \"\",\n \"country\": \"\",\n \"tax_id\": \"\"\n },\n \"assembly\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\n \"impedance_controlled\": true,\n \"jlc_stackup\": \"<string>\",\n \"special_requirements\": true,\n \"special_notes\": \"<string>\",\n \"standard_for_unstated\": false,\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"project_name\": \"<string>\",\n \"board_context\": \"<string>\",\n \"customer_supplied_refs\": [\n \"<string>\"\n ],\n \"do_not_fit_refs\": [\n \"<string>\"\n ],\n \"substitutions\": [\n {\n \"reference\": \"<string>\",\n \"original_mpn\": \"<string>\",\n \"replacement_mpn\": \"<string>\",\n \"reason\": \"<string>\",\n \"replacement_manufacturer\": \"<string>\"\n }\n ],\n \"staff_picks_parts\": false,\n \"itar\": false\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"mode": "instant",
"quote_id": "<string>",
"checkout_url": "<string>",
"quantity": 123,
"request_id": "<string>",
"total": "<string>",
"per_board": "<string>",
"tax": "<string>",
"currency": "<string>",
"total_cents": 123,
"per_board_cents": 123,
"tax_cents": 123,
"lines": [
{}
],
"board_details": {},
"assembled": true,
"lead_time": "<string>",
"delivery": "<string>",
"includes": [
"<string>"
],
"board": "<string>",
"board_image_url": "<string>",
"delivery_saved": true,
"saved_details": true,
"unpriced_parts": [
{}
],
"picked_parts": [
{}
],
"requested_substitutions": [
{}
],
"custom_quote_reasons": [
"<string>"
],
"fabrication_quote": {},
"notes": [
"<string>"
],
"expires_at": "<string>",
"next": "<string>"
}{
"ok": true,
"status": "pending",
"request_id": "<string>",
"poll_url": "<string>",
"retry_after_s": 123,
"elapsed_s": 123,
"progress": "<string>"
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}{
"error": "<string>",
"message": "<string>",
"ok": false,
"questions": [
{}
],
"known": {},
"parts": [
{}
],
"off_board_parts": [
{}
],
"retry_after_s": 123,
"checkout_url": "<string>",
"fields": [
{}
]
}Authorizations
Your ProvenMetal API key (pm_live_...). Authorization: Bearer <key> also works.
Query Parameters
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.
0 <= x <= 150Body
Everything the MCP quote tool takes, with the delivery details as one ship_to object.
The upload_id from POST /v1/uploads.
64How many boards, 1 to 100,000.
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.
Show child attributes
Show child attributes
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.
Copper layers, when the files don't state them.
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.
0.1 <= x <= 10The finishes JLCPCB's API prices. OSP, ENEPIG and immersion tin or silver aren't among them: they need special_requirements=true, a custom quote.
enig, hasl_lead_free, hasl The gloss colours JLCPCB's API prices. A matte mask isn't among them: it needs special_requirements=true, a custom quote.
Green, Red, Blue, White, Black, Yellow, Purple, Transparent Outer copper in oz, only when the user or the files state it; otherwise it is asked, or 1 oz with standard_for_unstated.
0.1 <= x <= 12Inner-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.
0.1 <= x <= 12Only when the user or the files state it. Any other laminate is special_requirements=true.
FR-4, FR-4 / TG155, FR-4 / TG170, Aluminum, Copper core, Rogers 4350B, ZYF300CA-P, ZYF300CA-C, ZYF265D, ZYF255DA, Polyimide 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.
Filled or plugged vias, priced instantly, when the user or the files call for them. Blind, buried or micro vias are special_requirements=true.
tented, untented, plugged, epoxy_filled_capped, copper_paste_filled_capped 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.
The JLCPCB stackup the design was made for, for example JLC04161H-7628.
When the files carry their own layer stackup, ask the user: replace lets JLCPCB's be used; keep makes it a custom quote.
replace, keep 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.
one_panel, separately 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.
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.
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.
Which .kicad_pcb to use when the upload holds more than one.
true only if the user wants a KiCad board with shorts or unrouted connections built as designed anyway; the quote says so.
A name for the board, shown on the order.
200If 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.
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).
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.
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.
Show child attributes
Show child attributes
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.
true only if the user says the design is ITAR-controlled: it can't be ordered here.
Response
Successful Response
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.
instant, review 64 hex characters: GET /v1/quotes/{quote_id} reports where it stands.
The quote request that made it.
Total in USD, delivered, with tax (instant). null for review.
instant: USD.
instant: the total in cents.
instant: what the total is made of, each {label, cents}.
instant: the board as priced (layers, width_mm, height_mm, thickness_mm, copper_oz, inner_copper_oz, surface_finish, solder_mask, material).
Build time.
From payment to the door, build included.
The total's lines, as words.
The board in one line.
A PNG of the board.
Checkout opens with the delivery details already saved.
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.
review: each part that couldn't be priced, with why and what was searched, and any similar_part to offer.
staff_picks_parts: the parts ProvenMetal chose.
review: why it needs ProvenMetal's team.
review of an assembly: an instant price for the bare boards alone, with its own checkout_url.
What to do next, in words to relay.