All docs
4 min read

Billing

Five read-only endpoints for inspecting the current team's billing state. Useful for in-app dashboards, programmatic plan checks, and accounting integrations.

All write actions (changing plan, updating payment method, cancelling) live in the dashboard only — they cannot be performed via the API.

Base URL: https://formspring.io/api/v1

Method Path Ability
GET /billing/team billing:read
GET /billing/plan billing:read
GET /billing/usage billing:read
GET /billing/subscription billing:read
GET /billing/invoices billing:read

The billing:read ability can only be granted to tokens minted by an owner or admin. See Roles →.

Show team

GET /billing/team

Returns the current team's identity and billing-relevant metadata.

Response 200:

{
  "data": {
    "id": "team_01H...",
    "name": "Acme Co.",
    "slug": "acme",
    "owner_email": "florian@example.com",
    "country": "DE",
    "tax_id": "DE123456789",
    "billing_email": "ap@example.com",
    "created_at": "2025-08-01T00:00:00Z"
  }
}

Show plan

GET /billing/plan

Returns the plan the team is on, including price, included quotas, and feature flags.

Response 200:

{
  "data": {
    "name": "Pro+",
    "slug": "pro-plus",
    "price_cents": 4900,
    "currency": "EUR",
    "interval": "monthly",
    "features": {
      "ai_moderation": true,
      "ai_insights": true,
      "auto_categorization": true,
      "akismet": true,
      "api_access": true,
      "max_forms": null,
      "max_submissions_per_month": 100000,
      "max_team_members": 25
    }
  }
}

null quotas mean unlimited.

Show usage

GET /billing/usage

Current billing period's usage snapshot. Refreshes within 60 seconds of new submissions arriving.

Response 200:

{
  "data": {
    "period_start": "2026-05-01T00:00:00Z",
    "period_end": "2026-06-01T00:00:00Z",
    "submissions": {
      "used": 12384,
      "included": 100000,
      "overage": 0
    },
    "forms": {
      "used": 23,
      "included": null
    },
    "team_members": {
      "used": 4,
      "included": 25
    },
    "ai_calls": {
      "used": 12384,
      "included": 100000
    }
  }
}

Plan a UI by reading used / included and showing a progress bar. The overage field is only populated on plans that allow paid overage.

Show subscription

GET /billing/subscription

The active subscription's lifecycle state.

Response 200:

{
  "data": {
    "status": "active",
    "current_period_start": "2026-05-01T00:00:00Z",
    "current_period_end": "2026-06-01T00:00:00Z",
    "cancel_at_period_end": false,
    "trial_ends_at": null,
    "payment_method": {
      "type": "card",
      "brand": "visa",
      "last4": "4242",
      "exp_month": 12,
      "exp_year": 2028
    }
  }
}

status is one of: trialing, active, past_due, canceled, incomplete. A team in past_due can still receive submissions but cannot create new resources.

List invoices

GET /billing/invoices?per_page=25

Paginated list of invoices in reverse chronological order.

Response 200:

{
  "data": [
    {
      "id": "in_01H...",
      "number": "ACME-2026-0007",
      "status": "paid",
      "amount_cents": 4900,
      "currency": "EUR",
      "issued_at": "2026-05-01T00:00:00Z",
      "paid_at": "2026-05-01T00:00:12Z",
      "pdf_url": "https://formspring.io/invoices/in_01H.../pdf?signature=..."
    }
  ],
  "meta": { "current_page": 1, "per_page": 25, "total": 14 }
}

pdf_url is a signed URL valid for 60 minutes. Re-list to mint a fresh URL.

Common errors

Status Meaning
401 Token missing or invalid
402 API not available on free plan
403 Token lacks billing:read (e.g. minted by an editor or viewer)
404 No subscription found (free-plan teams)
429 API rate limit hit

What's next