# Token launch metadata

> Upload a new Solana token's name, symbol, links and image to POST /v1/launch/metadata, put the returned Metaplex uri on chain, and read launched tokens back from GET /v1/launch/metadata.

Source: https://docs.layerhop.com/guides/launch-metadata

LayerHop hosts the metadata and image of tokens created with LayerHop Launch on app.layerhop.com. The Create page uploads the token's name, symbol, links and image to `POST /v1/launch/metadata` before it builds the mint transaction, and puts the returned `uri` in the token's on-chain metadata. Wallets and explorers then read the token's name and logo from that URI. Every route is public (no API key).

> [!NOTE]
> This is content LayerHop hosts, not market data. LayerHop can hide a token from its site and from these routes (a takedown). Creators are responsible for their token's name and image.

## How do I upload a token's metadata?

Send `multipart/form-data` with the text fields and the image as a file part named `image`:

```bash
curl -X POST https://api.layerhop.com/v1/launch/metadata \
  -F "mint=5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG" \
  -F "creator=9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM" \
  -F "name=Doge Hop" \
  -F "symbol=DHOP" \
  -F "description=The dog that hops chains." \
  -F "website=https://dogehop.example" \
  -F "image=@logo.png"
```

```json
{
  "mint": "5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG",
  "uri": "https://api.layerhop.com/v1/launch/metadata/5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG.json",
  "image": "https://api.layerhop.com/v1/launch/metadata/5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG/image"
}
```

| Field | Rule |
|---|---|
| `mint` | Required. The new token's mint, a base58 Solana public key |
| `creator` | Required. The creator's wallet, a base58 Solana public key |
| `name` | Required. 1 to 32 characters |
| `symbol` | Required. 1 to 10 characters of `A-Z`, `a-z`, `0-9` or `$` |
| `description` | Optional. Up to 500 characters |
| `website`, `twitter`, `telegram` | Optional. `http(s)` URLs of up to 200 characters |
| `image` | Required file. At most 1 MB; PNG, JPEG, WebP or GIF |

The image type is detected from the file's bytes, not its name: anything else (SVG, HEIC, a renamed file) gets [`LAUNCH_IMAGE_INVALID`](/errors/LAUNCH_IMAGE_INVALID). A field that breaks a rule gets `INVALID_PARAMS`. Each IP can upload 10 times per hour (`RATE_LIMITED` after that, with `retry-after`); re-sending an upload identical to the stored one returns 200 and does not count. A `creator` can have at most 5 pending uploads, meaning metadata whose mint is not on chain yet (`INVALID_PARAMS` after that). Uploads whose mint never appears on chain are deleted after 24 hours.

## Can I change the metadata after uploading?

Upload again with the same `mint` and the same `creator`: it replaces the stored metadata as long as the mint doesn't exist on chain yet. Once the token is created, its metadata is final. An upload for a mint that another `creator` already used is `INVALID_PARAMS`. To change anything after launch, create the token with a fresh mint.

## How do I read a token's metadata?

The `uri` serves the token's Metaplex JSON (`Cache-Control: public, max-age=300`):

```bash
curl https://api.layerhop.com/v1/launch/metadata/5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG.json
```

```json
{
  "name": "Doge Hop",
  "symbol": "DHOP",
  "description": "The dog that hops chains.",
  "image": "https://api.layerhop.com/v1/launch/metadata/5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG/image",
  "external_url": "https://dogehop.example",
  "extensions": { "website": "https://dogehop.example" },
  "createdOn": "https://app.layerhop.com"
}
```

`GET /v1/launch/metadata/{mint}/image` returns the image bytes with their content type (`Cache-Control: public, max-age=86400`). An unknown or hidden mint is `NOT_FOUND` on both. These two routes are outside the usual rate limit; each IP can make 600 requests per minute to them (`RATE_LIMITED` after that).

## How do I list launched tokens?

`GET /v1/launch/metadata?mints=<mint>,<mint>,…` returns the stored metadata of up to 100 mints, in the order you asked, with the image URL instead of the bytes. Unknown and hidden mints are left out:

```bash
curl "https://api.layerhop.com/v1/launch/metadata?mints=5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG"
```

```json
{
  "data": [
    {
      "mint": "5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG",
      "creator": "9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
      "name": "Doge Hop",
      "symbol": "DHOP",
      "description": "The dog that hops chains.",
      "image": "https://api.layerhop.com/v1/launch/metadata/5ZWj7a1f8tWkjBESHKgrLmXshuXxqeY9SYcfbshpAqPG/image",
      "website": "https://dogehop.example",
      "twitter": null,
      "telegram": null,
      "createdAt": "2026-10-25T12:00:00.000Z"
    }
  ]
}
```

A self-hosted API without a database answers `NOT_FOUND` for uploads and single tokens, and an empty list. Every field is in the [API reference](/api-reference#launch).
