---
title: "Create project API key"
method: POST
path: "/v1/projects/{projectId}/api-keys"
tags: ["Projects"]
---

# Create project API key

`POST /v1/projects/{projectId}/api-keys`

Creates an API key scoped to the project. The full key is returned once.

## Path parameters

- `projectId` string, required — Project identifier.

## Request body

- object — Create API key request body.
  - `name` string, required — Friendly name for the API key.
  - `description` string — Optional key description.
  - `role` 'api_admin' | 'api_developer' | 'api_readonly' — Role assigned to this API key.
  - `permissions` string[] — Optional explicit permission set. Requires admin access.
  - `walletScope` 'all' | 'selected', required — Explicit wallet access mode. Use 'all' to allow every wallet in scope or 'selected' to bind specific wallets.
  - `allowedIps` string[] — Optional list of IPv4/IPv6 addresses or CIDR ranges allowed to use the key.
  - `expiresAt` string, date-time — Optional expiration timestamp.
  - `signingWalletId` string — Optional default custody wallet ID to bind this key to.
  - `signingWalletIds` string[] — Optional list of custody wallet IDs to bind to this key. The first wallet becomes default unless signingWalletId is explicitly set.
  - `walletBindings` object[] — Optional wallet-level permission bindings. Use this to attach multiple wallets with scoped permissions.
    - `walletId` string, required
    - `permissions` string[]
  - `provisionWallet` union — Set true to provision for the effective custody target, or provide a connectionId object to provision for an exact Custody Connection.
    - boolean
    - object
      - `connectionId` string, required
  - `walletLabel` string — Optional label for a provisioned wallet.
  - `walletPurpose` 'root' | 'mint_authority' | 'freeze_authority' | 'fee_payer' | 'transfer' — Optional purpose for a provisioned wallet.

## Response `201`

Project API key created

- object — Standard success response envelope.
  - `data` object, required — API key create response payload.
    - `apiKey` object, required — API key details.
      - `id` string, required — API key identifier.
      - `name` string, required — API key name.
      - `key` string, required — Full API key. Only returned once.
      - `keyPrefix` string, required — API key prefix for display.
      - `role` 'api_admin' | 'api_developer' | 'api_readonly', required — API key role.
      - `environment` 'sandbox' | 'production', required — API key environment.
      - `expiresAt` string, date-time, nullable, required — Expiration timestamp, if set.
      - `createdAt` string, date-time, required — Creation timestamp.
  - `meta` object, required — Response metadata.
    - `requestId` string, required — Request identifier for tracing.
    - `timestamp` string, date-time, required — ISO 8601 timestamp.

## Other responses

- `400` — Error
- `401` — Error
- `403` — Error
- `404` — Error
- `409` — Error
- `500` — Error
- `503` — Error

---

[API](https://skmtc.net/solana/apis/solana-developer-platform-api.md) · [All operations](https://skmtc.net/solana/apis/solana-developer-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/solana/solana-developer-platform-api/revisions/672b1916ba61/schema)
