Errors & Troubleshooting
Every MultiCartAPI response arrives as HTTP 200 — business-logic errors are signalled by status: 0 inside the
envelope, not by the HTTP status code. This page covers the most common failure patterns and how to resolve them.
Always check status, not HTTP code
Never branch on the HTTP status code for API errors. Always read body.status (1 = success, 0 = failure)
and body.code for the intended error class. The sole exceptions are the file-streaming endpoints
(/results/... and /users/payments/.../invoice.pdf), which return raw bytes with no envelope.
Error response shape
When a call fails, the envelope looks like this:
{
"code": 402,
"data": "Not enough credits — you need 250 but have 12 remaining.",
"status": 0
}
code carries the intended HTTP-style error class. data is a human-readable string explaining the specific
problem. The outer HTTP status is always 200.
Common errors quick reference
| Symptom | code / indicator | Cause | Fix |
|---|---|---|---|
"Not enough credits" in data, status: 0 | 402 | Your credit balance is lower than the number of items in the collection. | Top up credits or reduce the collection size. See insufficient credits. |
"Insufficient Credits" in data.output.error, status: 1 | Playground-specific | No credits when using the Playground endpoint. | Same as above — check your credit balance. |
"Zipcode already exists" or "ASIN already exists" in data | 409 for the postcode; status: 0 for the ASIN | Duplicate postcode for that domain, or duplicate ASIN+domain+postcode combo in the same collection. | See duplicate conflicts. |
"No cookie file found" or similar in data | 400 | A category scrape was submitted for a domain+postcode that has no active cookie yet. | Add the postcode first and wait for it to reach active status. See missing cookie. |
Any other status: 0 response | varies | Validation error, not-found, server error, etc. | Read data — it always contains a plain-English explanation. See generic failures. |
Insufficient credits (402)
Collection run
When you call POST /api/v1/schedules/run/result/ the API gates on your credit balance before queuing
anything. If available_credits - used_credits - frozen_credits is less than the number of items in the
collection, the run is rejected immediately.
Response:
{
"code": 402,
"data": "Not enough credits — you need 250 but have 12 remaining.",
"status": 0
}
Fix:
- Check your balance with
POST /api/v1/users/credits/. - Either upgrade your plan, wait for your credit period to reset, or reduce the collection size before re-running.
Playground endpoint
The Playground (POST /api/v1/playground/post/) behaves differently. It returns status: 1 (success envelope)
but the credit check failure is buried inside the output payload:
{
"code": 200,
"data": {
"type": "json",
"output": {
"error": "Insufficient Credits"
}
},
"status": 1
}
Fix: Check data.output.error after every Playground call. If it equals "Insufficient Credits" your
balance is zero — replenish credits before continuing.
Playground credit check is in data.output.error
The Playground does not return status: 0 for a credit failure. Your integration must explicitly check
data.output.error — a truthy outer status does not mean the scrape succeeded.
Duplicate conflicts (409)
The API rejects two classes of duplicate:
Duplicate postcode
If you call POST /api/v1/zipcodes/create-zipcode/ with a postcode that already exists for that user +
domain combination, you receive:
{
"code": 409,
"data": "Zipcode already exists for this domain.",
"status": 0
}
Fix: Fetch your existing postcodes with POST /api/v1/zipcodes/get-zipcodes/ and reuse the existing
record's id — no need to create a duplicate.
Duplicate ASIN
If you add an ASIN via POST /api/v1/schedules/amazon/asin/create/ and the exact combination of
collection + domain + customer_postcode + asin already exists, the request is rejected as a
duplicate. The response returns status: 0 with an explanatory message in data:
{
"data": "ASIN already exists in this collection.",
"status": 0
}
Fix: Each ASIN entry is unique per collection + domain + postcode tuple. If you need the same ASIN
scraped against a different postcode, create a separate entry with that postcode's zipcode ID. When bulk
uploading via /asin/create/multiple/, duplicate rows are reported in data.error_rows — the remaining
rows still succeed.
Missing cookie for category scrape (400)
Amazon category scrapes (POST /api/v1/schedules/amazon/category/add_schedule/) require a valid cookie
file for the requested domain + postcode before the job can be queued. If no active cookie exists, the
endpoint returns:
{
"code": 400,
"data": "No cookie file found for domain amazon.com.au postcode 4500. Please add the postcode and wait for it to become active.",
"status": 0
}
What causes this: Cookie files are generated asynchronously after you add a postcode. Submitting a category scrape before cookie generation finishes (or for a postcode you haven't added yet) triggers this error.
Fix:
- Add the postcode if you haven't already —
POST /api/v1/zipcodes/create-zipcode/. - Poll
POST /api/v1/zipcodes/get-zipcodes/until the postcode'sstatusfield is"active". - Retry the category scrape.
Cookie generation takes a moment
After adding a new postcode for an Amazon domain, status starts as "in-progress". Generation
typically completes within a minute or two. Do not submit category scrapes until the postcode is "active".
See Postcodes for a full explanation of postcode statuses, and Category Scrape Guide for the end-to-end workflow.
Generic status: 0 failures
For any other status: 0 response, read the data field — it always contains a plain-English description
of what went wrong. Common examples:
| code | Typical data message | Meaning |
|---|---|---|
| 400 | "This field is required." | A required body parameter is missing or invalid. |
| 400 | "Invalid postcode format." | The postcode value does not match the domain's expected format. |
| 404 | "Collection not found." | The collection_id or schedule_id does not exist or belongs to another account. |
| 500 | "An unexpected error occurred." | Server-side error — retry after a moment; contact support if persistent. |
General debugging checklist:
- Confirm
body.status === 0before treating a response as an error. - Log
body.codeandbody.data— they are always populated on failure. - Check that you are passing the correct field names — several endpoints have subtle naming differences
(for example,
schedule_idvscollection_id). See the API Reference for exact field names per endpoint. - Verify your
x-api-keyheader is present and correct on every authenticated call.
Error Logs in the dashboard
The dashboard includes a dedicated Error Logs view that surfaces scraping-level errors (for example, a postcode cookie that failed to regenerate, or a domain-level scrape failure). These are distinct from API-level errors and provide more detail about what happened during individual scrape runs.
View Error Logs