# API overview

> Overview of the FeatherPanel REST API. Route groups, authentication options, the response format, the OpenAPI spec and where to find every endpoint.

Source: https://featherpanel.com/docs/api/

Everything the FeatherPanel frontend does goes through the same REST API under `/api`, so anything you can click you
can script. The [endpoint reference](https://featherpanel.com/docs/api/reference) lists every route with its method, auth type and permission.

## Route groups

| Prefix | Who calls it | Auth |
|--------|--------------|------|
| `/api/user/...` | Signed-in users and their API keys: account, servers, VDS, WebSpaces, tickets | Session or API key |
| `/api/admin/...` | Staff with the matching admin permission | Session or API key of a staff user, plus a permission node |
| `/api/wings/...`, `/api/remote/...` | FeatherWings nodes | Node token |
| `/api/quilld-remote/...` | FeatherQuilld nodes | Node token |
| `/api/system/...`, `/api/knowledgebase/...` | Public settings, knowledge base and similar | Mostly public |

Admin routes check a permission node such as `admin.users.list`. See the [permissions reference](https://featherpanel.com/docs/reference/permissions).

## Authentication

Send an API key as a Bearer token:

```bash
curl -H "Authorization: Bearer YOUR_PRIVATE_KEY" https://panel.example.com/api/user/session
```

API keys act as the user who created them. Details, OAuth2 and IP allow lists are on
[Authentication](https://featherpanel.com/docs/api/authentication).

## Response format

Every response is JSON with the same envelope:

```json
{
  "success": true,
  "message": "OK",
  "data": { },
  "error": false,
  "error_message": null,
  "error_code": null
}
```

Errors set `success` to `false`, fill `error_message` and `error_code` (for example `INVALID_API_KEY` or
`RATE_LIMITED`) and add an `errors` array with `code`, `detail` and `status`. Always branch on `error_code`, not the
message text.

## OpenAPI

`GET /api/openapi.json` returns the OpenAPI document built from the route annotations. Load it into Postman, Insomnia
or a code generator.

## Rate limits

Routes can carry a rate limit. When you hit one, the panel answers `429` with `error_code` `RATE_LIMITED`, a
`retry_after` value in `data` and a `Retry-After` header in seconds. Back off for that long before retrying.

## Other ways in

- [FeatherCli](https://featherpanel.com/docs/cli/feathercli) wraps the user API for servers, files, backups and more.
- The [MCP server](https://featherpanel.com/docs/panel/mcp-server) exposes panel actions to AI assistants.

## Frequently asked questions

### Is there an OpenAPI specification?

Yes. GET /api/openapi.json on your panel returns the OpenAPI document generated from the route annotations. It needs no authentication.

### Is the FeatherPanel API compatible with the Pterodactyl API?

No. It uses its own paths and response format. The panel ships a compatibility layer for the Calagopus client API instead, under the same API keys.
