Menu

POST Calculate order price and tax

/api/v1/account/orders/quotes

Explicitly calculate a final price from the current net catalog price and billing address. Tax is calculated with Stripe Tax; unsupported locations, missing configuration and unverified Tax IDs block checkout. Quotes last at most 30 minutes, bind all commercial choices and are reused for identical requests within the account. Limits: 10 provider attempts per account/hour and 200/day globally. No payment, invoice, subscription, tax transaction or package activation is created.

On this page

Access and permissions

Explicitly calculate a final price from the current net catalog price and billing address. Tax is calculated with Stripe Tax; unsupported locations, missing configuration and unverified Tax IDs block checkout. Quotes last at most 30 minutes, bind all commercial choices and are reused for identical requests within the account. Limits: 10 provider attempts per account/hour and 200/day globally. No payment, invoice, subscription, tax transaction or package activation is created.

Browser session: __Host-mb_session cookie.

When using a browser session for a mutation, send the current CSRF token in X-CSRF-Token with the same-site cookie. OAuth consent uses its documented form field.

Parameters and headers

FieldLocationType and limitsRequiredMeaning
workspace_idURL querystring; {"format":"uuid"}NoLimit the list to an accessible workspace.
X-CSRF-TokenHeaderstringYesCurrent browser security proof; must match the loaded session.
X-MetriBeacon-Session-ContextHeaderstringYesCurrent browser security proof; must match the loaded session.

Request body

FieldType and limitsRequiredMeaning
$PackageOrderQuoteRequestYes—
$.addressBillingAddressYesInternational billing address. Postal code and state requirements follow the country; company is required for businesses. A supplied Tax ID must be verified by the provider before it can affect tax.
$.address.citystringYes—
$.address.companystringNo—
$.address.countrystring; {"maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"}Yes—
$.address.kindstring; {"enum":["personal","business"]}Yes—
$.address.line1stringYes—
$.address.line2stringNo—
$.address.namestringYes—
$.address.postal_codestring; {"maxLength":32}Yes—
$.address.statestring; {"maxLength":64}No—
$.address.tax_idstringNo—
$.address.tax_id_typestringNo—
$.billingstring; {"enum":["monthly","yearly"]}Yes—
$.currencystring; {"enum":["EUR","USD"]}Yes—
$.payment_methodstring; {"enum":["card","paypal","bank_transfer"]}Yes—
$.plan_idstring; {"enum":["essentials","pro","business"]}Yes—
$.profile_revisioninteger; {"minimum":0}Yes—

Responses

HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/json

