invalid_requestFix the JSON body before sending again; do not repeat an unchanged request.
Generate SVG or PNG data URL QR codes from links or text. Quota is counted by request.
Authorization: Bearer ecw_live_...
X-API-Key: ecw_live_...X-Quota-Limit: 1000
X-Quota-Remaining: 997
X-RateLimit-Limit: 30Idempotency-Key: order-sync-2026-06-14-001Scope: tools:gtin:generateECOMWITH_API_KEY=ecw_live_...Error responses use error.code and error.message. Handle the status and code first, then decide whether to wait or retry the same business request with its original Idempotency-Key.
invalid_requestFix the JSON body before sending again; do not repeat an unchanged request.
authentication_required / invalid_api_keyCheck Authorization: Bearer or X-API-Key; never put the full key in error logs.
membership_required / insufficient_scopeCheck the current plan and the key scope; a scope cannot increase membership quota.
idempotency_conflict / idempotency_in_progressKeep one key for the same business request; stop on conflict, or wait and retry an active request with the same key.
payload_too_largeReduce the request body to the current plan payload limit before sending again.
quota_exceeded / rate_limited / concurrency_limitedRead X-Quota-*, X-RateLimit-*, and Retry-After; stop at zero quota and wait for rate or concurrency limits.
| Status | error.code | Next step |
|---|---|---|
| 400 | invalid_request | Fix the JSON body before sending again; do not repeat an unchanged request. |
| 401 | authentication_required / invalid_api_key | Check Authorization: Bearer or X-API-Key; never put the full key in error logs. |
| 403 | membership_required / insufficient_scope | Check the current plan and the key scope; a scope cannot increase membership quota. |
| 409 | idempotency_conflict / idempotency_in_progress | Keep one key for the same business request; stop on conflict, or wait and retry an active request with the same key. |
| 413 | payload_too_large | Reduce the request body to the current plan payload limit before sending again. |
| 429 | quota_exceeded / rate_limited / concurrency_limited | Read X-Quota-*, X-RateLimit-*, and Retry-After; stop at zero quota and wait for rate or concurrency limits. |
Error response shape
{"object":"tool_api.error","error":{"code":"invalid_request","message":"Request body must be a JSON object."}}Limits are calculated from the current membership tier of the API key owner. Minute limits are counted separately for each API key and tool; requests beyond the limit return 429 rate_limited. Send requests sequentially and treat quota and rateLimit in each response as the source of truth.
| Plan | API access | Daily quota | Per request | Per minute | How to use it |
|---|---|---|---|---|---|
| Basic | Not included in API access today | Unavailable | Unavailable | Unavailable | If the API returns membership_required, stop and check the account plan. |
| Pro | Included | 500 requests | 1 QR code | 60 requests | One request generates one QR code and does not use a quantity field. Stop requests when quota.remaining is 0. |
| Max | Included | 5,000 requests | 1 QR code | 200 requests | One request generates one QR code and does not use a quantity field. Stop requests when quota.remaining is 0. |
Send Requests Sequentially
For the same API key and tool, Ecomwith handles one request at a time. If the API returns 429 concurrency_limited, wait for the previous request to finish and retry with the same Idempotency-Key.
You are my automation agent. Use the Ecomwith Tool API to call the QR Code API, and never print the full API key in logs, chat, or error messages.
Authentication:
- Read the secret from the ECOMWITH_API_KEY environment variable.
- Send Authorization: Bearer <ECOMWITH_API_KEY>.
Request:
- Endpoint: POST https://ecomwith.com/api/v1/tools/qrcode/generate
- Headers: Content-Type: application/json
- Body example: {"text":"https://example.com","format":"svg","size":300}
- One request generates one QR code and does not use a quantity field.
Current limits:
- Pro: 500 requests per day, 1 QR code per request, up to 60 requests per minute.
- Max: 5,000 requests per day, 1 QR code per request, up to 200 requests per minute.
- Basic does not include API access today. If the API returns membership_required, stop and ask me to check the plan.
Quota and rate-limit handling:
- Read quota.remaining and rateLimit.remaining from every response.
- If quota.remaining is 0, stop requests.
- Do not call the same tool concurrently. Wait for the previous request to finish before sending the next one.
- If the API returns 429 concurrency_limited, wait for the previous request to finish and retry with the same Idempotency-Key.
- If the API returns 429 rate_limited, wait before retrying. If it returns 429 quota_exceeded, stop and report that quota is exhausted.
Safe retries:
- Generate one stable Idempotency-Key for each business task, for example qr-product-page-123.
- On a network timeout or 5xx response, retry with the same Idempotency-Key. Do not switch to a new key.
- Do not automatically retry 400, 401, or 403 responses.
- If the API returns 409 idempotency_conflict, the same key was used with a different request body. Stop and ask me to confirm.
On success, return qrcode.dataUrl, format, quota.remaining, and rateLimit.remaining.curl -X POST https://ecomwith.com/api/v1/tools/qrcode/generate \
-H "Authorization: Bearer $ECOMWITH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: qr-001" \
-d '{"text": "https://example.com", "format": "svg", "size": 300}'