DingPack API Reference
The DingPack API lets you queue packing slip print jobs from any platform — WooCommerce, custom storefronts, ERPs, or your own scripts. The API is REST-based, returns JSON, and authenticates via API key.
Authentication
Authenticate by passing your API key as a Bearer token in the Authorization header.
Find your API key in your dashboard under the Security tab.
curl https://dingpack.com/api/v1/account \
-H "Authorization: Bearer dp_your_api_key_here"
const res = await fetch('https://dingpack.com/api/v1/account', {
headers: { 'Authorization': 'Bearer dp_your_api_key_here' }
});
const data = await res.json();
import requests
headers = {"Authorization": "Bearer dp_your_api_key_here"}
res = requests.get("https://dingpack.com/api/v1/account", headers=headers)
data = res.json()
$ch = curl_init('https://dingpack.com/api/v1/account');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer dp_your_api_key_here'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = json_decode(curl_exec($ch), true);
Rate Limits
Each print job queued via the API counts against your plan's monthly print limit — the same pool used by your Shopify webhook. When the limit is reached, the API returns 429 Too Many Requests.
| Plan | Monthly prints | API access |
|---|---|---|
| Free | 25 | ✗ Not included |
| Starter | 100 | ✗ Not included |
| Pro | 500 | ✓ Included |
Limits reset on your monthly billing cycle date. Check your remaining prints via GET /api/v1/account.
Errors
All errors return a JSON body with an error field and an optional hint.
| Status | Meaning |
|---|---|
200 / 201 | Success |
400 | Bad request — missing or invalid field |
401 | Invalid or missing API key |
403 | Plan does not include API access |
404 | Resource not found |
429 | Monthly print limit reached |
500 | Server error |
{
"error": "Monthly print limit reached",
"limit": 500,
"hint": "Upgrade your plan or wait for your billing cycle to reset"
}
Endpoints
/api/v1/account
Returns account info including your current plan, print usage, and remaining limit for this billing cycle.
Example request
curl https://dingpack.com/api/v1/account \
-H "Authorization: Bearer dp_your_api_key_here"
Response
{
"store": "NJF Golf",
"plan": "Pro",
"prints_used": 142,
"prints_limit": 500,
"prints_remaining": 358
}
/api/v1/jobs
Queue a packing slip print job. The DingPack agent on your printer PC will pick it up within 5 seconds and send it to the configured printer. Works with any platform — Shopify, WooCommerce, custom storefronts, or manual orders.
Request body
| Field | Type | Description |
|---|---|---|
order_number required |
string | Your order number or identifier |
line_items required |
array | Array of Line Item objects |
customer_name |
string | Customer's full name |
shipping_address |
object | Shipping address — see Order Object |
billing_address |
object | Billing address (optional, falls back to shipping) |
email |
string | Customer email |
phone |
string | Customer phone |
note |
string | Order note printed on the slip |
curl -X POST https://dingpack.com/api/v1/jobs \
-H "Authorization: Bearer dp_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"order_number": "1042",
"customer_name": "Jamie Reynolds",
"email": "jamie@example.com",
"line_items": [
{
"title": "Blue T-Shirt",
"variant_title": "Large / Blue",
"quantity": 2,
"sku": "TS-BLU-L",
"price": "24.99"
}
],
"shipping_address": {
"name": "Jamie Reynolds",
"address1": "123 Main St",
"city": "Austin",
"province": "TX",
"zip": "78701",
"country": "US"
},
"note": "Please gift wrap"
}'
const res = await fetch('https://dingpack.com/api/v1/jobs', {
method: 'POST',
headers: {
'Authorization': 'Bearer dp_your_api_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
order_number: '1042',
customer_name: 'Jamie Reynolds',
email: 'jamie@example.com',
line_items: [
{
title: 'Blue T-Shirt',
variant_title: 'Large / Blue',
quantity: 2,
sku: 'TS-BLU-L',
price: '24.99',
},
],
shipping_address: {
name: 'Jamie Reynolds',
address1: '123 Main St',
city: 'Austin',
province: 'TX',
zip: '78701',
country: 'US',
},
note: 'Please gift wrap',
}),
});
const job = await res.json();
console.log(job.id, job.status); // 42, "pending"
import requests
res = requests.post(
"https://dingpack.com/api/v1/jobs",
headers={"Authorization": "Bearer dp_your_api_key_here"},
json={
"order_number": "1042",
"customer_name": "Jamie Reynolds",
"email": "jamie@example.com",
"line_items": [
{
"title": "Blue T-Shirt",
"variant_title": "Large / Blue",
"quantity": 2,
"sku": "TS-BLU-L",
"price": "24.99",
}
],
"shipping_address": {
"name": "Jamie Reynolds",
"address1": "123 Main St",
"city": "Austin",
"province": "TX",
"zip": "78701",
"country": "US",
},
"note": "Please gift wrap",
},
)
job = res.json()
print(job["id"], job["status"]) # 42, pending
$payload = json_encode([
'order_number' => '1042',
'customer_name' => 'Jamie Reynolds',
'line_items' => [
['title' => 'Blue T-Shirt', 'quantity' => 2, 'price' => '24.99'],
],
'shipping_address' => [
'name' => 'Jamie Reynolds', 'address1' => '123 Main St',
'city' => 'Austin', 'province' => 'TX', 'zip' => '78701', 'country' => 'US',
],
]);
$ch = curl_init('https://dingpack.com/api/v1/jobs');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer dp_your_api_key_here',
'Content-Type: application/json',
],
]);
$job = json_decode(curl_exec($ch), true);
echo $job['id'] . ' ' . $job['status']; // 42 pending
Response 201 Created
{
"id": 42,
"status": "pending",
"order_number": "1042",
"created_at": "2026-06-04T14:32:01.000Z",
"message": "Print job queued. Your agent will pick it up within 5 seconds."
}
/api/v1/jobs
Returns your most recent print jobs, newest first.
Query parameters
| Param | Type | Description |
|---|---|---|
limit |
integer | Number of jobs to return (default 20, max 100) |
status |
string | Filter by status: pending · printed · failed |
curl "https://dingpack.com/api/v1/jobs?limit=5&status=printed" \
-H "Authorization: Bearer dp_your_api_key_here"
Response
{
"jobs": [
{
"id": 42,
"order_number": "1042",
"status": "printed",
"attempts": 1,
"created_at": "2026-06-04T14:32:01.000Z",
"printed_at": "2026-06-04T14:32:06.000Z"
}
],
"count": 1
}
/api/v1/jobs/:id
Retrieve a single job by its ID. Useful for polling status after queuing.
curl https://dingpack.com/api/v1/jobs/42 \
-H "Authorization: Bearer dp_your_api_key_here"
Response
{
"id": 42,
"order_number": "1042",
"status": "printed",
"attempts": 1,
"created_at": "2026-06-04T14:32:01.000Z",
"printed_at": "2026-06-04T14:32:06.000Z"
}
status changes from pending to printed or failed. Jobs typically process within 5 seconds.
Objects
Job Object
| Field | Type | Description |
|---|---|---|
id | integer | Unique job ID |
order_number | string | The order number provided when creating the job |
status | string | pending · printed · failed · duplicate |
attempts | integer | Number of print attempts made by the agent |
created_at | string (ISO 8601) | When the job was queued |
printed_at | string (ISO 8601) · nullable | When the agent confirmed printing |
Address Object
Used for shipping_address and billing_address. All fields optional.
| Field | Type | Description |
|---|---|---|
name | string | Recipient name |
address1 | string | Street address line 1 |
address2 | string | Apt, suite, unit, etc. |
city | string | City |
province | string | State or province code (e.g. TX) |
zip | string | Postal / ZIP code |
country | string | Country code (e.g. US) |
phone | string | Phone number |
Line Item Object
| Field | Type | Description |
|---|---|---|
title required |
string | Product name |
quantity | integer | Quantity ordered (default 1) |
variant_title | string | Variant label (e.g. Large / Blue) |
sku | string | SKU or product code |
price | string | Unit price (e.g. "24.99") |
grams | integer | Weight in grams |
Ready to start printing?
API access is included in the Pro plan — $29/store/month.
Get started with Pro30-day money-back guarantee · Cancel anytime