FieldType and limitsRequiredMeaning
$PackageOrderQuoteYes—
$.idstring; {"format":"uuid"}Yes—
$.snapshotPackageOrderSnapshotYes—
$.snapshot.addressBillingAddressYesInternational billing address. Postal code and state requirements follow the country; company is required for businesses. A supplied Tax ID must be verified by the provider before it can affect tax.
$.snapshot.address.citystringYes—
$.snapshot.address.companystringNo—
$.snapshot.address.countrystring; {"maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"}Yes—
$.snapshot.address.kindstring; {"enum":["personal","business"]}Yes—
$.snapshot.address.line1stringYes—
$.snapshot.address.line2stringNo—
$.snapshot.address.namestringYes—
$.snapshot.address.postal_codestring; {"maxLength":32}Yes—
$.snapshot.address.statestring; {"maxLength":64}No—
$.snapshot.address.tax_idstringNo—
$.snapshot.address.tax_id_typestringNo—
$.snapshot.billingstringYes—
$.snapshot.breakdownarray<object>Yes—
$.snapshot.breakdown[]objectYes—
$.snapshot.breakdown[].amountintegerYes—
$.snapshot.breakdown[].tax_rate_detailsobjectYes—
$.snapshot.breakdown[].tax_rate_details.countrystringYes—
$.snapshot.breakdown[].tax_rate_details.percentage_decimalstringYes—
$.snapshot.breakdown[].tax_rate_details.statestringYes—
$.snapshot.breakdown[].tax_rate_details.tax_typestringYes—
$.snapshot.breakdown[].taxability_reasonstringYes—
$.snapshot.breakdown[].taxable_amountintegerYes—
$.snapshot.calculation_idstringYes—
$.snapshot.catalog_revisionintegerYes—
$.snapshot.config_versionstringYes—
$.snapshot.currencystringYes—
$.snapshot.expires_atstring; {"format":"date-time"}Yes—
$.snapshot.languagestringYes—
$.snapshot.net_centsintegerYes—
$.snapshot.payment_methodstringYes—
$.snapshot.planPricingPlanYes—
$.snapshot.plan.idstring; {"enum":["free","essentials","pro","business","enterprise"]}Yes—
$.snapshot.plan.monthly_centsinteger | null; {"minimum":0,"maximum":1000000000}Yes—
$.snapshot.plan.yearly_centsinteger | null; {"minimum":0,"maximum":1000000000}Yes—
$.snapshot.plan.valuesobjectYes—
$.snapshot.plan.retentionPlanRetentionYes—
$.snapshot.plan.retention.rawinteger; {"minimum":1,"maximum":30}Yes—
$.snapshot.plan.retention.minuteinteger; {"minimum":1,"maximum":30}Yes—
$.snapshot.plan.retention.quarter_hourinteger; {"minimum":1,"maximum":365}Yes—
$.snapshot.plan.retention.hourinteger; {"minimum":1,"maximum":1095}Yes—
$.snapshot.plan.retention.textinteger; {"minimum":1,"maximum":7}Yes—
$.snapshot.plan.retention.logsinteger; {"minimum":1,"maximum":30}Yes—
$.snapshot.plan_idstringYes—
$.snapshot.profile_revisionintegerYes—
$.snapshot.tax_centsintegerYes—
$.snapshot.tax_id_verifiedbooleanYes—
$.snapshot.termsobjectYes—
$.snapshot.terms_versionstringYes—
$.snapshot.total_centsintegerYes—
json
{
  "id": "00000000-0000-4000-8000-000000000003",
  "snapshot": {
    "plan_id": "essentials",
    "billing": "monthly",
    "currency": "EUR",
    "payment_method": "bank_transfer",
    "address": {
      "kind": "personal",
      "name": "Example Customer",
      "line1": "Example Street 1",
      "postal_code": "10115",
      "city": "Berlin",
      "country": "DE"
    },
    "profile_revision": 0,
    "plan": {
      "id": "essentials",
      "monthly_cents": 2900,
      "yearly_cents": 29000,
      "values": {
        "projects": {
          "kind": "unlimited"
        },
        "seats": {
          "kind": "number",
          "value": 3,
          "extra_cents": 700
        },
        "google_sso": {
          "kind": "included"
        },
        "enterprise_identity": {
          "kind": "excluded"
        },
        "saml_sso": {
          "kind": "excluded"
        },
        "priority_support": {
          "kind": "excluded"
        },
        "audit_logs": {
          "kind": "excluded"
        },
        "monitors": {
          "kind": "number",
          "value": 50
        },
        "check_interval": {
          "kind": "number",
          "value": 30
        },
        "maintenance": {
          "kind": "included"
        },
        "ssl": {
          "kind": "included"
        },
        "dns": {
          "kind": "included"
        },
        "notifications": {
          "kind": "included"
        },
        "incident_integrations": {
          "kind": "included"
        },
        "sms_credits": {
          "kind": "number",
          "value": 20
        },
        "calls": {
          "kind": "included"
        },
        "healthchecks": {
          "kind": "included"
        },
        "weekly_reports": {
          "kind": "included"
        },
        "regions": {
          "kind": "number",
          "value": 18
        },
        "browser_checks": {
          "kind": "number",
          "value": 3
        },
        "browser_interval": {
          "kind": "number",
          "value": 300
        },
        "sla_reports": {
          "kind": "included"
        },
        "server_agents": {
          "kind": "number",
          "value": 5
        },
        "additional_server": {
          "kind": "number",
          "value": 200
        },
        "server_metrics": {
          "kind": "included"
        },
        "server_alerting": {
          "kind": "included"
        },
        "on_call": {
          "kind": "number",
          "value": 1
        },
        "escalation": {
          "kind": "included"
        },
        "manual_incidents": {
          "kind": "included"
        },
        "acknowledge": {
          "kind": "included"
        },
        "assistant": {
          "kind": "number",
          "value": 10
        },
        "investigations": {
          "kind": "number",
          "value": 3
        },
        "own_ai_key": {
          "kind": "included"
        },
        "mcp": {
          "kind": "included"
        },
        "status_pages": {
          "kind": "number",
          "value": 1
        },
        "custom_domains": {
          "kind": "number",
          "value": 1
        },
        "hosted_domain": {
          "kind": "included"
        },
        "embedded_charts": {
          "kind": "included"
        },
        "manual_components": {
          "kind": "included"
        },
        "subscribers": {
          "kind": "number",
          "value": 100
        },
        "sms_subscribers": {
          "kind": "excluded"
        },
        "status_incidents": {
          "kind": "included"
        },
        "intercom": {
          "kind": "excluded"
        },
        "private_pages": {
          "kind": "excluded"
        },
        "email_codes": {
          "kind": "excluded"
        },
        "analytics": {
          "kind": "excluded"
        },
        "tv_mode": {
          "kind": "excluded"
        },
        "languages": {
          "kind": "excluded"
        },
        "hide_search": {
          "kind": "excluded"
        },
        "white_label": {
          "kind": "excluded"
        },
        "email_domain": {
          "kind": "excluded"
        },
        "sso_standard": {
          "kind": "excluded"
        },
        "sso_extended": {
          "kind": "excluded"
        },
        "reporting": {
          "kind": "included"
        },
        "csv": {
          "kind": "included"
        },
        "incident_kpis": {
          "kind": "included"
        },
        "log_volume": {
          "kind": "number",
          "value": 5000000000
        },
        "log_overage": {
          "kind": "number",
          "value": 25
        },
        "enterprise_sso": {
          "kind": "excluded"
        },
        "enterprise_contract": {
          "kind": "excluded"
        },
        "enterprise_migration": {
          "kind": "excluded"
        },
        "enterprise_support": {
          "kind": "excluded"
        }
      },
      "retention": {
        "raw": 7,
        "minute": 7,
        "quarter_hour": 7,
        "hour": 7,
        "text": 7,
        "logs": 30
      }
    },
    "catalog_revision": 1,
    "terms_version": "0000000000000000000000000000000000000000000000000000000000000000",
    "terms": {
      "en": {
        "body": "Example order terms for this API response: the selected contract starts upon later activation after confirmed payment. Publish complete terms before accepting real orders.",
        "renewal": "Example: monthly term, automatic renewal according to the accepted conditions."
      },
      "de": {
        "body": "Example order terms for this API response: the selected contract starts upon later activation after confirmed payment. Publish complete terms before accepting real orders.",
        "renewal": "Example: monthly term, automatic renewal according to the accepted conditions."
      }
    },
    "config_version": "1111111111111111111111111111111111111111111111111111111111111111",
    "language": "en",
    "calculation_id": "taxcalc_example",
    "net_cents": 2900,
    "tax_cents": 551,
    "total_cents": 3451,
    "expires_at": "2026-10-29T12:30:00Z",
    "tax_id_verified": false,
    "breakdown": [
      {
        "amount": 551,
        "taxable_amount": 2900,
        "taxability_reason": "standard_rated",
        "tax_rate_details": {
          "country": "DE",
          "state": "",
          "percentage_decimal": "19.0",
          "tax_type": "vat"
        }
      }
    ]
  }
}
Stable error codes
unauthorized
invalid_credential
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 401,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
order_forbidden
csrf
csrf_failed
invalid_origin
owner_required
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 403,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
order_not_found
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 404,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
session_context_changed
quote_pending
order_conflict
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 409,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
invalid_order
tax_id_unverified
tax_region_unavailable
invalid_cursor
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 422,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
tax_rate_limited
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 429,
  "title": "Demo error",
  "type": "about:blank"
}
Stable error codes
ordering_unavailable
tax_unavailable
HeaderType and limitsMeaning
Cache-Controlstring; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"}Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation.
Content-Languagestring; {"enum":["en","de"]}Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable.
Referrer-PolicyJSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]}The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters.
Retry-Afterstring; {"pattern":"^[0-9]+$"}Seconds before retry. Preserve supported idempotency identifiers and respect the operation’s mutation semantics.
VarystringResponses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie.
X-Content-Type-OptionsJSON; {"const":"nosniff"}The browser must use the declared content type.
X-Frame-OptionsJSON; {"const":"DENY"}The response must not be embedded in a frame.
X-Request-IDstringServer-generated request identifier. Include this when reporting an error; inbound values are not trusted.

