Billing for one location

Overview

Get a location's charges for the period, by capability.

Use this to explain one location's cost.

You'll need the store_id.

Returns the location's billing detail.

Prerequisites

  • A Partner bearer token. See Authentication.
  • The location's id (storeId). The location must be under your own partner.
  • 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/store/{storeId}

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.).
  • The location must exist (404 if not) and sit directly under your own partner. A sub-partner can open its own locations, but not its parent partner's or a sibling's (403).

Rate limit

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

Request parameters

ParameterInTypeRequiredDescription
storeIdpathintegerYesThe location's id. Digits only.
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, not data. The response has no billing_model or contract_model; use Billing summary for those.

FieldTypeDescription
data.dataobjectThe location's billing detail.
data.data.store_idintegerThe location's id.
data.data.store_namestringThe location's name.
data.data.periodstringThe billing period, as YYYY-MM.
data.data.featuresarray of objectsOne row per feature enabled on the account's plan. Empty when the account has no plan or no enabled features.
data.data.features[].feature_namestringThe feature, e.g. response_posting.
data.data.features[].usageintegerUnits the location used in the period.
data.data.features[].limitinteger or nullThe location's limit for the feature: the plan's service limit for usage-based billing, or its included units for plan-based billing. null when there's no limit.
data.data.features[].percentagenumber or nullusage as a percentage of limit, to 1 decimal. null when there is no limit.
data.data.features[].statusstringhalted when a hard limit was hit, hard_stop_over_limit or overage when usage is over the limit, approaching from 75%, otherwise within_limits.
data.data.features[].costnumberThe period's charges for the location and feature, to 2 decimals.

Response payload

{
  "data": {
    "data": {
      "store_id": 3007,
      "store_name": "Acme Coffee",
      "period": "2026-09",
      "features": [
        {
          "feature_name": "ai_response",
          "usage": 42,
          "limit": 50,
          "percentage": 84.0,
          "status": "approaching",
          "cost": 0.0
        },
        {
          "feature_name": "response_posting",
          "usage": 61,
          "limit": 50,
          "percentage": 122.0,
          "status": "overage",
          "cost": 0.44
        },
        {
          "feature_name": "review_widgets",
          "usage": 2,
          "limit": null,
          "percentage": null,
          "status": "within_limits",
          "cost": 0.0
        }
      ]
    }
  }
}

Examples

Success payload

See Response payload.

Error payload

403 Location not under your partner

{
  "message": "Forbidden",
  "status": "error",
  "errors": "Store does not belong to your partner."
}

403 Not a partner

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

404 Location not found

{
  "message": "Not Found",
  "status": "error",
  "errors": "Store not found."
}

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 location's billing detail.
401The token is missing, expired or invalid.
403The caller isn't associated with a partner (Authenticated user is not associated with an partner.), or the location isn't under the caller's partner (Store does not belong to your partner.).
404No location exists with that storeId (Store not found.).
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/store/3007?year=2026&month=9" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?