logo

Rate Limits & Quotas

ReferenceUpdated 2026-06-20

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

LimitValueNotes
Items per collection5,000Amazon ASINs or Officeworks SKUs. Enforced at create time — the 5,001st item is rejected.
Bulk CSV max rows5,000Applies to both /amazon/asin/create/bulk/ and /officeworks/sku/create/bulk/.
Multiple-create inputComma-separated listPass asins or skus as a single comma-separated string — no array needed.
List pagination default — limit100 (ASINs) / 20 (SKUs)Override with the limit body param. No hard cap documented, but keep pages reasonable.
List pagination default — skip0Zero-indexed offset. Increment by limit to page through results.
Concurrent scrape pages~20The worker fleet processes roughly 20 browser pages in parallel across all jobs.
OTP / verification codes3 per email per 15 minApplies to both registration OTPs and password-reset OTPs.
Mass-delete batch size50 collectionsSee 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:

EndpointDefault limitDefault skip
/schedules/amazon/asin/list/1000
/schedules/officeworks/sku/list/200
/schedules/collections/results/download/5 (runner records)0
/schedules/amazon/asin/output/list/1000

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 (HighestLowest), 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")