> 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/api.md).

# Public API v1

Integrate Feel.cash Public API v1 to discover launches and retrieve coin data, using public endpoints, cursor pagination, and polling.

The Feel.cash API gives exchanges, indexers, wallets, screeners, and trading surfaces a coin-first view of supported launches. Public API v1 is live on `api.feel.cash`.

## Base URL

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

Public launch data does not require authentication.

## Delivery and versioning

Public API v1 is **polling-only**. Feel.cash does not currently deliver launch webhooks, and there is no public sandbox or testnet API. Build against the production endpoint with conservative polling, cursor persistence, idempotent upserts, and retry handling.

The fields documented on this page are the stable v1 contract. Feel.cash can add fields without changing the version, so clients should ignore unknown fields. A breaking response or endpoint change will use a new API version.

## List launches

```http
GET /launches
```

```bash
curl "https://api.feel.cash/v1/launches?chain=base&limit=50"
```

### Query parameters

| Parameter       | Description                                   |
| --------------- | --------------------------------------------- |
| `chain`         | `base` or `robinhood`                         |
| `protocol`      | `doppler` or `clanker`                        |
| `launchedAfter` | ISO date or timestamp for incremental polling |
| `limit`         | Default `50`; maximum `100`                   |
| `cursor`        | Opaque cursor returned by the previous page   |

Do not combine `cursor` and `launchedAfter` in the same request.

Protocol is deployment metadata, not coin identity. Always use chain plus contract address as the primary key.

The list response wraps records and cursor state separately:

```json
{
  "launches": [],
  "pagination": {
    "limit": 50,
    "nextCursor": null,
    "hasMore": false
  }
}
```

## Resolve a coin

```http
GET /launches/:chain/:address
```

Live Base example with `officialFeelLaunch: true`:

```bash
curl "https://api.feel.cash/v1/launches/base/0x81bf939ca730ed2be27b37b7581b1a278aeafee1"
```

Live Robinhood Chain provenance example with `officialFeelLaunch: false`, illustrating why integrators must read the flag:

```bash
curl "https://api.feel.cash/v1/launches/robinhood/0xa5836d4ee8fd469bc4e2b06592651f3c1ebbfee1"
```

Resolution always uses the chain and complete contract address together. Never use an EVM address without its chain.

## Selected response fields

The response below shows the fields most useful to an exchange integration. Nullable fields remain `null` when the source is unavailable.

```json
{
  "id": "00000000-0000-4000-8000-000000000001",
  "slug": "example-coin",
  "url": "https://feel.cash/example-coin",
  "contractAddress": "0x111111111111111111111111111111111111fee1",
  "chain": "base",
  "chainId": 8453,
  "name": "Example Coin",
  "symbol": "EXAMPLE",
  "decimals": 18,
  "description": "An example internet-native coin.",
  "imageUrl": "https://cdn.example.com/example.webp",
  "launchedAt": "2026-08-07T12:00:00Z",
  "officialFeelLaunch": true,
  "deployment": {
    "protocol": "doppler",
    "airlockAddress": "0x660eaaedebc968f8f3694354fa8ec0b4c5ba8d12",
    "integratorAddress": "0x3879b1ee8389ffefb7afd51b1bafb9faf23d6699",
    "createTransactionHash": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  },
  "market": {
    "poolId": "0x...",
    "numeraireAddress": "0x...",
    "numeraireSymbol": "WETH",
    "startingFdvUsdTarget": 10000,
    "marketFeeBps": 150,
    "lpFeeBps": 0,
    "antiSniperStartFeeBps": 5000,
    "antiSniperDecaySeconds": 15
  },
  "fees": {
    "creatorEffectiveBps": 95,
    "feelEffectiveBps": 32.5,
    "referrerEffectiveBps": 15,
    "protocolEffectiveBps": 7.5,
    "settlementChain": "base",
    "settlementAsset": "USDC",
    "netPotSplit": {
      "creator": 38,
      "feel": 13,
      "referrer": 6,
      "denominator": 57
    }
  },
  "metrics": {
    "priceUsd": 0.00001,
    "marketCapUsd": 10000,
    "circulatingMarketCapUsd": 10000,
    "liquidityUsd": 9000,
    "volume24hUsd": 1200,
    "change24hPercent": 4.2,
    "holders": 42,
    "lastUpdatedAt": "2026-08-07T12:05:00Z"
  },
  "creator": {
    "username": "example",
    "xHandle": "example"
  },
  "explorerUrl": "https://basescan.org/token/0x111111111111111111111111111111111111fee1"
}
```

## Fee precision

Display rates can use decimal basis points. Accounting systems should use the exact split returned in `fees.netPotSplit` and confirm settled onchain transfers.

```json
{ "creator": 38, "feel": 13, "referrer": 6, "denominator": 57 }
```

The split applies to the distributable market-fee balance after the protocol share has been retained. Do not recalculate payouts from rounded display rates.

## Official launch status

`officialFeelLaunch: true` means the launch is recognized by Feel.cash deployment records and onchain attribution. It is an officiality signal, not a contract audit, price guarantee, or endorsement.

## Onchain launch proof

For a Doppler launch, `deployment` exposes the chain-specific Airlock, Feel.cash integrator, and successful creation transaction. Together with the transaction's `Create` event, those fields form the [onchain launch proof](/developers-and-integrators/contracts.md#onchain-launch-proof). An exchange can use them to reproduce the [onchain launch filter](/developers-and-integrators/integration-guide.md#onchain-launch-filter).

The Airlock identifies the Doppler deployment system. The integrator identifies Feel.cash inside the decoded `Airlock.create()` input. The transaction receipt's `Create` event identifies the deployed asset.

Legacy records can use another `protocol` and return `null` for protocol-specific fields. Historical Doppler records can also have `null` fee-split or deployment fields when that source data was not recorded. A missing field must not be replaced with a current default when indexing historical launches.

Treat `name`, `symbol`, `description`, `imageUrl`, creator fields, and linked metadata as untrusted user content. Escape text for its output context, validate or proxy remote media, and never use a display field as coin identity.

## Errors

| Status | Meaning                                                      |
| -----: | ------------------------------------------------------------ |
|  `400` | Invalid chain, address, cursor, filter, or query combination |
|  `404` | No supported launch found for that chain and address         |
|  `429` | Rate limit exceeded                                          |
|  `500` | Internal query failure                                       |

```json
{ "error": "Launch not found", "code": "launch_not_found" }
```

## Caching and polling

Responses can include:

```
Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=600
```

The public launch API currently allows 120 requests per 60-second window per IP. Read `RateLimit-Limit`, `RateLimit-Remaining`, and `RateLimit-Reset` instead of hardcoding retry timing; a limited response can also include `Retry-After`.

Use `launchedAfter` for incremental ingestion, preserve the returned cursor for pagination, and apply exponential backoff after `429` or `5xx` responses.

For resilient ingestion, query from an overlapping time window, follow every cursor before advancing the checkpoint, and upsert by `(chainId, contractAddress)`. Periodically reconcile older history. The overlap protects against late-arriving records and same-timestamp launches; `launchedAfter` is not a finality or update cursor.

Market metrics are eventually consistent. Onchain contracts, launch configuration, and pool events are authoritative for immutable fields.

## Legacy migration

Move historical integrations to `/v1/launches`. The v1 interface uses canonical Feel.cash URLs and identifies coins by chain plus contract address while retaining supported [legacy coin](/more/legacy-coins.md) records.
