putty
API ReferenceArtifacts

Declare this launch's trust manifest

Records the `PuttyTrustModule` the creator deployed for this token, which is what the Receipts page expands to list the token's modules. Send `null` to withdraw the declaration. The address is a claim, not a verification: the page reads every module from the chain live and drops any that do not answer, so a wrong or stale address makes the page show fewer modules, never more. Requires a launch that has already produced a token address, because the page is looked up by token. A launch belonging to another user returns the same 404 as one that does not exist.

PUT
/launches/{id}/trust-manifest

Records the PuttyTrustModule the creator deployed for this token, which is what the Receipts page expands to list the token's modules. Send null to withdraw the declaration. The address is a claim, not a verification: the page reads every module from the chain live and drops any that do not answer, so a wrong or stale address makes the page show fewer modules, never more. Requires a launch that has already produced a token address, because the page is looked up by token. A launch belonging to another user returns the same 404 as 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

Path Parameters

id*string

The launch id.

Request Body

application/json

The manifest address, or null to withdraw the declaration.

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/launches/string/trust-manifest" \  -H "Content-Type: application/json" \  -d '{    "manifestAddress": "string"  }'
{  "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"}

Read one launch, reconciling it against the chain GET

**Reading a launch reconciles it.** A launch is recorded as `awaiting_signature` and stays there until the chain says its token exists; there is no worker, so this read is what asks. When the launch is still `awaiting_signature` and the chain reports a deployed token, this route reads the creation transaction's receipt, decodes the factory's `TokenCreated` event, and records the token address — moving the launch to `live` before answering. The response is the reconciled row, and it is the same row a later read returns. The server still never signs and never broadcasts. It reads a receipt; the transaction was signed by the caller with their own wallet and reported through `POST /tx/{id}/submitted`. A launch that cannot advance yet is still a **200**, with the row unchanged and `reconcileReason` saying why: `receipt_pending` (the node answered, the receipt is not mined), `not_submitted` (the creation transaction has no reported hash yet), `venue_blocked` (this launch names a venue that cannot build a launch), or `chain_unreadable` (the node could not be reached; `reconcileDetail` carries its sentence). A launch waiting to be mined is a normal state, not a server fault, so this route does not answer 5xx for one. Poll again. A launch belonging to another user returns the same 404 as one that does not exist.

Read the research caps GET

Returns the caps the research tools enforce server-side, so a client does not have to hard-code them: how many search results, crawl pages, and posts a call may ask for, and how many bytes of scraped text come back in one result. A request above a cap is clamped, not rejected — except a value that is not a positive integer, which is a malformed call.