---
title: Authentication
description: Learn how to authenticate API requests using API keys or the device authorization flow
---
All API endpoints require authentication. Kaneo currently supports two authentication patterns for API access:
- API keys for scripts, services, and long-lived integrations
- Device authorization for CLIs and external apps that need browser-based sign-in
## Choose an Authentication Method
### API keys
Use API keys when you control secret storage and want a stable credential for a single Kaneo instance.
### Device authorization
Use the device flow when you are building a CLI, desktop app, or other client that should send the user to the browser to approve access.
The device flow follows RFC 8628 and returns a Bearer token that can be used against that Kaneo instance's API.
## Creating an API Key
**Sign in to Kaneo**
Sign in to your Kaneo instance using your account credentials.
**Navigate to Settings**
Go to your account settings by clicking on your profile or navigating to the Settings page.
**Open the Account Tab**
In the Settings page, click on the **Account** tab to view your account settings.
**Access API Keys Section**
Scroll down to the **API Keys** section in the Account tab. This section is located under the Developer Settings.
**Create a New API Key**
Click the **Create API Key** button to generate a new API key. You'll be prompted to provide a name for your API key to help you identify it later.
**Save Your API Key**
After creating the API key, you'll be shown the full API key value. **Copy and save this key immediately** - it will not be shown again for security reasons.
**Important**: Store your API key securely. If you lose it, you'll need to create a new one. The API key cannot be retrieved after creation.
## Using Your API Key
Once you have your API key, include it in the `Authorization` header of all API requests using the Bearer token format:
```bash
Authorization: Bearer your-api-key-here
```
### Example Request
Here's an example of making an authenticated API request using curl:
```bash
curl -X GET https://your-kaneo-instance.com/api/task?workspaceId=your-workspace-id \
-H "Authorization: Bearer your-api-key-here" \
-H "Content-Type: application/json"
```
### Example with JavaScript
```javascript
const response = await fetch('https://your-kaneo-instance.com/api/task?workspaceId=your-workspace-id', {
method: 'GET',
headers: {
'Authorization': 'Bearer your-api-key-here',
'Content-Type': 'application/json'
}
});
```
## Using Device Authorization
By default, self-hosted Kaneo allows the built-in device clients `kaneo-cli` and `kaneo-mcp`.
If you want to use a different device client ID, the instance operator must allow it through `DEVICE_AUTH_CLIENT_IDS`.
### Flow overview
1. Your app requests a device code from `/api/auth/device/code`
2. Kaneo returns a `device_code`, `user_code`, polling interval, and verification URL
3. The user opens the verification URL in a browser and signs in
4. The user approves the request
5. Your app polls `/api/auth/device/token` until an access token is issued
6. Your app sends API requests with `Authorization: Bearer `
### Request a device code
```bash
curl -X POST https://your-kaneo-instance.com/api/auth/device/code \
-H "Content-Type: application/json" \
-d '{"client_id":"your-app-id"}'
```
Example response:
```json
{
"device_code": "dev_123",
"user_code": "ABCD-1234",
"verification_uri": "https://your-kaneo-instance.com/device",
"verification_uri_complete": "https://your-kaneo-instance.com/device?user_code=ABCD-1234",
"interval": 5,
"expires_in": 600
}
```
### Poll for a token
```bash
curl -X POST https://your-kaneo-instance.com/api/auth/device/token \
-H "Content-Type: application/json" \
-d '{
"grant_type":"urn:ietf:params:oauth:grant-type:device_code",
"device_code":"dev_123",
"client_id":"your-app-id"
}'
```
While waiting for approval, Kaneo may return:
- `authorization_pending`
- `slow_down`
- `invalid_client`
- `expired_token`
Once approved, Kaneo returns an access token:
```json
{
"access_token": "your-access-token",
"token_type": "Bearer"
}
```
### Use the returned token
```bash
curl -X GET https://your-kaneo-instance.com/api/task?workspaceId=your-workspace-id \
-H "Authorization: Bearer your-access-token"
```
## Security Best Practices
- **Keep your API keys secret**: Never commit API keys to version control or share them publicly
- **Use descriptive names**: Name your API keys clearly so you can identify their purpose (e.g., "Production Script", "Development Testing")
- **Rotate keys regularly**: Periodically create new API keys and revoke old ones
- **Limit key scope**: Only grant API keys to trusted applications and services
- **Monitor usage**: Regularly review your API keys and remove any that are no longer needed
- **Allow only trusted device clients**: Keep `DEVICE_AUTH_CLIENT_IDS` limited to approved client IDs on self-hosted deployments
- **Treat Bearer device tokens like secrets**: Do not print or log them unnecessarily in production clients
If you suspect your API key has been compromised, immediately revoke it in the API Keys section and create a new one.