docs/ref/api.md
Headscale provides a HTTP REST API and a gRPC interface which may be used to integrate a web interface, remote control Headscale or provide a base for custom integration and tooling.
Both interfaces require a valid API key before use. To create an API key, log into your Headscale server and generate one with the default expiration of 90 days:
headscale apikeys create
Copy the output of the command and save it for later. Please note that you can not retrieve an API key again. If the API key is lost, expire the old one, and create a new one.
To list the API keys currently associated with the server:
headscale apikeys list
and to expire an API key:
headscale apikeys expire --prefix <PREFIX>
/api/v1, e.g. https://headscale.example.com/api/v1/swagger, e.g. https://headscale.example.com/swagger/version, e.g. https://headscale.example.com/versionAuthorization: Bearer <API_KEY> header.Start by creating an API key and test it with the examples below. Read the API documentation provided by your
Headscale server at /swagger for details.
=== "Get details for all users"
```console
curl -H "Authorization: Bearer <API_KEY>" \
https://headscale.example.com/api/v1/user
```
=== "Get details for user 'bob'"
```console
curl -H "Authorization: Bearer <API_KEY>" \
https://headscale.example.com/api/v1/user?name=bob
```
=== "Register a node"
```console
curl -H "Authorization: Bearer <API_KEY>" \
--json '{"user": "<USER>", "authId": "AUTH_ID>"}' \
https://headscale.example.com/api/v1/auth/register
```
The gRPC interface can be used to control a Headscale instance from a remote machine with the headscale binary.
headscale (any supported platform, e.g. Linux).50443) are allowed.Download the headscale binary from GitHub's release page. Make
sure to use the same version as on the server.
Put the binary somewhere in your PATH, e.g. /usr/local/bin/headscale
Make headscale executable: chmod +x /usr/local/bin/headscale
Create an API key on the Headscale server.
Provide the connection parameters for the remote Headscale server either via a minimal YAML configuration file or via environment variables:
=== "Minimal YAML configuration file"
```yaml title="config.yaml"
cli:
address: <HEADSCALE_ADDRESS>:<PORT>
api_key: <API_KEY>
```
=== "Environment variables"
```shell
export HEADSCALE_CLI_ADDRESS="<HEADSCALE_ADDRESS>:<PORT>"
export HEADSCALE_CLI_API_KEY="<API_KEY>"
```
This instructs the headscale binary to connect to a remote instance at <HEADSCALE_ADDRESS>:<PORT>, instead of
connecting to the local instance.
Test the connection by listing all nodes:
headscale nodes list
You should now be able to see a list of your nodes from your workstation, and you can now control the Headscale server from your workstation.
It's possible to run the gRPC remote endpoint behind a reverse proxy, like Nginx, and have it run on the same port as Headscale.
While this is not a supported feature, an example on how this can be set up on NixOS is shown here.
cli.insecure: true in the configuration file or by setting
HEADSCALE_CLI_INSECURE=1 via an environment variable. We do not recommend to disable certificate validation.