application/problem+json

FieldType and limitsRequiredMeaning
$ProblemYes—
$.codestringYesStable machine-readable error code
$.detailstringYesShort localized explanation without internal error details
$.instancestringYesUnique relative identifier /api/v1/requests/{request_id}; not a retrievable resource
$.messagestringYesTemporarily identical to detail for existing clients
$.message_keystringYesStable translation key for changing the displayed language without another request
$.message_paramsobject; {"additionalProperties":true}YesNamed, safely rendered message parameters; never arbitrary HTML
$.request_idstring; {"pattern":"^[0-9a-f]{32}$"}YesServer-generated diagnostic identifier. It contains no login token or credential.
$.statusinteger; {"maximum":599,"minimum":400}Yes—
$.titlestringYesLocalized HTTP status title
$.typestring; {"const":"about:blank"}Yes—
json
{
  "code": "demo",
  "detail": "Demo error detail; inspect the documented code.",
  "instance": "demo",
  "message": "Demo error detail; inspect the documented code.",
  "message_key": "errors.requestFailed",
  "message_params": {},
  "request_id": "00000000000000000000000000000000",
  "status": 503,
  "title": "Demo error",
  "type": "about:blank"
}

Retries and asynchronous work

This change does not have a general retry guarantee. If the response is unclear, read the affected resource before trying again. Follow Retry-After waiting times and request new sign-in or action codes when they expire.

