Authentication and base URL
Create a key on the API page of the app (owners and admins only). The key starts with nck_live_ and is shown once, so store it in your secrets manager. Send it in the Authorization header of every request.
curl https://nochargeback.com/api/v1/accounts \
-H "Authorization: Bearer nck_live_YOUR_KEY"
-
Base URL is https://nochargeback.com/api/v1
-
Up to 10 active keys per workspace. A revoked key stops working at once.
-
Keys work only while the workspace is on Scale or Enterprise. After a downgrade every request gets 403 with the code plan_required.
-
The API never returns Stripe keys, webhook secrets or API keys.
Rate limit
Each key can make 60 requests a minute. Over the limit you get 429 with the code rate_limited and the headers X-RateLimit-Limit, X-RateLimit-Remaining and Retry-After.
Errors
Errors use one shape with a machine readable code and a message.
{
"error": {
"code": "not_found",
"message": "No dispute with this id in your workspace."
}
}
| HTTP status | Code | Meaning |
|---|---|---|
| 401 | unauthenticated | Missing, unknown or revoked key |
| 403 | plan_required | The workspace plan does not include API access |
| 404 | not_found | The dispute is not in your workspace, or the endpoint does not exist |
| 402 | plan_required or limit_reached | Evidence packs need a plan, or the monthly dispute limit is used up |
| 409 | pack_not_ready | Build the evidence pack first and wait until it is ready |
| 422 | invalid_request or submit_failed | A field failed validation (see fields), or Stripe did not accept the evidence |
| 429 | rate_limited | More than 60 requests a minute with one key |
List connected accounts
GET /api/v1/accounts returns the Stripe accounts connected to your workspace.
curl https://nochargeback.com/api/v1/accounts -H "Authorization: Bearer nck_live_YOUR_KEY"
{
"data": [
{"id": 12, "provider": "stripe", "label": "Main store", "external_id": "acct_1Example", "status": "active", "livemode": true, "last_synced_at": "2026-10-14T09:30:00Z"}
]
}
List disputes
GET /api/v1/disputes returns disputes and inquiries, newest first. Optional query parameters are status (for example needs_response), reason (for example fraudulent), account (connected account id), since (date, filters on the opening date), limit (1 to 100, default 25) and page.
curl "https://nochargeback.com/api/v1/disputes?status=needs_response&limit=50" \
-H "Authorization: Bearer nck_live_YOUR_KEY"
{
"data": [
{
"id": 481, "external_id": "du_1Example", "account_id": 12, "charge_id": "ch_1Example",
"amount": 8500, "currency": "usd", "reason": "product_not_received", "network_reason_code": "13.1",
"card_brand": "visa", "status": "needs_response", "is_inquiry": false, "outcome": null,
"evidence_due_by": "2026-10-21T23:59:59Z", "opened_at": "2026-10-14T08:12:00Z", "closed_at": null
}
],
"meta": {"page": 1, "limit": 50, "has_more": false}
}
Amounts are in the smallest currency unit, so 8500 is 85.00 USD.
Get one dispute with its evidence pack
GET /api/v1/disputes/{id} returns the dispute, the evidence you added and the latest evidence pack. The letter states only facts found in the pack. letter_claims lists the evidence the letter states, missing_evidence lists what the reason code expects but the pack does not hold.
curl https://nochargeback.com/api/v1/disputes/481 -H "Authorization: Bearer nck_live_YOUR_KEY"
{
"data": {
"id": 481, "external_id": "du_1Example", "status": "needs_response", "network_reason_code": "13.1",
"merchant_evidence": {"carrier": "UPS", "tracking_number": "1Z999AA10123456784", "delivered_on": "2026-10-13"},
"evidence_pack": {
"id": 902, "version": 2, "status": "ready", "confidence": 33.33, "win_chance": 41,
"letter_text": "We are responding to the dispute filed under Visa reason code 13.1 ...",
"letter_claims": ["delivery_tracking", "receipt", "authorization_record"],
"missing_evidence": ["refund_policy", "logged_in_after", "usage_logs"],
"limit_reached": false, "submitted_at": null, "submit_error": null, "updated_at": "2026-10-14T09:31:00Z"
}
}
}
Add evidence you hold
PUT /api/v1/disputes/{id}/evidence stores the evidence your own systems hold. The body replaces what was stored before. Fields, all optional, are carrier, tracking_number, delivered_on (YYYY-MM-DD, needs tracking_number), activity (one event per line starting with the date, lines with a sign in or login count as sign ins), terms_accepted_on (YYYY-MM-DD), refund_policy (text) and messages (one message per line starting with the date). Lines without a date are left out and counted in skipped_lines. If the dispute already has an evidence pack that was not submitted, it is rebuilt with the new evidence.
curl -X PUT https://nochargeback.com/api/v1/disputes/481/evidence \
-H "Authorization: Bearer nck_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"carrier": "UPS", "tracking_number": "1Z999AA10123456784", "delivered_on": "2026-10-13", "messages": "2026-10-12 Order shipped email"}'
{
"data": {
"merchant_evidence": {"carrier": "UPS", "tracking_number": "1Z999AA10123456784", "delivered_on": "2026-10-13", "messages": "2026-10-12 Order shipped email"},
"skipped_lines": 0,
"pack_rebuilding": true
}
}
Build the evidence pack
POST /api/v1/disputes/{id}/pack builds the evidence pack, or rebuilds it with the latest data. The first pack of a dispute uses one dispute from your monthly allowance; rebuilds do not. The answer is 202 and the pack is ready in about a minute, read it with GET /api/v1/disputes/{id}.
curl -X POST https://nochargeback.com/api/v1/disputes/481/pack -H "Authorization: Bearer nck_live_YOUR_KEY"
{"data": {"queued": true, "building": true}}
Submit the evidence to Stripe
POST /api/v1/disputes/{id}/submit sends the latest ready pack to Stripe. Stripe accepts one final submission per dispute, so submit only when the pack holds everything you have. The connected key needs Disputes write.
curl -X POST https://nochargeback.com/api/v1/disputes/481/submit -H "Authorization: Bearer nck_live_YOUR_KEY"
{"data": {"submitted": true, "message": "Evidence submitted to Stripe.", "evidence_pack": {"id": 902, "status": "submitted", "submitted_at": "2026-10-14T09:40:00Z"}}}
List alerts
GET /api/v1/alerts returns Stripe early fraud warnings and issuer inquiries, newest first. Optional query parameters are type (all, efw or inquiry), since (date) and limit (1 to 100, default 50).
curl "https://nochargeback.com/api/v1/alerts?type=efw" -H "Authorization: Bearer nck_live_YOUR_KEY"
{
"data": [
{"type": "early_fraud_warning", "id": 77, "external_id": "issfr_1Example", "account_id": 12, "charge_id": "ch_1Example",
"fraud_type": "unauthorized_use_of_card", "amount": 4900, "currency": "usd", "recommendation": "refund_now",
"decision": null, "created_at": "2026-10-14T07:02:00Z"}
]
}
Get the chargeback ratio
GET /api/v1/ratio returns the latest monthly snapshot for each connected account, with sales, disputes, fraud warnings and the Visa and Mastercard ratio in percent.
curl https://nochargeback.com/api/v1/ratio -H "Authorization: Bearer nck_live_YOUR_KEY"
{
"data": [
{"account_id": 12, "label": "Main store", "month": "2026-10", "sales_count": 4849, "dispute_count": 2, "efw_count": 1,
"ratio_visa_percent": 0.0619, "ratio_mastercard_percent": 0.0412, "level": "ok", "updated_at": "2026-10-14T06:00:00Z"}
]
}
Which plans include the API
API access is part of the Scale plan (799 USD a month, or 399 USD a month billed yearly) and the Enterprise plan. Starter and Growth use the same features in the app. See pricing and how NoChargeback works with Stripe.