---
title: "Brand()"
url: https://services.dev/docs/service/brand
captured: [brand-credential.txt, brand-smallest.txt, legal-walk.txt]
codes: [brand_unverified]
---
# Brand()

URL: https://services.dev/docs/service/brand

> Brand({...}) is optional, in brand.ts beside services/. It sets the brand's domain, its own words, the credentials it holds, its family, tenants, practice workspaces, fee policy and payouts. Without it, the brand is package.json's name.

## Smallest form

```bash
cat brand.ts
```

```txt title="magic values: none"
import { Brand } from 'services.dev'

export default Brand({
  name: 'Lingua',
  domain: 'lingua.example',
})
```

```bash
npx services.dev check
```

```txt title="magic values: none"
brand.ts · 2 lines · Lingua · lingua.example
```

```txt
→ GET /.well-known/agents.json
```

```txt title="magic values: none"
  name     lingua.example
  openapi  https://lingua.example/openapi.json
```

```txt
→ GET /openapi.json
```

```txt title="magic values: none"
  servers  https://lingua.example · http://localhost:8787
```

## Every form

What `Brand()` takes: optional, beside services/. Without it the brand is package.json's `name`.

| Key | Written | Left out | Does |
|---|---|---|---|
| `name` | `string` | package.json's name | The brand's name on every surface. |
| `domain` | `string` | none | Its canonical origin: agents.json's name, the absolute openapi and doc_url links, openapi's servers. Localhost still serves them. |
| `words` | `{ <generic word>: string }` | none | The brand's own words for the generic ones, on every Layer B surface: paths, events, commands, tools, SDK names, docs, the Site and the apps. Each plural is the word's own. |
| `also` | `{ <op id>: path \| path[] }` | none | Paths of the brand's own at which an operation is also served, beside the row's: `{ 'member.ledger.get': '/conflicts' }`. A declared column of the operation registry, like `words`: the same handler, the same callers, in the HTTP column of every surface that renders it. An id that names no operation, or a path that collides with one services.dev serves, fails word_collision. |
| `credentials` | `{ <credential>: { verify, fresh?, via? } }` | none | Credentials the brand itself holds, verified and kept fresh like a member's. A rules row names one with `{ brand }`; while one is unverified or stale, an act that needs it answers `brand_unverified`. |
| `fees` | `{ shares?: boolean; percent_pay?: boolean; split_professional_fee?: boolean; percent_member_fee?: false }` | none | Fee policy: false forbids a fee form on every Service. |
| `family` | `string[]` | none | Sibling brands one buyer key opens. |
| `tenants` | `boolean \| { limits: ('max_fee' \| 'regions' \| 'humans_earlier')[] }` | none | Integrators who resell your Services as their own offers. |
| `workspaces` | `boolean` | none | Buyers may bring their own professionals into a scoped practice workspace. |
| `payouts` | `{ rail: 'stripe'; schedule?: 'same-day' \| 'weekly' }` | none | How services.dev's take and members' pay move. |
| `descriptor` | `string`, up to 22 characters | the domain, uppercased | How your charge reads on the buyer's statement, each Service's short name after it. |
| `tax` | `'stripe' \| false` | `false` | Tax on your charges, calculated by Stripe Tax and collected as its own line, outside the take. |
| `dunning` | `{ for?: Within; ask?: boolean }` | `{ for: '14d', ask: true }` | How long a failed charge retries, and whether the buyer is asked to update how they pay. |
| `disputes` | `{ evidence?: 'auto' \| 'review'; prevent?: { refund_under?: number } }` | `{ evidence: 'auto' }` | Whether dispute evidence is sent for you or waits for your review, and the warned charges refunded before a dispute opens. |
| `calendar` | `Calendar` | none: dates close at 23:59 UTC and nothing rolls | Where the brand's dates fall: the zone its deadlines are kept in, its weekends and closed days, the minute a due date closes and the minute rungs ring, and whether a date on a closed day rolls to the next open one. A Service may set its own. |

## Each key's page

| Key | Read |
|---|---|
| `words`, `also` | [Your brand's words](https://services.dev/docs/service/brand-words.md) |
| `credentials` | [Credentials the brand holds](https://services.dev/docs/people/brand-credentials.md) |
| `descriptor` | [The two-seller checkout](https://services.dev/docs/money/lines-and-rails.md#the-two-seller-checkout) |
| `tax` | [Flow of funds](https://services.dev/docs/money/flow-of-funds.md#every-line-at-stripe) |
| `dunning` | [When the charge fails](https://services.dev/docs/money/release.md#when-the-charge-fails) |
| `disputes` | [Disputes](https://services.dev/docs/money/refunds-and-disputes.md#disputes) |
| `fees` | [Your fee policy](https://services.dev/docs/money/pay.md#your-fee-policy) |

## Seven surfaces

| Op | API | CLI | MCP | SDK | Site | Docs | App |
|---|---|---|---|---|---|---|---|
| `brand.card` | `GET /.well-known/agents.json` |  |  |  | `/.well-known/agents.json` |  |  |
| `brand.openapi` | `GET /openapi.json` |  |  |  | `/openapi.json` |  |  |

[Operations](https://services.dev/docs/reference/operations.md) has every column of every row.

## In the example brands

### The legal brand: its domain and its words

```bash
npx services.dev check
```

```txt title="magic values: member = mbr_eligible"
brand.ts · 10 lines · legal · api.lawyer · words job → matter, subject → asset, task → review, member → signer, pool → network, end → outcome
```

### A filing brand that holds its own credential

```bash
cat brand.ts
```

```txt title="magic values: metadata.sandbox.brand = verified, metadata.sandbox.brand = stale"
import { Brand } from 'services.dev'

// A filing brand that e-files under its own e-file number: a credential the brand itself holds,
// verified by its own verifier and kept fresh. On a test key the sandbox stands in for the verifier.
export default Brand({
  domain: 'filings.example',
  credentials: { efin: { verify: 'https://verify.example.test/efin', fresh: '30d', via: 'the e-file application' } },
})
```

## Refusals

| Code | Category | HTTP | Why |
|---|---|---|---|
| [`brand_unverified`](https://services.dev/docs/reference/errors.md#brand_unverified) | unavailable | 403 | A credential the brand itself holds is unverified or stale, so the act it covers waits. Nothing was charged. |

| `check` gate | Why |
|---|---|
| [`word_collision`](https://services.dev/docs/reference/check/word_collision.md) | A Brand.words value takes a generic word, a word an operation's id is spelled with or a path services.dev already serves, or makes two rows render the same, so two things would read the same. |
| [`brand_credential_missing`](https://services.dev/docs/reference/check/brand_credential_missing.md) | A rules row names a credential the brand holds, and the Brand doesn't declare it. |

---

- Up: [Service()](https://services.dev/docs/service.md)
- Previous: [Publish before it takes orders](https://services.dev/docs/service/status.md)
- Next: [Your brand's words](https://services.dev/docs/service/brand-words.md)
