Billing summary

Overview

Get the current period's charges in brief: total, active locations, and any overage.

Use this for a billing header.

You'll need a partner token.

Returns the summary.

Prerequisites

  • A Partner bearer token. See Authentication.
  • Optional: a year and month. Leave them out for the current month.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/partner/billing/overview

Authentication

Partner token

  • Only partner and sub-partner users can call it. Any other token gets 403 (Authenticated user is not associated with an partner.).
  • It always covers your own partner: the accounts directly under it. There is no id to send.

Rate limit

120 requests per minute, counted per user (the token’s user). See Rate limits.

Request parameters

ParameterInTypeRequiredDescription
yearqueryintegerNoBilling year, 2000 to 2100. Defaults to the current year.
monthqueryintegerNoBilling month, 1 to 12. Defaults to the current month.

Request body

None.

Request payload

None.

Response body

The payload is nested one level deeper than usual: it sits in data.data.

FieldTypeDescription
data.dataobjectThe billing summary.
data.data.total_billednumberTotal charged to your accounts for the period, to 2 decimals.
data.data.periodstringThe billing period, as YYYY-MM.
data.data.billing_modelstring or nullYour partner's billing model: plan-based or usage-based. null when not set.
data.data.contract_modelstring or nullYour partner's contract model: model-a (overage is charged) or model-b (a flat rate per location, hard stop, no overage). null when not set.
data.data.active_storesintegerActive and pending locations across your accounts.
data.data.accountsarray of objectsOne row per account directly under your partner.
data.data.accounts[].account_idintegerThe account's id.
data.data.accounts[].account_namestringThe account's name.
data.data.accounts[].plan_namestring or nullName of the account's latest plan, or null when it has none.
data.data.accounts[].store_countintegerThe account's active and pending locations.
data.data.accounts[].costnumberCharges for the period, excluding overage, to 2 decimals.
data.data.accounts[].overagenumberOverage charges for the period, to 2 decimals.
data.data.accounts[].statusstringhalted when a location hit a hard limit in the period, overage when there are overage charges, otherwise within_limits.

Response payload

{
  "data": {
    "data": {
      "total_billed": 40.44,
      "period": "2026-09",
      "billing_model": "usage-based",
      "contract_model": "model-a",
      "active_stores": 2,
      "accounts": [
        {
          "account_id": 5994,
          "account_name": "Acme Coffee",
          "plan_name": "Growth",
          "store_count": 2,
          "cost": 40.0,
          "overage": 0.44,
          "status": "overage"
        }
      ]
    }
  }
}

Examples

Success payload

See Response payload.

Error payload

403 Not a partner

{
  "message": "Forbidden",
  "status": "error",
  "errors": "Authenticated user is not associated with an partner."
}

422 Invalid period

{
  "message": "The year field must be at least 2000. (and 1 more error)",
  "errors": {
    "year": [
      "The year field must be at least 2000."
    ],
    "month": [
      "The month field must not be greater than 12."
    ]
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200The billing summary.
401The token is missing, expired or invalid.
403The caller isn't a partner or sub-partner user.
422year is outside 2000 to 2100, or month is outside 1 to 12.
429More than 120 requests in a minute from this user.
500Unexpected server error.

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/partner/billing/overview?year=2026&month=9" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?