Zum Inhalt springen

Get billing state

GET
/v1/admin/billing
curl --request GET \
--url http://localhost:8080/v1/admin/billing \
--header 'Authorization: Bearer <token>' \
--header 'X-Antares-Actor: <X-Antares-Actor>'

Plan, subscription status, trial and grace deadlines, payment method and the entitlements the plan resolves to, together with the current period’s usage. Read from our own projection of Stripe, never from Stripe itself: a payment provider must not sit in a panel page load. Role: viewer.

The organization’s billing state.

Media typeapplication/json
object
plan
required

sandbox is the free tenant a merchant splits off after an environment mismatch: it bills nothing and carries hard caps rather than soft ones. The other four are the commercial tiers.

string
Allowed values: sandbox free starter pro scale
planStatus
required

trialing — our own 30-day trial, which runs on the Pro feature set with no Stripe subscription at all. active — paid and current. past_due — a payment failed and Stripe is retrying; service continues. grace — retries are exhausted and a countdown to hard capping is running. canceled — cancelled but paid to the end of the period. expired — no entitlement; hard caps apply.

string
Allowed values: trialing active past_due grace canceled expired
trialEndsAt
string format: date-time
graceEndsAt

When hard capping begins if the payment is not recovered.

string format: date-time
currentPeriodEnd
string format: date-time
cancelAtPeriodEnd
required
boolean
paymentMethod
object
brand
required

Card brand or sepa_debit.

string
<= 32 characters
last4
required
string
/^[0-9]{4}$/
limits
required

The organization’s resolved entitlements. An entitlement check is a lookup on this, never a call to Stripe: a payment provider must not sit in the search request path.

object
searches
required

Searches per billing period. 0 means unmetered.

integer
products
required

Indexed documents across the organization.

integer
channels
required
integer
hybridSearch

Whether semantic and hybrid retrieval, and therefore re-embedding, are included. Absent means false.

boolean
customCss

Whether the widget designer’s custom CSS field is available.

boolean
abTesting

Whether widget-configuration A/B variants may be published.

boolean
analyticsRetentionDays

How far back the statistics endpoints may reach. A from older than this is 422 validation_failed rather than a silently truncated range.

integer
>= 1
usage
required
object
period
required
string
/^[0-9]{4}-(0[1-9]|1[0-2])$/
searches
required

Searches counted in the period, by the binding definition of searches.

integer
searchLimit
required

The plan’s cap. 0 means unmetered.

integer
products
required

Indexed documents across every collection of the organization.

integer
productLimit
required
integer
channels
required
integer
channelLimit
required
integer
state
required

warning from 80 % of any limit, exceeded at or above 100 % of any of them. On a paid plan exceeded still serves, with X-Antares-Quota: exceeded on the response; on sandbox or an expired trial it is 402 quota_exceeded.

string
Allowed values: ok warning exceeded
offers
required

The deployment’s allowed Stripe catalogue. Empty when billing is disabled; the panel must submit one of these exact priceId and interval pairs to checkout. Display prices are intentionally not duplicated here and come from the shared product-plans package.

Array<object>
object
plan
required

The commercial plan this Stripe price grants after synchronization.

string
Allowed values: starter pro scale
interval
required

Billing cadence. Must match the priceId’s own interval in Stripe.

string
Allowed values: monthly yearly
priceId
required

The environment-specific Stripe price id accepted by the checkout endpoint for this exact plan and interval.

string
<= 128 characters
Example
{
"plan": "sandbox",
"planStatus": "trialing",
"usage": {
"state": "ok"
},
"offers": [
{
"plan": "starter",
"interval": "monthly"
}
]
}

contract_validation_failed — the OpenAPI request validator rejected the request before the handler ran — or invalid_request when the body is unreadable or is not valid JSON for the declared operation.

Media typeapplication/problem+json

RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.

object
type
required

Absolute problem type URI. Stable identifier, never localised.

string format: uri-reference
title
required

Stable English summary of the problem type.

string
status
required

The HTTP status code, repeated in the body.

integer
>= 400 <= 599
detail

Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.

string
instance

The request path this occurrence relates to.

string format: uri-reference
code

The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.

string
errors

Present only for per-item validation failures, above all ingest batches.

Array<object>
object
field
required

Dotted path of the offending field inside the request body, for example prices.CHF.gross.

