invalid_requestFix the JSON body before sending again; do not repeat an unchanged request.
Apply one UTM parameter set to one or many landing page URLs. Optional id and sourcePlatform values are emitted as utm_id and utm_source_platform. Quota is counted by successfully built links.
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 | 1,000 links | Up to 100 links | 60 requests | urls is the batch link list. Building 10 successful links consumes 10 link units. Stop or split the request when quota.remaining is lower than the link count. |
| Max | Included | 10,000 links | Up to 500 links | 200 requests | urls is the batch link list. Building 10 successful links consumes 10 link units. Stop or split the request when quota.remaining is lower than the link count. |
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 UTM Builder API, and never print the full API key.
Authentication:
- Read ECOMWITH_API_KEY from the environment.
- Send Authorization: Bearer <ECOMWITH_API_KEY>.
Request:
- Endpoint: POST https://ecomwith.com/api/v1/tools/utm-builder/build
- Body example: {"urls":["https://example.com/a","https://example.com/b"],"source":"meta","medium":"paid_social","campaign":"summer_launch","content":"adset_ad","term":"audience","id":"campaign-42","sourcePlatform":"meta_ads"}
- Building 10 successful links consumes 10 link units. URLs returned in invalid do not consume quota.
Current limits:
- Pro: 1,000 links per day, up to 100 links per request, up to 60 requests per minute.
- Max: 10,000 links per day, up to 500 links per request, up to 200 requests per minute.
Rules:
- Send requests sequentially. Do not call the same tool concurrently.
- Use one stable Idempotency-Key per business batch, for example utm-campaign-2026-06-17-batch-1.
- Handle concurrency_limited, rate_limited, quota_exceeded, and idempotency_conflict by stopping or retrying according to the code.
On success, return links, invalid, quota.remaining, and rateLimit.remaining.curl -X POST https://ecomwith.com/api/v1/tools/utm-builder/build \
-H "Authorization: Bearer $ECOMWITH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: utm-batch-001" \
-d '{"urls":["https://example.com/a","https://example.com/b"],"source":"meta","medium":"paid_social","campaign":"summer_launch","content":"adset_ad","term":"audience","id":"campaign-42","sourcePlatform":"meta_ads"}'