Docs
Credits

List the credit ledger

GEThttps://api.norreach.app/v1/credits/ledger

Every grant and charge, newest first: what was charged, how much (charges are negative), how many units (minutes, segments, actions) and what it was for when that is something the API knows (a call, a message, an ad launch …). Filter by kind, action and a day range (from / to, UTC, at most 366 days). Owners and admins.

billing:readRole must allow: billing.viewOperation id: list_credit_ledger
GET/credits/ledger
curl -X GET "https://api.norreach.app/v1/credits/ledger" \
  -H "Authorization: Bearer $NORREACH_API_KEY"
List the credit ledger
{
  "object": "list",
  "data": [
    {
      "id": "9c8b7a6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
      "object": "credit_ledger_entry",
      "kind": "debit",
      "action": "call.minute",
      "label": "AI call minutes",
      "amount": {
        "credits": -30,
        "exact": "-30"
      },
      "units": 2.5,
      "ref": {
        "object": "call",
        "id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e"
      },
      "created_at": "2026-11-04T10:12:00.000Z"
    }
  ],
  "has_more": true,
  "next_cursor": "eyJ2IjoiMjAyNi0xMS0wNFQxMDoxMjowMC4wMDBaIiwiaSI6IjljOGI3YTZkIn0"
}

Authorizations

Authorizationstringheaderrequired

Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope billing:read. API keys and scopes

Query parameters

limitintegerquery

Page size (1–200, default 50).

cursorstringquery

The next_cursor of the previous page.

kindenumquery
One of:grantdebitadjustrefund
actionstringquery

Only this action (email.send, call.minute …).

fromstring (date)query

First day (YYYY-MM-DD, UTC; default 29 days before to).

tostring (date)query

Last day (YYYY-MM-DD, UTC; default today).

Response

200application/json— List the credit ledger

object"list"required
dataobject[]required
Show child attributes
data[].idstring (uuid)required

An id (UUID).

data[].object"credit_ledger_entry"required
data[].kindenumrequired

grant, debit (a charge), adjust or refund.

One of:grantdebitadjustrefund
data[].actionstring | nullrequired

What was charged (email.send, call.minute …).

data[].labelstring | nullrequired
data[].amountobjectrequired

Signed: charges are negative.

Show child attributes
data[].amount.creditsintegerrequired

Whole credits (rounded half away from zero).

data[].amount.exactstringrequired

The exact amount as a decimal string — a per-minute charge can hold a fraction of a credit.

data[].unitsnumber | nullrequired

How many units were charged (minutes, segments, actions).

data[].refobject | nullrequired

What the charge was for, when it points at something the API knows.

data[].created_atstringrequired

RFC 3339 UTC timestamp with milliseconds.

has_morebooleanrequired
next_cursorstring | nullrequired

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
400invalid_cursorThat cursor doesn't belong to this list.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
403role_forbiddenThe key's creator's role can't do this.
422validation_failedThe request has invalid fields.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.