> For the complete documentation index, see [llms.txt](https://docs.feel.cash/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.feel.cash/developers-and-integrators/x402-launches.md).

# Launch with x402

Learn how AI agents launch coins on Feel.cash through x402 payments on Base, with supported chains, request formats, and launch constraints.

AI agents can launch a coin on Feel.cash by paying exactly **1 USDC on Base** through x402 v2. No Feel account is required at launch time.

The v1 route supports Base and Robinhood Chain. Every market uses the standard Feel configuration and a WETH pair. Developer buys, custom curves, custom fee recipients, and stock-token pairs are not supported.

## Paste this into your agent

If your agent can make x402 payments (any wallet it can sign from with at least 1 USDC on Base), copy this prompt, describe your coin, and let it run the whole flow:

{% code title="Prompt" overflow="wrap" %}

```
Launch a coin for me on Feel.cash using x402.
Docs: https://docs.feel.cash/developers-and-integrators/x402-launches

1. POST https://api.feel.cash/v1/launches with a fresh UUID in the
   Idempotency-Key header and the JSON body {"prompt": "<my coin>"}.
2. The API replies 402 Payment Required. Decode the PAYMENT-REQUIRED header
   with an x402 v2 client and pay exactly 1 USDC on Base (eip155:8453) from
   my wallet, using the payTo address from the signed challenge.
3. Repeat the identical POST with the PAYMENT-SIGNATURE header attached.
4. Poll the returned statusUrl until status is "succeeded", then send me
   launch.url, launch.tokenAddress, and launch.explorerUrl.

My coin: <name, ticker, one-line description, and chain (base or robinhood)>.
```

{% endcode %}

The rest of this page documents the same flow in detail.

## Endpoint

```
POST https://api.feel.cash/v1/launches
```

Send a UUID in `Idempotency-Key`. Reusing the same key with the same request returns the same job; reusing it with different content returns `409`.

You can provide one natural-language prompt:

```bash
curl -i https://api.feel.cash/v1/launches \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 2d5a8822-2ca8-4ad1-99fe-823bbac44b83' \
  -d '{
    "prompt": "Launch a small chrome oracle called Glint on Base"
  }'
```

Or send explicit fields:

```json
{
  "name": "Glint",
  "symbol": "GLINT",
  "description": "A small chrome oracle",
  "chain": "base",
  "imagePrompt": "A luminous chrome oracle orb on a black background",
  "socials": {
    "website": "https://glint.example"
  }
}
```

The request must contain `prompt`, or both `name` and `symbol`. Explicit fields override instructions inferred from the prompt. `chain` is `base` or `robinhood`; it defaults to Base when it cannot be inferred.

An image can be supplied as inline JPEG, PNG, or WebP base64. Trusted Feel CDN URLs are also accepted. Arbitrary external image URLs are rejected; agents can download those images themselves and send the bytes as base64. All text and images are moderated before payment settles, so rejected content is not charged.

## Payment flow

The first request returns `402 Payment Required` and a `PAYMENT-REQUIRED` header. Decode it with an x402 v2 client. The accepted requirement is always:

| Field   | Value                        |
| ------- | ---------------------------- |
| Scheme  | `exact`                      |
| Network | `eip155:8453` (Base)         |
| Asset   | Base USDC                    |
| Amount  | `1000000` raw units (1 USDC) |
| Pair    | WETH                         |

The `payTo` address and payment timeout come from the signed challenge and must not be hardcoded by clients. The buyer signs the EIP-3009 authorization; the Coinbase facilitator submits the USDC transfer and sponsors settlement gas. Feel never needs the buyer's private key.

Repeat the identical request with the encoded payment:

```http
PAYMENT-SIGNATURE: <base64 x402 PaymentPayload>
```

After settlement the API returns a durable job. The paid POST returns `202` while deployment is still processing and `201` when deployment finishes in the same request:

```json
{
  "id": "2d5a8822-2ca8-4ad1-99fe-823bbac44b83",
  "status": "processing",
  "paymentStatus": "settled",
  "statusUrl": "https://api.feel.cash/v1/launches/2d5a8822-2ca8-4ad1-99fe-823bbac44b83",
  "resolved": {
    "name": "Glint",
    "symbol": "GLINT",
    "description": "A small chrome oracle",
    "imageUrl": "https://media.charms.ai/tokens/glint.jpg",
    "socials": {
      "x": null,
      "telegram": null,
      "website": "https://glint.example"
    },
    "chain": "base",
    "pairToken": null
  },
  "launch": null,
  "error": null
}
```

`resolved` is the immutable configuration produced from the explicit fields, prompt, defaults, and moderated image. In v1, `pairToken` is always `null`, which means the standard WETH pair.

Poll the returned absolute `statusUrl` until the job is terminal:

```bash
curl https://api.feel.cash/v1/launches/2d5a8822-2ca8-4ad1-99fe-823bbac44b83
```

Possible job states are `pending`, `processing`, `succeeded`, `failed`, and `refunded`. Clients should honor `Retry-After` on `429` and reuse the original idempotency key when retrying an interrupted POST.

A successful job includes the deployed coin and all links needed to display or verify it:

```json
{
  "id": "2d5a8822-2ca8-4ad1-99fe-823bbac44b83",
  "status": "succeeded",
  "paymentStatus": "settled",
  "statusUrl": "https://api.feel.cash/v1/launches/2d5a8822-2ca8-4ad1-99fe-823bbac44b83",
  "resolved": {
    "name": "Glint",
    "symbol": "GLINT",
    "description": "A small chrome oracle",
    "imageUrl": "https://media.charms.ai/tokens/glint.jpg",
    "socials": {
      "x": null,
      "telegram": null,
      "website": "https://glint.example"
    },
    "chain": "base",
    "pairToken": null
  },
  "launch": {
    "tokenId": "70eb8307-6af4-4f80-a2ce-1f2b0da784d4",
    "tokenAddress": "0x1111111111111111111111111111111111111111",
    "slug": "glint",
    "chain": "base",
    "transactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "url": "https://feel.cash/glint",
    "addressUrl": "https://feel.cash/coins/base/0x1111111111111111111111111111111111111111",
    "chainId": 8453,
    "explorerUrl": "https://basescan.org/token/0x1111111111111111111111111111111111111111"
  },
  "error": null
}
```

Use `launch.url` as the canonical human-facing coin page. It is slug-based and may be used for sharing and navigation. Use `launch.addressUrl` when the caller only knows the chain and contract address; the stable address alias resolves and permanently redirects to the canonical slug page. Supported forms are:

```
https://feel.cash/coins/base/0x...
https://feel.cash/coins/robinhood/0x...
```

`launch.explorerUrl` links directly to the chain explorer. Agents should store `chain`, `chainId`, and `tokenAddress` as the durable onchain identity rather than parsing any URL.

## Creator ownership and fees

Before account linking, the verified payment wallet is recorded as the external creator. Feel does not create a synthetic account or embedded wallet.

If the wallet owner later signs a wallet-link challenge while logged into Feel, every matching settled x402 launch is associated with that account. The coins then appear in the creator's launches and the creator can claim fees.

Creator fees accrued before linking are retained in the coin's custody wallet and recorded in an exact pending ledger. Feel and referrer shares continue to settle normally; an absent account does not block them. After linking, the creator can claim only the amount recorded for that wallet.

## Failure and refund behavior

Invalid content and other failures before settlement do not charge the payer. If a terminal failure is proven to occur after payment but before any durable coin reservation or deployment attempt, Feel refunds exactly 1 USDC to the verified payer. Once a coin has been reserved or a deployment may have been broadcast, the job follows durable retry and adoption instead of issuing a conflicting refund.

Do not submit a new authorization while a job is uncertain. Poll its status or retry the original idempotent request: Feel reconciles finalized Base-USDC events and never blindly settles the same authorization twice.

## Discovery

The payment challenge declares the x402 Bazaar discovery extension, including the request and response schemas. Agents can discover the endpoint through the Coinbase Bazaar HTTP catalog, semantic search, or MCP server after it has been indexed from a successful settlement.

## Safety

A successful launch confirms deployment, not legitimacy, quality, liquidity, future value, or endorsement. Verify the returned chain, contract address, and transaction hash independently before trading or publishing them.
