putty
API ReferenceArtifacts

Draft a brand brief

Drafts a brand brief from a description: name options, a tagline, a voice in three adjectives, a contrast-checked palette, and an allowlisted font pairing. Nothing is persisted; the user edits the draft and calls `POST /brand/kits` with what they keep. A palette that misses WCAG AA is corrected to a passing one rather than returned failing, so the draft is always saveable as-is.

POST
/brand/kits/draft

Drafts a brand brief from a description: name options, a tagline, a voice in three adjectives, a contrast-checked palette, and an allowlisted font pairing. Nothing is persisted; the user edits the draft and calls POST /brand/kits with what they keep. A palette that misses WCAG AA is corrected to a passing one rather than returned failing, so the draft is always saveable as-is.

Request Body

application/json

The description to draft from.

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/brand/kits/draft" \  -H "Content-Type: application/json" \  -d '{    "description": "string"  }'
{  "nameOptions": [    "string"  ],  "tagline": "string",  "voice": [    "string"  ],  "palette": {    "primary": "string",    "primaryForeground": "string",    "secondary": "string",    "secondaryForeground": "string",    "accent": "string",    "accentForeground": "string",    "background": "string",    "foreground": "string",    "muted": "string",    "border": "string",    "destructive": "string"  },  "fonts": {    "heading": {      "family": "string",      "weights": [        100      ]    },    "body": {      "family": "string",      "weights": [        100      ]    }  },  "contrast": {    "passes": true,    "pairs": [      {        "foreground": "string",        "background": "string",        "ratio": 0,        "level": "aa",        "message": "string"      }    ],    "failures": [      {        "foreground": "string",        "background": "string",        "ratio": 0,        "level": "aa",        "message": "string"      }    ]  },  "rationale": "string"}

Delete a brand kit DELETE

Deletes a brand kit the caller owns. A kit owned by another user answers with the same 404 as a kit that does not exist. Projects that referenced the kit keep their files; only the stored kit is removed.

Preview a brand from a one-line idea POST

The free layer's brand preview: **a logo and a palette from a one-line idea, with no account and no project.** Send an `idea` in your own words. putty derives name options, a tagline, a three-adjective voice, a WCAG-checked palette, and an allowlisted font pairing from it, and generates one brand mark. **No bearer token is required and nothing is persisted**: no project, no brand kit, no asset, no run, no credits charged. This is NOT the authenticated `POST /projects/{projectId}/brand-preview`, which previews a SAVED kit against a project you own. That route still requires an account, because it reads your project and your kit. This one takes no id at all, so there is nothing for it to scope to — which is also why no other user's data is reachable from it. `palette` is checked by the same contrast maths `POST /brand/kits` applies, so a preview can never show a palette the save path would then reject. **`logo` is nullable on purpose.** The mark is a real generation against a real upstream, so it can time out, be moderated, or come back as a file type this route will not inline. In those cases the palette still renders and `logoProblem` says which step failed — because "we could not generate a mark" and "there is no mark" are different claims, and a client must not collapse them.