string
message
required

What is wrong with it, in English.

string
productIndex

0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.

integer
key
additional properties
any
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"code": "example",
"errors": [
{
"field": "example",
"message": "example",
"productIndex": 1
}
]
}

unauthorized — the credential is missing, malformed, unknown or revoked. For /v1/admin this also covers an actor JWS that fails signature, exp or kid verification, and a kid that no key in the panel’s JWKS matches.

Media typeapplication/problem+json

RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.

object
type
required

Absolute problem type URI. Stable identifier, never localised.

string format: uri-reference
title
required

Stable English summary of the problem type.

string
status
required

The HTTP status code, repeated in the body.

integer
>= 400 <= 599
detail

Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.

string
instance

The request path this occurrence relates to.

string format: uri-reference
code

The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.

string
errors

Present only for per-item validation failures, above all ingest batches.

Array<object>
object
field
required

Dotted path of the offending field inside the request body, for example prices.CHF.gross.

string
message
required

What is wrong with it, in English.

string
productIndex

0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.

integer
key
additional properties
any
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"code": "example",
"errors": [
{
"field": "example",
"message": "example",
"productIndex": 1
}
]
}

forbidden — authenticated, but the actor’s role does not carry the permission this route needs, or the operation is one of the three that refuse an impersonated actor (billing checkout, portal link, key rotation).

Media typeapplication/problem+json

RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.

object
type
required

Absolute problem type URI. Stable identifier, never localised.

string format: uri-reference
title
required

Stable English summary of the problem type.

string
status
required

The HTTP status code, repeated in the body.

integer
>= 400 <= 599
detail

Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.

string
instance

The request path this occurrence relates to.

string format: uri-reference
code

The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.

string
errors

Present only for per-item validation failures, above all ingest batches.

Array<object>
object
field
required

Dotted path of the offending field inside the request body, for example prices.CHF.gross.

string
message
required

What is wrong with it, in English.

string
productIndex

0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.

integer
key
additional properties
any
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"code": "example",
"errors": [
{
"field": "example",
"message": "example",
"productIndex": 1
}
]
}

rate_limit_exceeded — the per-key or per-IP token bucket is exhausted.

Media typeapplication/problem+json

RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.

object
type
required

Absolute problem type URI. Stable identifier, never localised.

string format: uri-reference
title
required

Stable English summary of the problem type.

string
status
required

The HTTP status code, repeated in the body.

integer
>= 400 <= 599
detail

Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.

string
instance

The request path this occurrence relates to.

string format: uri-reference
code

The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.

string
errors

Present only for per-item validation failures, above all ingest batches.

Array<object>
object
field
required

Dotted path of the offending field inside the request body, for example prices.CHF.gross.

string
message
required

What is wrong with it, in English.

string
productIndex

0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.

integer
key
additional properties
any
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"code": "example",
"errors": [
{
"field": "example",
"message": "example",
"productIndex": 1
}
]
}
Retry-After
integer
>= 1

Seconds until the bucket refills enough for one request.

internal_error — unhandled failure. detail is always generic; the cause goes to the log with a correlation id.

Media typeapplication/problem+json

RFC 9457 problem details. type is always https://api.antares.commergy.de/problems/{code} and is built in exactly one place. type, code and title are stable and never localised; only detail is localised, and only where the registry marks the audience as merchant.

object
type
required

Absolute problem type URI. Stable identifier, never localised.

string format: uri-reference
title
required

Stable English summary of the problem type.

string
status
required

The HTTP status code, repeated in the body.

integer
>= 400 <= 599
detail

Human-readable explanation of this occurrence. The only localised field; may be German or English depending on Accept-Language.

string
instance

The request path this occurrence relates to.

string format: uri-reference
code

The registry code, for example price_context_token_expired. This is what a client branches on; never branch on title or detail.

string
errors

Present only for per-item validation failures, above all ingest batches.

Array<object>
object
field
required

Dotted path of the offending field inside the request body, for example prices.CHF.gross.

string
message
required

What is wrong with it, in English.

string
productIndex

0-based index into the request’s products array. Present only for ingest batches, and the only way to map an error back to a product without echoing it.

integer
key
additional properties
any
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example",
"code": "example",
"errors": [
{
"field": "example",
"message": "example",
"productIndex": 1
}
]
}