> Solana Developer Platform docs, served as Markdown. The [docs index](https://platform-beta.solana.com/docs.md) lists every page and [llms.txt](https://platform-beta.solana.com/docs/ai/llms.txt) the key ones; [SKILL.md](https://platform-beta.solana.com/SKILL.md) has the rules for building on SDP.

# Core concepts

The interfaces, environments, and conventions you build against.

SDP has two interfaces over the same API:

- **Dashboard:** the browser UI. Sign in with email, Google, or GitHub.
- **REST API:** programmatic access for backend integrations. Requests authenticate with an API key in the `Authorization` header.

Both call the same API, and each route requires the same action whoever calls it. A signed-in member holds actions through their organization role; an API key holds the grants you give it. Some routes are for signed-in members only, such as managing API keys, members, and the organization, or setting up a custody provider. An API key is refused them.

Build against the API for automation and integrations. Use the dashboard to set up your organization, inspect state, and run one-off operations.

## Environments

An environment belongs to the **project**, not to individual requests. Every tenant resource and API key belongs to a project and inherits its environment.

| Environment  | Network      |
| ------------ | ------------ |
| `sandbox`    | devnet       |
| `production` | mainnet-beta |

A key's format doesn't name its environment; the project it belongs to does.

Both environments expose the same route shapes. Build and test against your sandbox project, then move to production with a production project's API key. [Go to mainnet](/docs/guides/go-to-mainnet) covers requesting access and setting up your production wallets and API key.

## Response conventions

Every successful response wraps its payload in a `data` envelope with request metadata:

```json
{
  "data": { ... },
  "meta": { "requestId": "req_...", "timestamp": "2026-07-31T12:00:00.000Z" }
}
```

Errors return a machine-readable `code` alongside a human-readable `message`:

```json
{
  "error": { "code": "INVALID_API_KEY", "message": "Invalid API key" },
  "meta": { "requestId": "req_..." }
}
```

Include the `requestId` when you report an issue. It links your request to SDP's traces.

## Execution model

For a custody operation, SDP builds the transaction, signs it with the configured custody wallet, and submits it.

## Read next

- [Authentication](/docs/developing-with-sdp/authentication) covers project keys and access checks.
- [API keys](/docs/developing-with-sdp/manage-api-keys) covers grants and wallet scope.
- [Idempotency](/docs/developing-with-sdp/idempotency) covers safe retries.
- [API conventions](/docs/reference/conventions) covers errors, pagination, limits, and versioning.
