Sign Customiser

Return bounded operational totals for the authenticated Store. Orders, modern products, and native-currency revenue are counted over complete UTC calendar days. Revenue remains in integer minor units and is never converted or combined across currencies. Malformed stored currency codes appear honestly in one null-currency bucket. Customer details, provider data, and legacy ProductCache rows are excluded. Requires analytics:read; this operation is read-only and safe to retry. end_date is the inclusive final day and must be before the current UTC date. It defaults to yesterday. period defaults to 30d. The response reports the half-open query bounds [starts_at, ends_before). Correct a 422 using the reported parameter, replace a key after 401, add the scope after 403, and retry 429 responses after retry_after seconds.

GET /api/v3/analytics/summary

Authorisation

Bearer token required. Include in the Authorization header.

Query parameters

period string query

Closed set of supported complete-day reporting periods.

Example: 30d

end_date string query

Inclusive final UTC date in YYYY-MM-DD format. Defaults to the previous UTC day.

Example: 2026-07-19

Get an analytics summary
curl https://web.signcustomiser.com/api/v3/analytics/summary?period=30d&end_date=2026-07-19 \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'
Response 200
{
  "data": {
    "object": "analytics_summary",
    "period": "30d",
    "starts_at": "2026-06-20T00:00:00Z",
    "ends_before": "2026-07-20T00:00:00Z",
    "order_count": 18,
    "product_count": 21,
    "revenue": [
      {
        "currency": "AUD",
        "amount": 248900,
        "order_count": 16
      },
      {
        "currency": "NZD",
        "amount": 31100,
        "order_count": 2
      }
    ]
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/analytics/summary?period=30d&end_date=2026-07-19",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}
Response 401
{
  "type": "https://www.signcustomiser.com/help/api/problems/missing_api_key",
  "title": "Missing API key",
  "status": 401,
  "code": "missing_api_key",
  "detail": "Provide a store API key as a bearer token.",
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 403
{
  "type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This operation requires the analytics:read scope.",
  "required_scopes": [
    "analytics:read"
  ],
  "granted_scopes": [],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 422
{
  "type": "https://www.signcustomiser.com/help/api/problems/invalid_parameter",
  "title": "Invalid query parameter",
  "status": 422,
  "code": "invalid_parameter",
  "detail": "The period parameter must be one of: 7d, 30d, 90d, 365d.",
  "errors": [
    {
      "parameter": "period",
      "code": "unsupported_value",
      "detail": "The period parameter is unsupported.",
      "allowed_values": [
        "7d",
        "30d",
        "90d",
        "365d"
      ]
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response 429
{
  "type": "https://www.signcustomiser.com/help/api/problems/rate_limited",
  "title": "Too many requests",
  "status": 429,
  "code": "rate_limited",
  "detail": "You have exceeded the request limit for this API key.",
  "retry_after": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}