Skip to content

Get the key's owner and scope

GET
/whoami
curl --request GET \
--url https://app.tunnelhq.com/api/v1/whoami \
--header 'X-API-Key: <X-API-Key>'

Returns who the key belongs to and everything it can reach: workspaces (with your role in each), projects, and a default project to use in X-Project-Id. A workspace key sees its own workspace; an account-wide key sees every workspace you belong to. The API calls workspaces organizations.

Need an API key? See Getting an API key.

The key’s owner and scope.

Media typeapplication/json
object
user
required
object
id
required
integer
email
required
string
username
required
string
display_name
required
string | null
organizations
required
Array<object>

A workspace. The API calls workspaces organizations.

object
id
required
integer
name
required
string
description
required
string | null
role
required

Your role in it.

string
Allowed values: Owner Admin Manager Viewer Guest
projects
required
Array<object>
object
id
required
integer
slug
required

The project’s ID for X-Project-Id, such as prj_12.

string
name
required
string
description
required
string | null
organization_id
required
integer
monitor_count
required

VPN monitors in the project.

integer
active
required
boolean
default_organization_id
required
integer | null
default_project_id
required
integer | null
default_project_slug
required

The default project, ready for X-Project-Id.

string | null
Example
{
"user": {
"id": 7,
"email": "[email protected]",
"username": "[email protected]",
"display_name": "Ops"
},
"organizations": [
{
"id": 3,
"name": "Your Company",
"description": null,
"role": "Owner"
}
],
"projects": [
{
"id": 12,
"slug": "prj_12",
"name": "Europe",
"description": null,
"organization_id": 3,
"monitor_count": 18,
"active": true
}
],
"default_organization_id": 3,
"default_project_id": 12,
"default_project_slug": "prj_12"
}
X-RateLimit-Limit
integer

Requests the workspace’s plan allows per minute.

X-RateLimit-Remaining
integer

Requests left in the current minute.

X-RateLimit-Reset
integer

Unix time, in seconds, when the current minute ends.

The API key is missing, wrong, expired, switched off, or no longer valid.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Examples
{
"error": true,
"code": 401,
"message": "API key is required. Provide X-API-Key header or Authorization: Bearer <key>"
}

A usage limit was reached, or this IP address made too many requests with a wrong key.

Usage limits are per workspace and plan: per minute (Retry-After: 60), per day (Retry-After: 3600), and per month (no Retry-After). They use their own body shape. An IP address may send 10 wrong keys a minute; one more is allowed every 6 seconds. While that allowance is used up, every request from the address is refused, even one with a valid key.

Media typeapplication/json
One of:
object
error
required
string
Allowed values: Rate limit exceeded Daily limit exceeded Monthly limit exceeded
message
required
string
retry_after

Seconds to wait. Absent for the monthly limit.

integer
Examples
{
"error": "Rate limit exceeded",
"message": "Per-minute limit of 60 requests exceeded",
"retry_after": 60
}
Retry-After
integer

Seconds to wait. 60 for the per-minute limit, 3600 for the daily limit, 6 after wrong keys. Absent for the monthly limit.

Something failed on TunnelHQ’s side.

Media typeapplication/json
object
error
required
boolean
code
required

The HTTP status, repeated.

integer
message
required

What went wrong.

string
details

More detail, on some errors.

retry_after

Seconds to wait, on the 429 for wrong keys.

integer
Example
{
"error": true,
"code": 500,
"message": "Internal server error"
}