putty
API ReferenceArtifacts

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.

POST
/brand/preview

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"      }    ]  }}