Rate Limits & Quotas
MultiCartAPI enforces a small set of hard limits to keep the scraping cluster responsive for all users. Understanding them upfront will save you from unexpected errors mid-integration.
Platform limits at a glance
| Limit | Value | Notes |
|---|---|---|
| Items per collection | 5,000 | Amazon ASINs or Officeworks SKUs. Enforced at create time — the 5,001st item is rejected. |
| Bulk CSV max rows | 5,000 | Applies to both /amazon/asin/create/bulk/ and /officeworks/sku/create/bulk/. |
| Multiple-create input | Comma-separated list | Pass asins or skus as a single comma-separated string — no array needed. |
| List pagination default — limit | 100 (ASINs) / 20 (SKUs) | Override with the limit body param. No hard cap documented, but keep pages reasonable. |
| List pagination default — skip | 0 | Zero-indexed offset. Increment by limit to page through results. |
| Concurrent scrape pages | ~20 | The worker fleet processes roughly 20 browser pages in parallel across all jobs. |
| OTP / verification codes | 3 per email per 15 min | Applies to both registration OTPs and password-reset OTPs. |
| Mass-delete batch size | 50 collections | See guidance below — never pass thousands of IDs in a single call. |
Checking item count before a run
Before calling /schedules/run/result/ you should confirm that all your items have finished ingesting. Use the with_count flag on the list endpoint with limit=1 — it returns the total count without fetching all rows:
curl https://multicartapi.com/api/v1/schedules/amazon/asin/list/ \
-X POST \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"collection_id": 101, "with_count": 1, "limit": 1}'When with_count is present the response wraps the data differently from a normal list:
{
"code": 200,
"data": {
"total_count": 250,
"asin_list": [{ "id": 5, "asin": "B0DJQQ38TG", ... }]
},
"status": 1
}
Poll until total_count matches the number of items you submitted before triggering the run.
Pagination
All list endpoints support skip and limit in the request body:
| Endpoint | Default limit | Default skip |
|---|---|---|
| /schedules/amazon/asin/list/ | 100 | 0 |
| /schedules/officeworks/sku/list/ | 20 | 0 |
| /schedules/collections/results/download/ | 5 (runner records) | 0 |
| /schedules/amazon/asin/output/list/ | 100 | 0 |
Increment skip by limit to walk through pages:
{ "collection_id": 101, "skip": 0, "limit": 100 }
{ "collection_id": 101, "skip": 100, "limit": 100 }
{ "collection_id": 101, "skip": 200, "limit": 100 }
Bulk CSV format
Both Amazon and Officeworks bulk endpoints accept a CSV file upload (multipart/form-data, field name csv). Column names differ by supplier — use the exact headers below:
Amazon (/schedules/amazon/asin/create/bulk/)
domain,customer_postcode,asin,include_raw_html
amazon.com.au,4500,B0DJQQ38TG,false
amazon.com.au,4500,B0ABCD1234,false
Officeworks (/schedules/officeworks/sku/create/bulk/)
sku,customer_postcode,store_id
JBMS310BK,4500,W411
HPLAP001,4500,W411
5,000-row limit applies per upload
If you have more than 5,000 items to load, split your CSV and upload in multiple batches. Each upload adds to the collection's existing items — the 5,000-item-per-collection ceiling still applies overall.
Multiple-create (comma-separated)
The asin/create/multiple/ and sku/create/multiple/ endpoints accept a plain comma-separated string rather than a JSON array. Pass domain and postcode by value, not by ID:
curl https://multicartapi.com/api/v1/schedules/amazon/asin/create/multiple/ \
-X POST \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"collection": 101,
"domain": "amazon.com.au",
"customer_postcode": "4500",
"asins": "B0DJQQ38TG,B0ABCD1234,B0XYZ99999"
}'The response reports how many items were accepted and lists any that failed:
{
"code": 200,
"data": {
"success_count": 2,
"error_rows": [
{ "asin": "B0XYZ99999", "error": "Duplicate item in this collection." }
]
},
"status": 1
}
Concurrency
The scraping cluster runs approximately 20 browser pages in parallel. All collections queued across all users share this pool — priority controls where your collection sits in the queue (Highest → Lowest), not how many pages are allocated to it.
There is no per-user concurrency limit. Jobs are dequeued as workers become free.
Mass-deleting collections
Batch deletions to avoid timeouts
/schedules/delete_multiple/ deletes each collection individually (one database commit per item). Passing thousands of IDs in a single call will time out. Send batches of 50 IDs at a time and wait for each batch to complete before sending the next.
import requests, time
API_KEY = "YOUR_API_KEY"
BASE = "https://multicartapi.com/api/v1"
ids_to_delete = list(range(1001, 1201)) # 200 collection IDs
BATCH = 50
for i in range(0, len(ids_to_delete), BATCH):
batch = ids_to_delete[i : i + BATCH]
resp = requests.post(
f"{BASE}/schedules/delete_multiple/",
headers={"x-api-key": API_KEY},
json={"schedule_ids": batch},
)
print(f"Batch {i // BATCH + 1}: deleted {resp.json()['data']} collections")