API
Send a file and an address, and Craftshop prints it, checks it and ships it, notifying you by webhook at every stage.
Preview
Coming soonCreate an order
curl https://api.craftshoplabs.com/v1/orders \
-H "Authorization: Bearer $CRAFTSHOP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MOD-0020",
"quantity": 1,
"material": "PETG Negro",
"ship_to": {
"name": "Ana Gómez",
"address": "Av. Corrientes 1234, Piso 3",
"city": "Ciudad Autónoma de Buenos Aires",
"postal_code": "C1043AAZ",
"country": "AR"
}
}'const response = await fetch('https://api.craftshoplabs.com/v1/orders', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CRAFTSHOP_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'MOD-0020',
quantity: 1,
material: 'PETG Negro',
ship_to: {
name: 'Ana Gómez',
address: 'Av. Corrientes 1234, Piso 3',
city: 'Ciudad Autónoma de Buenos Aires',
postal_code: 'C1043AAZ',
country: 'AR',
},
}),
})
const order = await response.json()import os
import requests
api_key = os.environ["CRAFTSHOP_API_KEY"]
response = requests.post(
"https://api.craftshoplabs.com/v1/orders",
headers={"Authorization": f"Bearer {api_key}"},
json={
"model": "MOD-0020",
"quantity": 1,
"material": "PETG Negro",
"ship_to": {
"name": "Ana Gómez",
"address": "Av. Corrientes 1234, Piso 3",
"city": "Ciudad Autónoma de Buenos Aires",
"postal_code": "C1043AAZ",
"country": "AR",
},
},
)
order = response.json()let api_key = std::env::var("CRAFTSHOP_API_KEY")?;
let order: serde_json::Value = reqwest::Client::new()
.post("https://api.craftshoplabs.com/v1/orders")
.bearer_auth(api_key)
.json(&serde_json::json!({
"model": "MOD-0020",
"quantity": 1,
"material": "PETG Negro",
"ship_to": {
"name": "Ana Gómez",
"address": "Av. Corrientes 1234, Piso 3",
"city": "Ciudad Autónoma de Buenos Aires",
"postal_code": "C1043AAZ",
"country": "AR"
}
}))
.send()
.await?
.json()
.await?;const craftshop = new Craftshop({ apiKey: process.env.CRAFTSHOP_API_KEY })
const order = await craftshop.orders.create({
model: 'MOD-0020',
quantity: 1,
material: 'PETG Negro',
shipTo: {
name: 'Ana Gómez',
address: 'Av. Corrientes 1234, Piso 3',
city: 'Ciudad Autónoma de Buenos Aires',
postalCode: 'C1043AAZ',
country: 'AR',
},
}){
"type": "job.status_changed",
"job": "JOB-0142",
"order": "ord_7Hq2mX",
"status": "qc_passed",
"occurred_at": "2026-09-30T11:08:00-03:00"
}What it does
Endpoints for models and orders
Upload models, create orders and check their status with per-organization API keys.
A webhook per stage
Queued, printing, QC and shipped: every change reaches you as an event, just as the app shows it.
A sandbox to try it
Try the whole flow without manufacturing anything. Docs, SDKs and a CLI come later, generated from the same contract.
Where it fits in the flow
It is another way in: instead of a sale in your store, an order over the API that follows the same flow.
- Store (part of this product)
- Model
- Golden sample
- Jobs (part of this product)
- Quality check (part of this product)
- Shipping (part of this product)
Today and what's next
What works today
- The app already runs on the service layer the API will expose.
- Orders, jobs and shipments with an event recorded on every change.
What's coming
- Per-organization API keys and endpoints for models and orders.
- Stage webhooks and a sandbox.
- Docs, SDKs and a CLI.
Other products
- Agents (MCP)Coming soon
Craftshop will have an MCP server: an agent such as Claude signs in with your account, inside one organization, and uses the same functions as the app.
- Instant quoteComing soon
Upload a file, see the price and lead time right away, pay, and Craftshop makes it and sends it to you. For makers, design studios, and prototypes or short runs.
Start with what works today.
You create your brand, choose who prints and connect Shopify. What's coming joins the same account, without changing how you work.