curl --request POST \
--url https://api.provenmetal.com/v1/reorders \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"history_token": "<string>",
"order_id": "<string>",
"quantity": 50000,
"assembly": true,
"upload_id": "<string>",
"board": "<string>",
"skip_board_checks": false,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"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": true,
"special_notes": "<string>",
"project_name": "<string>",
"itar": false
}
'import requests
url = "https://api.provenmetal.com/v1/reorders"
payload = {
"history_token": "<string>",
"order_id": "<string>",
"quantity": 50000,
"assembly": True,
"upload_id": "<string>",
"board": "<string>",
"skip_board_checks": False,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"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": True,
"special_notes": "<string>",
"project_name": "<string>",
"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({
history_token: '<string>',
order_id: '<string>',
quantity: 50000,
assembly: true,
upload_id: '<string>',
board: '<string>',
skip_board_checks: false,
layers: 123,
thickness_mm: 5.05,
copper_oz: 6.05,
inner_copper_oz: 6.05,
jlc_options: {},
ship_to: {
name: '',
email: '',
phone: '',
company: '',
line1: '',
line2: '',
city: '',
state: '',
postal_code: '',
country: '',
tax_id: ''
},
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: true,
special_notes: '<string>',
project_name: '<string>',
itar: false
})
};
fetch('https://api.provenmetal.com/v1/reorders', 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/reorders",
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([
'history_token' => '<string>',
'order_id' => '<string>',
'quantity' => 50000,
'assembly' => true,
'upload_id' => '<string>',
'board' => '<string>',
'skip_board_checks' => false,
'layers' => 123,
'thickness_mm' => 5.05,
'copper_oz' => 6.05,
'inner_copper_oz' => 6.05,
'jlc_options' => [
],
'ship_to' => [
'name' => '',
'email' => '',
'phone' => '',
'company' => '',
'line1' => '',
'line2' => '',
'city' => '',
'state' => '',
'postal_code' => '',
'country' => '',
'tax_id' => ''
],
'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' => true,
'special_notes' => '<string>',
'project_name' => '<string>',
'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/reorders"
payload := strings.NewReader("{\n \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\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/reorders")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\n \"itar\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.provenmetal.com/v1/reorders")
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 \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\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>",
"faster_builds": [
{}
],
"shipping": "<string>",
"summary": "<string>",
"hs_code": "<string>",
"shipping_options": [
{}
],
"includes": [
"<string>"
],
"in_your_currency": {},
"running_price": "<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": [
{}
]
}Order a board again
The MCP’s reorder: one of the customer’s earlier orders priced again as a new quote, with every choice carried forward and only the fields sent changed. Without upload_id the earlier order’s files are used. The reply is a quote, exactly as POST /v1/quotes answers, including 202 and GET /v1/quote-requests/ while it prices.
curl --request POST \
--url https://api.provenmetal.com/v1/reorders \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"history_token": "<string>",
"order_id": "<string>",
"quantity": 50000,
"assembly": true,
"upload_id": "<string>",
"board": "<string>",
"skip_board_checks": false,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"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": true,
"special_notes": "<string>",
"project_name": "<string>",
"itar": false
}
'import requests
url = "https://api.provenmetal.com/v1/reorders"
payload = {
"history_token": "<string>",
"order_id": "<string>",
"quantity": 50000,
"assembly": True,
"upload_id": "<string>",
"board": "<string>",
"skip_board_checks": False,
"layers": 123,
"thickness_mm": 5.05,
"copper_oz": 6.05,
"inner_copper_oz": 6.05,
"jlc_options": {},
"ship_to": {
"name": "",
"email": "",
"phone": "",
"company": "",
"line1": "",
"line2": "",
"city": "",
"state": "",
"postal_code": "",
"country": "",
"tax_id": ""
},
"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": True,
"special_notes": "<string>",
"project_name": "<string>",
"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({
history_token: '<string>',
order_id: '<string>',
quantity: 50000,
assembly: true,
upload_id: '<string>',
board: '<string>',
skip_board_checks: false,
layers: 123,
thickness_mm: 5.05,
copper_oz: 6.05,
inner_copper_oz: 6.05,
jlc_options: {},
ship_to: {
name: '',
email: '',
phone: '',
company: '',
line1: '',
line2: '',
city: '',
state: '',
postal_code: '',
country: '',
tax_id: ''
},
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: true,
special_notes: '<string>',
project_name: '<string>',
itar: false
})
};
fetch('https://api.provenmetal.com/v1/reorders', 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/reorders",
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([
'history_token' => '<string>',
'order_id' => '<string>',
'quantity' => 50000,
'assembly' => true,
'upload_id' => '<string>',
'board' => '<string>',
'skip_board_checks' => false,
'layers' => 123,
'thickness_mm' => 5.05,
'copper_oz' => 6.05,
'inner_copper_oz' => 6.05,
'jlc_options' => [
],
'ship_to' => [
'name' => '',
'email' => '',
'phone' => '',
'company' => '',
'line1' => '',
'line2' => '',
'city' => '',
'state' => '',
'postal_code' => '',
'country' => '',
'tax_id' => ''
],
'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' => true,
'special_notes' => '<string>',
'project_name' => '<string>',
'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/reorders"
payload := strings.NewReader("{\n \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\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/reorders")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\n \"itar\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.provenmetal.com/v1/reorders")
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 \"history_token\": \"<string>\",\n \"order_id\": \"<string>\",\n \"quantity\": 50000,\n \"assembly\": true,\n \"upload_id\": \"<string>\",\n \"board\": \"<string>\",\n \"skip_board_checks\": false,\n \"layers\": 123,\n \"thickness_mm\": 5.05,\n \"copper_oz\": 6.05,\n \"inner_copper_oz\": 6.05,\n \"jlc_options\": {},\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 \"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\": true,\n \"special_notes\": \"<string>\",\n \"project_name\": \"<string>\",\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>",
"faster_builds": [
{}
],
"shipping": "<string>",
"summary": "<string>",
"hs_code": "<string>",
"shipping_options": [
{}
],
"includes": [
"<string>"
],
"in_your_currency": {},
"running_price": "<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, as POST /v1/quotes.
0 <= x <= 150Body
Everything the MCP reorder tool takes: an earlier order and only what changes, with the delivery details as one ship_to object (it replaces the earlier delivery whole).
From POST /v1/previous-orders.
200One of the orders POST /v1/previous-orders listed.
80Only to change it.
1 <= x <= 100000Only to change it: true for assembled boards, false for bare boards.
Revised design files, from POST /v1/uploads. Left out, the earlier order's files are used.
64Which .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.
Only to change it.
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. Green builds fastest: on a small 1-2 layer order any other colour takes JLCPCB about a day longer. 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 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 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.
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
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.
Replaces the earlier order's component changes ([] clears them), only with the customer's explicit approval.
Show child attributes
Show child attributes
Only to change it.
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.
A name for the board, shown on the order.
200true 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.
instant: JLCPCB's faster builds for this board, each {build_time_hours, build, adds, delivery}. Offer them before checkout; to take one, quote again with the same body and build_time_hours.
instant: the carrier the total ships by.
With saved_details: the board in one line, for the question asked before paying with saved details.
instant: the customs code the boards are declared under. null for assembled boards nobody gave a code for: JLCPCB classifies them; pass hs_code to set one.
instant: JLCPCB's other carriers, each {shipping_method, carrier, adds or saves, delivery, duty_on_delivery}. Offer them before checkout; to take one, quote again with the same body and shipping_method.
The total's lines, as words.
instant, outside the U.S. or when currency is given: total, includes and rate in that currency, at the ECB's rate.
The price so far and what it covers, in one line: everything (instant), or what is priced and still to come.
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.