Preview a brand from a one-line idea
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.
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.
Request Body
application/json
The one-line idea to preview a brand from.
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://example.com/brand/preview" \ -H "Content-Type: application/json" \ -d '{ "brandKitId": "string" }'{ "projectId": "string", "brandKitId": "string", "name": "string", "tagline": "string", "voice": [ "string" ], "path": "string", "tokens": [ { "name": "string", "value": "string" } ], "appliedToFile": true, "contrast": { "passes": true, "failures": [ { "foreground": "string", "background": "string", "ratio": 0, "message": "string" } ] }}Draft a brand brief POST
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.
List your launches GET
Every launch the authenticated user owns, newest first. A launch belonging to another user is not in this list and is not distinguishable from one that does not exist.