Get a brand
The brands.get operation: GET /api/v1/brands/{id} in the REST API and the brands_get tool in the MCP server.
GET
/api/v1/brands/{id}Returns one brand by its ID (brd_…): name, slug, status, branding, statement descriptor and invoice
series. A brand outside the request's scope (another organization, another entity of an entity-scoped
request, or a sibling of a brand-scoped one) is resource_not_found.
At a glance
- REST:
GET /api/v1/brands/{id} - MCP tool:
brands_get - Operation ID:
brands.get - Scope: Organization, or one of its legal entities or brands
- Permission:
brands:read - Risk tier:
read - Dry run: Not supported
- Idempotency: Not needed (read only)
- Modes: Test and live
- Authentication: API key with the
brands:readscope - Since: M1
Request
Path parameters
| Field | Type | Description |
|---|---|---|
id | brd_… ID |
Query parameters
This operation takes no query parameters.
Response
200 OK with a JSON object:
| Field | Type | Description |
|---|---|---|
id | brd_… ID | |
object | "brand" | |
orgId | org_… ID | |
entityId | ent_… ID | |
slug | string | |
name | string | |
status | one of draft, test_only, live, suspended | |
isPlatformBrand | boolean | |
branding | object | |
branding.logoUrl | string or null | |
branding.iconUrl | string or null | |
branding.primaryColor | string or null | |
branding.accentColor | string or null | |
branding.supportEmail | string or null | |
branding.supportUrl | string or null | |
branding.termsUrl | string or null | |
branding.privacyUrl | string or null | |
statementDescriptor | string | |
statementDescriptorSuffix | string or null | |
invoiceSeries | object | |
invoiceSeries.invoice | string | |
invoiceSeries.creditNote | string | |
billingSettings | object | |
billingSettings.dunning | object | |
billingSettings.dunning.retryOffsetsDays | array of integer | |
billingSettings.dunning.finalAction | one of unpaid, canceled | |
billingSettings.entitlementGraceDays | integer | |
billingSettings.sendInvoice | object | |
billingSettings.sendInvoice.graceDays | integer | |
billingSettings.cardExpiryReminders | boolean | |
billingSettings.pausedEntitlements | boolean | |
billingSettings.paymentBehavior | one of allow_incomplete, pending_if_incomplete | |
policies | object | |
policies.breakageRecognition | one of at_expiry, manual | at_expiry (the default) or manual (held as expired credits until recognised). |
policies.supportRefundLimits | array of object | The support role's refund limit per currency (M8); a currency not listed has the default of 100 of it. |
policies.supportRefundLimits[].amount | string | Integer micros as a string. |
policies.supportRefundLimits[].currency | string | |
policies.disputeWalletFreeze | boolean | Freeze the customer's wallets when a dispute opens (default true; §19.2, M8). |
policies.taxIdUnavailable | one of charge_as_b2c, block | What a sale does when a tax ID couldn't be checked (§9.1 step 1; M13): charge_as_b2c (the default) or block. |
portalSettings | object | |
portalSettings.allowPlanChanges | boolean | Customers may switch plans along planChangeMatrix (no row: no switch). |
portalSettings.planChangeMatrix | array of object | One row per price: a subscription item on fromPriceId may switch to any of toPriceIds (same mode and currency). |
portalSettings.planChangeMatrix[].fromPriceId | price_… ID | |
portalSettings.planChangeMatrix[].toPriceIds | array of price_… ID | |
portalSettings.allowCancel | boolean | Customers may cancel their subscriptions. |
portalSettings.cancelBehavior | one of period_end, immediate | A portal cancellation ends the subscription at the period end (default) or at once. |
portalSettings.collectCancelReason | boolean | The portal asks why the customer cancels. |
portalSettings.allowQuantityChanges | boolean | Customers may change the quantity (seats) of licensed items. |
checkoutSettings | object | |
checkoutSettings.locales | array of string | The brand's languages, its default first. A default, not a restriction: a customer's own language comes first. |
checkoutSettings.collectPhone | boolean | |
checkoutSettings.requireBusinessDetails | one of auto, always, never | |
createdAt | date-time | |
updatedAt | date-time |
Examples
Read a brand
HTTP
GET /api/v1/brands/brd_01m4tx5nj8emwbyf7y9vcf47x4
Authorization: Bearer or_test_…
Response (200):
JSON
{
"id": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"object": "brand",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
"slug": "acme-app",
"name": "Acme App",
"status": "test_only",
"isPlatformBrand": false,
"branding": {
"logoUrl": null,
"iconUrl": null,
"primaryColor": null,
"accentColor": null,
"supportEmail": null,
"supportUrl": null,
"termsUrl": null,
"privacyUrl": null
},
"statementDescriptor": "ACME APP",
"statementDescriptorSuffix": null,
"invoiceSeries": {
"invoice": "ACM",
"creditNote": "ACM-CN"
},
"billingSettings": {
"dunning": {
"retryOffsetsDays": [1, 3, 5, 7],
"finalAction": "unpaid"
},
"entitlementGraceDays": 7,
"sendInvoice": {
"graceDays": 14
},
"cardExpiryReminders": true,
"pausedEntitlements": false,
"paymentBehavior": "allow_incomplete"
},
"policies": {
"breakageRecognition": "at_expiry",
"supportRefundLimits": [],
"disputeWalletFreeze": true,
"taxIdUnavailable": "charge_as_b2c"
},
"portalSettings": {
"allowPlanChanges": true,
"planChangeMatrix": [],
"allowCancel": true,
"cancelBehavior": "period_end",
"collectCancelReason": true,
"allowQuantityChanges": false
},
"checkoutSettings": {
"locales": ["en", "hr"],
"collectPhone": false,
"requireBusinessDetails": "auto"
},
"createdAt": "2026-10-13T12:00:00.000Z",
"updatedAt": "2026-10-13T12:00:00.000Z"
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
resource_not_found | 404 | No brand with this ID is visible to the request. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
permission_denied | 403 | You can't see brands here. | Ask an organization owner or admin for a role or scope that allows this action. |
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.