Create Bulk Upload
curl --request POST \
--url https://api.zinc.com/orders/bulk \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"filename": "<string>",
"rows": [
{}
],
"notify_on_complete": false
}
'import requests
url = "https://api.zinc.com/orders/bulk"
payload = {
"filename": "<string>",
"rows": [{}],
"notify_on_complete": False
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({filename: '<string>', rows: [{}], notify_on_complete: false})
};
fetch('https://api.zinc.com/orders/bulk', 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.zinc.com/orders/bulk",
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([
'filename' => '<string>',
'rows' => [
[
]
],
'notify_on_complete' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.zinc.com/orders/bulk"
payload := strings.NewReader("{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.zinc.com/orders/bulk")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/orders/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"row_count": 123,
"placed_count": 123,
"failed_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"filename": "<string>",
"notify_on_complete": false,
"notified_at": "2023-11-07T05:31:56Z",
"rows": [
{
"index": 123,
"status": "<string>",
"order_id": "<string>",
"order_status": "<string>",
"error": "<string>",
"recipient": "<string>",
"product_urls": [
"<string>"
],
"passthrough": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Bulk Orders
Create Bulk Upload
Place many orders at once by uploading a CSV batch to the Zinc API.
POST
/
orders
/
bulk
Create Bulk Upload
curl --request POST \
--url https://api.zinc.com/orders/bulk \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"filename": "<string>",
"rows": [
{}
],
"notify_on_complete": false
}
'import requests
url = "https://api.zinc.com/orders/bulk"
payload = {
"filename": "<string>",
"rows": [{}],
"notify_on_complete": False
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({filename: '<string>', rows: [{}], notify_on_complete: false})
};
fetch('https://api.zinc.com/orders/bulk', 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.zinc.com/orders/bulk",
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([
'filename' => '<string>',
'rows' => [
[
]
],
'notify_on_complete' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.zinc.com/orders/bulk"
payload := strings.NewReader("{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.zinc.com/orders/bulk")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zinc.com/orders/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"filename\": \"<string>\",\n \"rows\": [\n {}\n ],\n \"notify_on_complete\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending",
"row_count": 123,
"placed_count": 123,
"failed_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"filename": "<string>",
"notify_on_complete": false,
"notified_at": "2023-11-07T05:31:56Z",
"rows": [
{
"index": 123,
"status": "<string>",
"order_id": "<string>",
"order_status": "<string>",
"error": "<string>",
"recipient": "<string>",
"product_urls": [
"<string>"
],
"passthrough": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Create a bulk-upload batch from parsed CSV rows. The batch is accepted
immediately and its rows are placed as individual orders asynchronously.
Validate the upload first with
Validate Bulk Upload — it
reports per-row errors and estimated spend without placing anything.
Request
The request body is identical to the validate endpoint:- filename (optional) — Original uploaded filename, for display.
- rows — Array of objects, one per CSV row, mapping column header to cell value.
product_urls may list at most 10
products — a row with more fails validation with
Order cannot contain more than 10 items. A batch itself may contain at most
500 rows.
Unrecognized columns are preserved as passthrough data on each row and
echoed back in the results CSV.
Response
Returns the new batch withstatus: "pending". Track progress by polling
Get Bulk Upload:
- id — Batch UUID.
- status —
pending→processing→completed(orfailed). - row_count / placed_count / failed_count — Row tallies, updated as rows are processed.
Authorizations
Zinc API key (Bearer zn_...)
Headers
Body
application/json
Raw CSV rows (header -> cell) posted from the dashboard.
Original uploaded filename, for display.
Parsed CSV rows, each a mapping of column header to cell value.
Email the account holder once every order in this batch has reached a terminal state (placed, failed, or cancelled).
Response
Successful Response
A bulk-upload batch and (on the detail endpoint) its per-row results.
Lifecycle of a CSV bulk-upload batch.
Available options:
pending, processing, completed, failed Show child attributes
Show child attributes

