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

# Get project provider availability

Lists every provider this deployment's release channel publishes, with whether this project can use it, counting the deployment's provider credentials for the project's environment.

`GET /v1/projects/{projectId}/provider-availability`

The same rule gates every provider entry point, so a provider reported unavailable is refused there with 403, or 503 when the deployment does not hold its credentials. A project outside the caller's organization, or another project for a project-bound API key, returns 404.

Requires an [API key](/docs/developing-with-sdp/authentication) with the `projects.read` action.

## Path parameters

- **`projectId`** · `string` · required · min length 1 · example `prj_example`

  Project identifier.

## Responses

- **`200`** Project provider availability

  - **`data`** · `object` · required

    Every provider this deployment's release channel publishes, with whether this project can use it; a provider the channel leaves out is omitted, matching this document. Custody entries list the custody modes the project can set the provider up in (empty when none) in `modes`, and each refused mode with the first failed check in `unavailableModes`; every other entry carries `available`, plus `reason` naming the first failed check when unavailable. A provider is available only when the deployment's release channel includes it, SDP currently offers it, the organization is entitled to it, and the deployment holds its credentials for the project's environment; the release channel offers the same providers to Sandbox and Production projects. Custody `modes` include `managed` only in a Sandbox project whose deployment holds the provider's credentials; `byok` runs on the organization's own credentials and is the only mode a Production project can use.

    - **`projectId`** · `string` · required

    - **`environment`** · `string` · required · one of `sandbox`, `production`

    - **`providers`** · `object[]` · required

      One of:

      - **family: "custody"**

        - **`family`** · `string` · required · always `custody`

        - **`provider`** · `string` · required · one of `local`, `fireblocks`, `privy`, `coinbase_cdp`, `para`, `turnkey`, `dfns`, `ibm_haven`, `anchorage`, `utila`

        - **`modes`** · `string[]` · required · each one of `managed`, `byok`

        - **`unavailableModes`** · `object[]` · required

          - **`mode`** · `string` · required · one of `managed`, `byok`

          - **`reason`** · `string` · required · one of `custody_provider_not_in_release_channel`, `custody_mode_not_allowed`, `provider_not_entitled`, `provider_not_in_release_channel`, `provider_not_offered`, `provider_not_configured`

  - **`meta`** · `object` · required

    Response metadata.

    - **`requestId`** · `string` · required · min length 1 · example `req_example`

      Request identifier for tracing.

    - **`timestamp`** · `string` · required · format `date-time` · example `2025-01-01T00:00:00.000Z`

      ISO 8601 timestamp.

- **`401`** Unauthorized

  - **`error`** · `object` · required

    Standard error payload.

    - **`code`** · `string` · required

      Machine-readable error code.

    - **`message`** · `string` · required

      Human-readable error message.

    - **`details`** · `object`

      Optional error details for debugging.

      - **`*`** · `any`

  - **`meta`** · `object`

    - **`requestId`** · `string` · min length 1 · example `req_example`

      Request identifier for tracing.

- **`403`** Forbidden. Requires the `projects.read` action: an API key must hold it (a module's `manage` or `execute` also covers its `read`), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS and `error.details.action` names the action. Any other 403 names its own reason.

  Same fields as `401`.

- **`404`** Not Found

  Same fields as `401`.

- **`500`** Internal Server Error

  Same fields as `401`.

## Example request

```bash tab="cURL"
curl 'https://api.solana.com/v1/projects/prj_example/provider-availability' \
  -H "Authorization: Bearer $SDP_API_KEY"
```

```ts tab="TypeScript"
const res = await fetch("https://api.solana.com/v1/projects/prj_example/provider-availability", {
  method: "GET",
  headers: {
    Authorization: `Bearer ${process.env.SDP_API_KEY}`
  }
});
```

```python tab="Python"
import os, requests

r = requests.get("https://api.solana.com/v1/projects/prj_example/provider-availability",
  headers={"Authorization": f"Bearer {os.environ['SDP_API_KEY']}"})
```

## Example responses

```json tab="200"
{
  "data": {
    "projectId": "prj_example",
    "environment": "production",
    "providers": [
      {
        "family": "custody",
        "provider": "privy",
        "modes": [
          "byok"
        ],
        "unavailableModes": [
          {
            "mode": "managed",
            "reason": "custody_mode_not_allowed"
          }
        ]
      },
      {
        "family": "custody",
        "provider": "fireblocks",
        "modes": [],
        "unavailableModes": [
          {
            "mode": "managed",
            "reason": "custody_mode_not_allowed"
          },
          {
            "mode": "byok",
            "reason": "custody_provider_not_in_release_channel"
          }
        ]
      }
    ]
  },
  "meta": {
    "requestId": "req_example",
    "timestamp": "2025-01-01T00:00:00.000Z"
  }
}
```

```json tab="403"
{
  "error": {
    "code": "INSUFFICIENT_PERMISSIONS",
    "message": "Missing action: projects.read",
    "details": {
      "action": "projects.read"
    }
  },
  "meta": {
    "requestId": "req_example"
  }
}
```

Error responses use the [standard error shape](/docs/reference/conventions/errors).
