Get the organization's Ownrecord plan
The platform_billing.get operation: GET /api/v1/platform_billing in the REST API and the platform_billing_get tool in the MCP server.
/api/v1/platform_billingReturns the organization's own Ownrecord subscription, as Organization → Billing shows it: the current plan,
its status and period, the effective entitlements (an active override merged over the plan), usage against
each limit (limits, with over after a downgrade: nothing is deleted, creating more is blocked), the metered
volume of the current period with its volume fee so far, the cheapest plan for the last three months of volume,
the plans you can choose, and the escalation of an unpaid subscription (escalation: restricted after 14 days,
suspended after 30, unless a platform admin holds it).
Ownrecord bills organizations through its own platform brand: the plan is a subscription of the organization's
billing account there (platformCustomerId). Change the plan with platform_billing.change_plan; manage
payment methods, billing details and invoices in the billing portal (platform_billing.portal_sessions.create).
At a glance
- REST:
GET /api/v1/platform_billing - MCP tool:
platform_billing_get - Operation ID:
platform_billing.get - Scope: Organization
- Permission:
platform_plan:read - Risk tier:
read - Dry run: Not supported
- Idempotency: Not needed (read only)
- Modes: Test and live
- Authentication: API key with the
platform_plan:readscope - Since: M12
Request
Query parameters
This operation takes no query parameters.
Response
200 OK with a JSON object:
| Field | Type | Description |
|---|---|---|
object | "platform_billing" | |
orgId | string | |
status | one of active, restricted, suspended, closing, closed | |
livemode | boolean | |
provisioning | one of ready, pending, unavailable | |
platformCustomerId | string or null | |
plan | object | |
plan.key | string or null | |
plan.name | string or null | |
plan.status | one of trialing, active, past_due, unpaid, canceled, none | |
plan.subscriptionId | string or null | |
plan.interval | one of day, week, month, year or null | |
plan.currentPeriodEnd | date-time or null | |
plan.cancelAtPeriodEnd | boolean | |
plan.scheduledChange | object or null | |
plan.hasPaymentMethod | boolean | |
override | object or null | |
entitlements | object | |
limits | array of object | |
limits[].feature | string | |
limits[].limit | integer | |
limits[].used | integer | |
limits[].atLimit | boolean | |
limits[].over | boolean | |
escalation | object | |
escalation.unpaidSince | date-time or null | |
escalation.stage | one of active, restricted, suspended or null | |
escalation.next | object or null | |
escalation.hold | object or null | |
escalation.thresholds | object | |
escalation.thresholds.restrictAfterDays | integer | |
escalation.thresholds.suspendAfterDays | integer | |
usage | object or null | |
recommendation | object or null | |
plans | array of object | |
plans[].key | string | |
plans[].name | string | |
plans[].highlighted | boolean | |
plans[].contactSales | boolean | |
plans[].current | boolean | |
plans[].trialDays | integer or null | |
plans[].prices | array of object | |
plans[].prices[].lookupKey | string | |
plans[].prices[].currency | string | The price's currency: EUR, CHF or USD. |
plans[].prices[].interval | one of day, week, month, year | |
plans[].prices[].kind | one of licensed, metered | |
plans[].prices[].amount | money or null | Licensed prices: the fee per period. |
plans[].prices[].ratePpm | string or null | Metered prices: the volume fee in parts per million (1% = 10000). |
plans[].entitlements | object | |
currency | object | |
currency.options | array of string | |
currency.current | string or null | |
currency.suggested | string | |
currency.changeable | boolean | |
pendingUpgrade | object or null |
Examples
An organization on Growth
GET /api/v1/platform_billing
Authorization: Bearer or_test_…
Response (200):
{
"object": "platform_billing",
"orgId": "org_01jbz3m4k5n6p7q8r9s0t1v2w3",
"status": "active",
"livemode": true,
"provisioning": "ready",
"platformCustomerId": "cus_01jbz3m4k5n6p7q8r9s0t1v2w4",
"plan": {
"key": "growth",
"name": "Growth",
"status": "active",
"subscriptionId": "sub_01jbz3m4k5n6p7q8r9s0t1v2w5",
"interval": "month",
"currentPeriodEnd": "2026-11-01T00:00:00.000Z",
"cancelAtPeriodEnd": false,
"scheduledChange": null,
"hasPaymentMethod": true
},
"override": null,
"entitlements": {
"api.rate_limit_rps": 100,
"assistant.enabled": true,
"assistant.messages_per_month": 1000,
"audit.retention_days": 90,
"brands.max": 3,
"custom_domains.max": 2,
"einvoicing.enabled": true,
"entities.max": 2,
"filing.reports": "full",
"jurisdictions.registered.max": 10,
"livemode": true,
"members.max": 10,
"processors.secondary": false,
"sso.enabled": false,
"subscriptions.enabled": true,
"support.level": "email",
"usage_billing.enabled": true
},
"limits": [
{
"feature": "entities.max",
"limit": 2,
"used": 1,
"atLimit": false,
"over": false
},
{
"feature": "brands.max",
"limit": 3,
"used": 3,
"atLimit": true,
"over": false
},
{
"feature": "members.max",
"limit": 10,
"used": 4,
"atLimit": false,
"over": false
},
{
"feature": "jurisdictions.registered.max",
"limit": 10,
"used": 2,
"atLimit": false,
"over": false
},
{
"feature": "custom_domains.max",
"limit": 2,
"used": 0,
"atLimit": false,
"over": false
}
],
"escalation": {
"unpaidSince": null,
"stage": null,
"next": null,
"hold": null,
"thresholds": {
"restrictAfterDays": 14,
"suspendAfterDays": 30
}
},
"usage": {
"periodStart": "2026-10-01T00:00:00.000Z",
"periodEnd": "2026-11-01T00:00:00.000Z",
"volume": {
"amount": "41250000000",
"currency": "EUR"
},
"transactions": 1375,
"estimatedVolumeFee": {
"amount": "206250000",
"currency": "EUR"
}
},
"recommendation": {
"cheapest": "growth",
"averageMonthlyVolume": {
"amount": "48000000000",
"currency": "EUR"
},
"costs": [
{
"plan": "starter",
"cost": {
"amount": "480000000",
"currency": "EUR"
}
},
{
"plan": "growth",
"cost": {
"amount": "389000000",
"currency": "EUR"
}
},
{
"plan": "scale",
"cost": {
"amount": "643000000",
"currency": "EUR"
}
}
]
},
"plans": [
{
"key": "growth",
"name": "Growth",
"highlighted": true,
"contactSales": false,
"current": true,
"trialDays": 14,
"prices": [
{
"lookupKey": "growth_monthly",
"currency": "EUR",
"interval": "month",
"kind": "licensed",
"amount": {
"amount": "149000000",
"currency": "EUR"
},
"ratePpm": null
},
{
"lookupKey": "growth_yearly",
"currency": "EUR",
"interval": "year",
"kind": "licensed",
"amount": {
"amount": "1430000000",
"currency": "EUR"
},
"ratePpm": null
},
{
"lookupKey": "growth_volume",
"currency": "EUR",
"interval": "month",
"kind": "metered",
"amount": null,
"ratePpm": "5000"
},
{
"lookupKey": "growth_monthly_chf",
"currency": "CHF",
"interval": "month",
"kind": "licensed",
"amount": {
"amount": "149000000",
"currency": "CHF"
},
"ratePpm": null
},
{
"lookupKey": "growth_volume_chf",
"currency": "CHF",
"interval": "month",
"kind": "metered",
"amount": null,
"ratePpm": "5000"
}
],
"entitlements": {
"api.rate_limit_rps": 100,
"assistant.enabled": true,
"assistant.messages_per_month": 1000,
"audit.retention_days": 90,
"brands.max": 3,
"custom_domains.max": 2,
"einvoicing.enabled": true,
"entities.max": 2,
"filing.reports": "full",
"jurisdictions.registered.max": 10,
"livemode": true,
"members.max": 10,
"processors.secondary": false,
"sso.enabled": false,
"subscriptions.enabled": true,
"support.level": "email",
"usage_billing.enabled": true
}
}
],
"currency": {
"options": ["EUR", "CHF", "USD"],
"current": "EUR",
"suggested": "EUR",
"changeable": false
},
"pendingUpgrade": null
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
permission_denied | 403 | Only an org_owner, org_admin or billing_admin sees the organization's Ownrecord plan. | Ask an organization owner or admin for a role or scope that allows this action. |
resource_not_found | 404 | No such organization is visible to you. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
It can also return these common errors: validation_failed, api_version_unsupported, authentication_required, api_key_invalid, dry_run_not_supported, rate_limited, internal_error.