> ## Documentation Index
> Fetch the complete documentation index at: https://blank.build/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Solana Manifest

> Read the active Blank program addresses, IDL URLs, and limits from one anonymous API v2 endpoint.

# Solana Manifest

The manifest is the single source of truth for the Blank deployment you are talking to: program addresses, IDL URLs, the lookup table, and the limits in effect.

| Operation           | HTTP                   | SDK                       | Auth      |
| ------------------- | ---------------------- | ------------------------- | --------- |
| `getSolanaManifest` | `GET /solana/manifest` | `blank.system.manifest()` | Anonymous |

```ts theme={null}
const manifest = await blank.system.manifest();

console.log(manifest.data.environment);
console.log(manifest.data.programIds.tokenomics);
```

```bash theme={null}
curl -s "https://api.blank.build/api/v2/solana/manifest"
```

No API key is required. The response is cached with `public, max-age=300, stale-while-revalidate=600` and carries an `ETag`, so a conditional request with `If-None-Match` returns `304 Not Modified`.

## Fields

| Field                                | Type                                       | Meaning                                                 |
| ------------------------------------ | ------------------------------------------ | ------------------------------------------------------- |
| `apiVersion`                         | `"2"`                                      | The API contract version serving this manifest          |
| `sdkVersion`                         | string                                     | The SDK release the current contract was generated from |
| `manifestVersion`                    | string                                     | Version of the manifest document itself                 |
| `environment`                        | `development` \| `staging` \| `production` | The deployment you are calling                          |
| `programIds.dbc`                     | base58                                     | Meteora Dynamic Bonding Curve program                   |
| `programIds.feeSplitter`             | base58                                     | Blank fee splitter program                              |
| `programIds.staking`                 | base58                                     | Blank staking program                                   |
| `programIds.tokenomics`              | base58                                     | Blank tokenomics program                                |
| `idl.feeSplitter`                    | url                                        | Anchor IDL for the fee splitter                         |
| `idl.staking`                        | url                                        | Anchor IDL for staking                                  |
| `idl.tokenomics`                     | url                                        | Anchor IDL for tokenomics                               |
| `lookupTable`                        | base58 \| null                             | Address lookup table used to keep transactions small    |
| `launchSigner`                       | base58                                     | Blank's launch signer public key                        |
| `limits.activeApiKeysPerEnvironment` | integer                                    | Maximum active API keys per environment                 |
| `limits.metadataUriBytes`            | integer                                    | Maximum metadata URI length in bytes                    |
| `limits.transactionSafeBytes`        | integer                                    | Blank's transaction size safety gate                    |
| `limits.transactionSolanaBytes`      | integer                                    | Solana's hard transaction size limit                    |

<Tip>
  Never hardcode a program address. Read the manifest at startup, or on a
  sensible cadence, so a program upgrade does not require a redeploy. Fetch the
  IDLs from the `idl.*` URLs rather than vendoring them.
</Tip>

## Environments

The manifest always describes the deployment that served it. Program addresses differ between `development`, `staging`, and `production` — assert on `environment` before you trust the addresses:

```ts theme={null}
const manifest = await blank.system.manifest();

if (manifest.data.environment !== "production") {
  throw new Error(`Expected production, got ${manifest.data.environment}`);
}
```

## Errors

| Status | Code                   | Meaning                                     |
| ------ | ---------------------- | ------------------------------------------- |
| 503    | `manifest_unavailable` | Manifest state could not be read; retryable |

Shared errors apply. See [Errors](/docs/reference/errors).

For the mainnet program addresses as published documentation, see [Contracts](/docs/reference/contracts).