Request examples

Replace demo IDs, timestamps and placeholders with your own values. For a retry, keep the same IDs, time and content. These examples do not run requests on this page.

Keep login links, codes, cookies and keys private. Do not print them in logs or share them in support requests.

shell
curl --request POST --cookie '__Host-mb_session=<session>' --header 'Origin: https://metribeacon.com' --header 'X-CSRF-Token: <csrf>' --header 'X-MetriBeacon-Session-Context: <context>' --header 'Content-Type: application/json' --header 'Idempotency-Key: 00000000-0000-4000-8000-000000000002' --data '{"plan_id":"essentials","billing":"monthly","currency":"EUR","payment_method":"card","profile_revision":0,"address":{"kind":"personal","name":"Example Customer","line1":"Example 1","postal_code":"10115","city":"Berlin","country":"DE"}}' 'https://metribeacon.com/api/v1/account/orders/quotes'
python
import requests
response = requests.request('POST', 'https://metribeacon.com/api/v1/account/orders/quotes', cookies={'__Host-mb_session': '<session>'}, headers={'Origin': 'https://metribeacon.com', 'X-CSRF-Token': '<csrf>', 'X-MetriBeacon-Session-Context': '<context>', 'Idempotency-Key': '00000000-0000-4000-8000-000000000002'}, json={'plan_id': 'essentials', 'billing': 'monthly', 'currency': 'EUR', 'payment_method': 'card', 'profile_revision': 0, 'address': {'kind': 'personal', 'name': 'Example Customer', 'line1': 'Example 1', 'postal_code': '10115', 'city': 'Berlin', 'country': 'DE'}})
response.raise_for_status()
javascript
const response = await fetch('/api/v1/account/orders/quotes', {method: 'POST', credentials: 'same-origin', headers: {'Content-Type': 'application/json', 'X-CSRF-Token': '<csrf>', 'X-MetriBeacon-Session-Context': '<context>', 'Idempotency-Key': '00000000-0000-4000-8000-000000000002'}, body: JSON.stringify({"plan_id":"essentials","billing":"monthly","currency":"EUR","payment_method":"card","profile_revision":0,"address":{"kind":"personal","name":"Example Customer","line1":"Example 1","postal_code":"10115","city":"Berlin","country":"DE"}})});
go
package main

import (
	"net/http"
	"strings"
)

func main() {
	req, _ := http.NewRequest("POST", "https://metribeacon.com/api/v1/account/orders/quotes", strings.NewReader("{\"plan_id\":\"essentials\",\"billing\":\"monthly\",\"currency\":\"EUR\",\"payment_method\":\"card\",\"profile_revision\":0,\"address\":{\"kind\":\"personal\",\"name\":\"Example Customer\",\"line1\":\"Example 1\",\"postal_code\":\"10115\",\"city\":\"Berlin\",\"country\":\"DE\"}}"))
	req.Header.Set("Cookie", "__Host-mb_session=<session>")
	req.Header.Set("Origin", "https://metribeacon.com")
	req.Header.Set("X-CSRF-Token", "<csrf>")
	req.Header.Set("X-MetriBeacon-Session-Context", "<context>")
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Idempotency-Key", "00000000-0000-4000-8000-000000000002")
	response, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()
}
  • HTTP API, OAuth and MCP

    Find the user API endpoints, their permissions, fields, examples and response formats.

  • GET List package orders

    List orders with status, plan and text filters and cursor pagination of 50 rows. Customer sessions see only their own orders; operator sessions on the operator endpoint see all accounts. Summaries exclude billing addresses and full terms.

  • POST Place a package order

    Submit an unexpired quote after accepting its exact terms version. Use a new UUID Idempotency-Key for one submission and reuse it on manual retries after an uncertain response. The same key with different content is rejected. There is at most one pending order per account. An encrypted outbox sends the receipt; the billing profile updates only after successful submission. Orders preserve immutable prices, tax, address and terms. Invoice, payment and activation remain pending for the later NextOffice integration. Existing package limits and retention stay unchanged.

  • GET Read checkout and last billing address

    Read your last submitted billing profile, pending order and current checkout availability. This endpoint only accepts your normal verified owner session. Workspace membership and support access do not grant ordering authority.