putty
API ReferenceArtifacts

List your launches

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.

GET
/launches

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.

Authorization

bearerAuth
AuthorizationBearer <token>

A bearer token. The Account routes accept a Privy access token; the MCP transport accepts an sk- API key issued by POST /account/api-keys.

In: header

Response Body

application/json

application/json

curl -X GET "https://example.com/launches"
{  "launches": [    {      "id": "string",      "ownerId": "string",      "projectId": "string",      "chainSlug": "ethereum",      "provider": "erc20-direct",      "params": {        "property1": null,        "property2": null      },      "txRequestId": "string",      "tokenAddress": "string",      "status": "string",      "poolId": "string",      "hookAddress": "string",      "trustManifestAddress": "string",      "predictedTrustManifestAddress": "string",      "trustManifestTx": {        "chainId": 0,        "to": "string",        "data": "string",        "value": "string"      },      "trustManifestState": "none",      "venueAvailable": true,      "venueBlockedReason": "string",      "createdAt": "string",      "updatedAt": "string",      "reconcileReason": "string",      "reconcileDetail": "string"    }  ]}

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.

Build a token launch POST

Validates the launch parameters against the provider's limits and builds the unsigned transaction that creates the token. The server does not sign and does not send: `transactions` is what the caller takes to their own wallet. A launch with any entry in `problems` has no `transactions`. Every problem is a plain sentence naming what to fix, so a caller can read them back to the user one at a time. Those problems are the caller's to fix, which is why they are a 201 with an empty `transactions` array rather than a failure: the launch is recorded, and it is unfinished. A **blocked venue** is a different thing and answers 409 (`provider_blocked`) with nothing recorded. No parameter the caller sends can unblock a venue, so recording a launch for one would imply a launch that can progress when it never can. `pons-v2`, `hookr`, `orbio` and `venue-adapter` are all blocked on every chain: use `erc20-direct` today. `GET /launches/venues` lists every venue with the reason it is closed, and a stored launch carries the same reason on `venueAvailable` / `venueBlockedReason`, so a client never reads two different explanations of one venue's state. A **mainnet launch beyond the daily allowance** answers 429 (`free_launch_quota_exceeded`) with nothing recorded. §6.3 gives the free Launch Kit's mainnet step to the first launch per day; a testnet or fork launch is never counted against it. Read the allowance and the mainnet deploy fee with `GET /launches/fee` before signing — the fee is quoted, not discovered in the transaction the user is about to sign.