Test mode: payments go through Stripe test mode and are not real. Use test cards only.

REST API Reference

Every endpoint of the WakeLink relay, generated from its OpenAPI spec. Paths are absolute; the API lives under /api/v1.

Base URL
https://wakelink-project.org
Version
v1.0.0 · OpenAPI 3.1.0
Endpoints
81 in 10 groups
Machine-readable
OpenAPI spec

Authenticating requests

Protected endpoints (marked with a lock) take the access token from POST /api/v1/auth/login or your API token (wl_…) in the Authorization header. The browser app uses the httpOnly wl_session cookie instead.

Authorization: Bearer $WAKELINK_TOKEN

Endpoints

Authentication

Accounts, sign-in, tokens, sessions, 2FA and Telegram linking.

POST/api/v1/auth/registerRegister new user
No auth

Create a new user account. Returns API token for subsequent requests. Username must be unique and start with a letter. Password must contain uppercase, lowercase, and digit.

Request body application/json · required

FieldTypeDescription
usernamerequiredstringUnique username (letters, numbers, underscores)
emailstringEmail address (optional)
passwordrequiredstringPassword (8-128 chars, mixed case, digit required)
Example body
{
  "username": "alice",
  "password": "Secure1!",
  "email": "[email protected]"
}

Responses

  • 201User created successfully
  • 409Username already exists
  • 422Validation error
Example response
{
  "id": "usr_...",
  "username": "alice",
  "api_token": "wl_..."
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/register" \
  -H "Content-Type: application/json" \
  -d '{"username":"alice","password":"Secure1!","email":"[email protected]"}'
POST/api/v1/auth/loginUser login
No auth

Authenticate user and return API token. Supports login by username or email.

Request body application/json · required

FieldTypeDescription
usernamerequiredstringUsername or email
passwordrequiredstringUser password
totp_codestring6-digit TOTP code (required only if 2FA is enabled)
Example body
{
  "username": "alice",
  "password": "Secure1!",
  "totp_code": "123456"
}

Responses

  • 200Login successful
  • 401Invalid credentials
  • 422Validation Error
  • 429Too many attempts
Example response
{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "user": { "id": "...", "username": "alice", "api_token": "wl_..." }
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"alice","password":"Secure1!","totp_code":"123456"}'
POST/api/v1/auth/sessionCreate WSS sessionRequires authentication
Bearer token or session

Create a new session token for WebSocket connections. Session tokens: - Valid for 24 hours - Limited to 10,000 requests - Automatically rotated when nearing expiration

Responses

  • 200Session created
  • 401Authentication required
  • 422Validation Error
Example response
{
  "session_token": "wls_...",
  "expires_at": "2026-01-04T12:00:00Z"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/session" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/auth/meGet current userRequires authentication
Bearer token or session

Get information about the authenticated user.

Responses

  • 200User info returned
  • 401Authentication required
  • 422Validation Error
Example response
{
  "id": "usr_...",
  "username": "alice",
  "email": "[email protected]",
  "api_token": "wl_...",
  "telegram_linked": false,
  "totp_enabled": false
}
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/me" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
PUT/api/v1/auth/meUpdate profileRequires authentication
Bearer token or session

Update the current user's username and/or email.

Request body application/json · required

FieldTypeDescription
usernamestringNew username
emailstringNew email address
Example body
{
  "display_name": "Alice"
}

Responses

  • 200Profile updated
  • 400Username already taken or invalid input
  • 401Authentication required
  • 422Validation Error
Example response
{ "id": "...", "username": "alice", "display_name": "Alice" }
curl
curl -X PUT "https://wakelink-project.org/api/v1/auth/me" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"display_name":"Alice"}'
DELETE/api/v1/auth/meDelete accountRequires authentication
Bearer token or session

Permanently delete the current user account and all associated data.

Responses

  • 200Account deleted
  • 401Authentication required
  • 422Validation Error
Example response
{
  "message": "Account deleted"
}
curl
curl -X DELETE "https://wakelink-project.org/api/v1/auth/me" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/logoutLogout userRequires authentication
Bearer token or session

Invalidate all sessions for the current user. Note: API token remains valid. To fully revoke access, regenerate the API token via /api/v1/auth/regenerate-token.

Responses

  • 200Logged out successfully
  • 401Authentication required
  • 422Validation Error
Example response
{
  "message": "Logged out"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/logout" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/auth/sessionsList active web sessions (devices)Requires authentication
Bearer token or session

List the current user's active browser/device sessions, newest first.

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/sessions" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
DELETE/api/v1/auth/sessions/{session_id}Revoke a web session (sign out a device)Requires authentication
Bearer token or session

Revoke one of the current user's sessions by id.

Parameters

NameInTypeDescription
session_idrequiredpathinteger—

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X DELETE "https://wakelink-project.org/api/v1/auth/sessions/{session_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/regenerate-tokenRegenerate API tokenRequires authentication
Bearer token or session

Generate a new API token, invalidating the old one. Use this if you suspect your token has been compromised.

Responses

  • 200Token regenerated
  • 401Authentication required
  • 422Validation Error
Example response
{
  "api_token": "wl_..."
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/regenerate-token" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/refresh-tokenRefresh API tokenRequires authentication
Bearer token or session

Generate a new API token, invalidating the old one. Alias for /regenerate-token.

Responses

  • 200Token refreshed
  • 401Authentication required
  • 422Validation Error
Example response
{
  "api_token": "wl_..."
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/refresh-token" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/token/rotateRotate API token with immediate revocationRequires authentication
Bearer token or session

Generate a new API token and immediately revoke the old one in Redis. Unlike /regenerate-token (which only updates the database hash), this endpoint pushes the old token hash to the Redis revocation list so that any in-flight request still carrying the old Bearer token is rejected before the regular database-propagation delay. Prefer this endpoint over /regenerate-token when you believe the old token may have been compromised.

Responses

  • 200Token rotated and old token revoked
  • 401Authentication required
  • 422Validation Error
Example response
{
  "api_token": "wl_..."
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/token/rotate" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/auth/configGet server configuration
No auth

Returns public server configuration. No authentication required.

Responses

  • 200Successful Response
Example response
{
  "telegram_enabled": true,
  "telegram_bot_username": "wakelink_bot",
  "registration_enabled": true,
  "version": "1.0.0"
}
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/config"
POST/api/v1/auth/push/registerRegister ntfy push topicRequires authentication
Bearer token or session

Register an ntfy.sh topic for push notifications.

Request body application/json · required

FieldTypeDescription
topicrequiredstringntfy.sh topic name to subscribe to for push notifications
Example body
{
  "topic": "https://ntfy.sh/my-wakelink-alerts"
}

Responses

  • 204ntfy topic registered
  • 401Authentication required
  • 422Validation Error
Example response
{
  "message": "Push topic registered"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/push/register" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"topic":"https://ntfy.sh/my-wakelink-alerts"}'
POST/api/v1/auth/client-tokenIssue a per-client (device/session) tokenRequires authentication
Bearer token or session

Create an independent CLIENT token (sess_) for this device/session. Unlike the MASTER token it is NOT replaced when the MASTER is rotated, so signing in on another client (web/phone) no longer breaks this one. Agent (dev_) tokens are unaffected.

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/client-token" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/telegram/link-codeGenerate Telegram link codeRequires authentication
Bearer token or session

Generate a one-time code to link this account to a Telegram account via the bot.

Responses

  • 200Link code generated
  • 401Authentication required
  • 422Validation Error
  • 429Rate limit: wait 5 minutes between codes
  • 503Telegram bot not configured
Example response
{
  "code": "a1b2c3d4e5",
  "expires_in": 600
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/telegram/link-code" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/reset-passwordReset password with Telegram code
No auth

Reset the account password using a one-time code received via the Telegram bot.

Request body application/json · required

FieldTypeDescription
coderequiredstringReset code from the Telegram bot
new_passwordrequiredstringNew password
Example body
{
  "code": "a1b2c3d4e5",
  "new_password": "NewPass2!"
}

Responses

  • 200Password reset successfully
  • 400Invalid or expired reset code
  • 422Validation Error
Example response
{
  "message": "Password reset successfully"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/reset-password" \
  -H "Content-Type: application/json" \
  -d '{"code":"a1b2c3d4e5","new_password":"NewPass2!"}'
GET/api/v1/auth/check-telegram-linkedCheck if user has Telegram linked
No auth

Check if a user has Telegram account linked (for password reset feedback).

Parameters

NameInTypeDescription
emailrequiredquerystring—

Responses

  • 200Returns whether user has Telegram linked
  • 404User not found
  • 422Validation Error
Example response
{
  "linked": true,
  "telegram_username": "alice_tg"
}
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/check-telegram-linked?email=..."
POST/api/v1/auth/telegramLogin or register with Telegram
No auth

Verify Telegram Login Widget data and log in or create an account. For new accounts, returns requires_password=True and a setup_token. Call /auth/complete-setup with that token to set a password.

Request body application/json · required

FieldTypeDescription
idrequiredintegerTelegram user ID
first_namerequiredstringTelegram first name
last_namestringTelegram last name
usernamestringTelegram username
photo_urlstringTelegram profile photo URL
auth_daterequiredintegerUnix timestamp of auth (must be < 5 min ago)
hashrequiredstringHMAC-SHA256 verification hash from Telegram
Example body
{
  "id": 123456789,
  "first_name": "Alice",
  "username": "alice_tg",
  "auth_date": 1700000000,
  "hash": "abcdef..."
}

Responses

  • 200Logged in or registered via Telegram
  • 401Invalid Telegram auth data
  • 422Validation Error
  • 503Telegram bot not configured
Example response
{
  "access_token": "eyJ...",
  "user": { "id": "...", "username": "alice", "api_token": "wl_..." }
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/telegram" \
  -H "Content-Type: application/json" \
  -d '{"id":123456789,"first_name":"Alice","username":"alice_tg","auth_date":1700000000,"hash":"abcdef..."}'
POST/api/v1/auth/complete-setupComplete account setup after Telegram registration
No auth

Set a password (and optional email) for a Telegram-registered account.

Request body application/json · required

FieldTypeDescription
setup_tokenrequiredstringToken received from /auth/telegram endpoint
passwordrequiredstringPassword to set for the account
emailstringOptional email address
Example body
{
  "setup_token": "...",
  "username": "alice",
  "password": "Secure1!"
}

Responses

  • 200Account setup complete
  • 400Invalid or expired setup token
  • 422Validation Error
Example response
{
  "access_token": "eyJ...",
  "user": { "id": "...", "username": "alice" }
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/complete-setup" \
  -H "Content-Type: application/json" \
  -d '{"setup_token":"...","username":"alice","password":"Secure1!"}'
GET/api/v1/auth/telegram/app-loginInitiate Telegram OAuth directly for Android
No auth

Redirects the Android Custom Tab straight to oauth.telegram.org, bypassing the website. After the user authorises, Telegram redirects to /telegram/app-redirect which issues the wakelink://auth deep link.

Responses

  • 302Redirect directly to oauth.telegram.org
  • 307Successful Response
  • 503Telegram bot not configured
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/telegram/app-login"
GET/api/v1/auth/telegram/app-redirectServer-side Telegram redirect callback for Android
No auth

Receives Telegram Login Widget auth data via redirect (data-auth-url mode), verifies the HMAC hash, finds or creates the user, then issues a 302 redirect to wakelink://auth?token=...&username=...&server=... so the Android app can pick it up via its deep-link intent filter.

Parameters

NameInTypeDescription
idqueryinteger—
first_namequerystring—
last_namequerystring—
usernamequerystring—
photo_urlquerystring—
auth_datequeryinteger—
hashquerystring—

Responses

  • 302Redirect to wakelink://auth deep link on success
  • 307Successful Response
  • 400Invalid or expired Telegram auth data
  • 422Validation Error
  • 503Telegram bot not configured
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/telegram/app-redirect"
POST/api/v1/auth/telegram/bot-login-initInit bot-based Telegram login
No auth

Create a pending login session. The client opens the returned bot_url in Telegram, the bot completes the login, and the client polls /bot-login-poll/{token}.

Responses

  • 200Bot login session created
  • 503Telegram bot not configured
Example response
{
  "login_token": "random24chars",
  "bot_url": "https://t.me/wakelink_bot?start=botlogin_...",
  "expires_in": 300
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/telegram/bot-login-init"
POST/api/v1/auth/telegram/bot-login-pollPoll bot login status
No auth

Poll the status of a pending bot-login session. The login token is submitted in the JSON body so it never appears in URLs / access logs. Poll every 2–3 seconds until `status is completed` or the token expires (HTTP 404).

Request body application/json · required

FieldTypeDescription
login_tokenrequiredstringBot login token issued by /telegram/bot-login-init
Example body
{
  "login_token": "random24chars"
}

Responses

  • 200Login status: pending | completed | expired
  • 404Token not found
  • 422Validation Error
Example response
{
  "status": "completed",
  "access_token": "eyJ...",
  "user": { "id": "...", "username": "alice", "api_token": "wl_..." }
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/telegram/bot-login-poll" \
  -H "Content-Type: application/json" \
  -d '{"login_token":"random24chars"}'
POST/api/v1/auth/request-telegram-resetSend reset code via Telegram bot
No auth

Look up the account by username or email, send a one-time PIN to their linked Telegram account. Always returns 200 to avoid user enumeration.

Request body application/json · required

FieldTypeDescription
username_or_telegramrequiredstringUsername, email, or numeric Telegram user ID of the account
Example body
{
  "username": "alice"
}

Responses

  • 200Code sent if account has Telegram linked
  • 422Validation Error
Example response
{
  "message": "Reset code sent via Telegram"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/request-telegram-reset" \
  -H "Content-Type: application/json" \
  -d '{"username":"alice"}'
PUT/api/v1/auth/passwordChange passwordRequires authentication
Bearer token or session

Change the current user's password. On success the server rotates the user's API token, deletes every active Redis session for the account (forcing all other clients to re-authenticate) and returns the new `api_token` so the caller can keep working without re-logging in. TOTP 2FA configuration is preserved.

Request body application/json · required

FieldTypeDescription
current_passwordrequiredstringCurrent password for verification
new_passwordrequiredstringNew password
Example body
{
  "current_password": "OldPass1!",
  "new_password": "NewPass2!"
}

Responses

  • 200Password changed; new API token returned and all prior sessions revoked
  • 400Invalid current password
  • 401Authentication required
  • 422Validation Error
Example response
{
  "message": "Password changed",
  "api_token": "wl_...",
  "sessions_revoked": 3
}
curl
curl -X PUT "https://wakelink-project.org/api/v1/auth/password" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"current_password":"OldPass1!","new_password":"NewPass2!"}'
POST/api/v1/auth/forgot-passwordRequest email password-reset link
No auth

Send a one-time password-reset link to the given email address. Always returns 200 to avoid leaking whether an email is registered.

Request body application/json · required

FieldTypeDescription
emailrequiredstringRegistered email address
Example body
{
  "email": "[email protected]"
}

Responses

  • 200Reset link sent if the email exists
  • 422Validation Error
  • 503Mailer service unavailable
Example response
{
  "message": "If that email exists, a reset link was sent"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/forgot-password" \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'
GET/api/v1/auth/validate-reset-tokenCheck if email reset token is valid (deprecated — use POST variant)
No auth

Deprecated. Passing the reset token in the query string leaks it into server access logs / browser history. Use `POST /validate-reset-token` with the token in the JSON body instead. Kept for backward compatibility.

Parameters

NameInTypeDescription
tokenrequiredquerystring—

Responses

  • 200Token is valid
  • 400Token is invalid or expired
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/auth/validate-reset-token?token=..."
POST/api/v1/auth/validate-reset-tokenCheck if email reset token is valid
No auth

Non-destructive check — does not consume the token. Token is sent in the JSON body.

Request body application/json · required

FieldTypeDescription
tokenrequiredstringEmail reset token from the link
Example body
{
  "token": "64hex..."
}

Responses

  • 200Token is valid
  • 400Token is invalid or expired
  • 422Validation Error
Example response
{
  "valid": true
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/validate-reset-token" \
  -H "Content-Type: application/json" \
  -d '{"token":"64hex..."}'
POST/api/v1/auth/reset-password-emailReset password via email token
No auth

Validate the email reset token and set a new password.

Request body application/json · required

FieldTypeDescription
tokenrequiredstringEmail reset token from the link
new_passwordrequiredstringNew password
Example body
{
  "token": "64hex...",
  "new_password": "NewPass2!"
}

Responses

  • 200Password reset successfully
  • 400Invalid or expired token
  • 422Validation Error
Example response
{
  "message": "Password reset successfully"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/reset-password-email" \
  -H "Content-Type: application/json" \
  -d '{"token":"64hex...","new_password":"NewPass2!"}'
POST/api/v1/auth/2fa/setupGenerate TOTP setup secretRequires authentication
Bearer token or session

Create a temporary TOTP secret, provisioning URI, and QR code so the authenticated user can enroll an authenticator app.

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "secret": "BASE32SECRET...",
  "uri": "otpauth://totp/WakeLink:alice?secret=...",
  "qr_code": "data:image/png;base64,..."
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/2fa/setup" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/auth/2fa/enableEnable TOTP 2FARequires authentication
Bearer token or session

Verify the supplied TOTP code against the setup secret and persist the encrypted secret on the user account.

Request body application/json · required

FieldTypeDescription
coderequiredstring—
secretrequiredstring—
Example body
{
  "secret": "BASE32SECRET...",
  "code": "123456"
}

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "status": "enabled"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/2fa/enable" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"secret":"BASE32SECRET...","code":"123456"}'
POST/api/v1/auth/2fa/disableDisable TOTP 2FARequires authentication
Bearer token or session

Verify a current TOTP code and remove the stored TOTP secret from the authenticated account.

Request body application/json · required

Example body
{
  "code": "123456"
}

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "status": "disabled"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/2fa/disable" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code":"123456"}'
POST/api/v1/auth/2fa/verifyVerify TOTP codeRequires authentication
Bearer token or session

Check whether the supplied TOTP code matches the authenticated user's currently enabled TOTP secret.

Request body application/json · required

Example body
{
  "code": "123456"
}

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "valid": true
}
curl
curl -X POST "https://wakelink-project.org/api/v1/auth/2fa/verify" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"code":"123456"}'

Agents

Your ESP32 agents, their wake targets, tokens and wake commands.

GET/api/v1/agentsList user agentsRequires authentication
Bearer token or session

Get all agents registered by the current user.

Responses

  • 200Agents list returned
  • 401Authentication required
  • 422Validation Error
Example response
{
  "agents": [
    {
      "id": 1,
      "agent_id": "WL35080814",
      "name": "Living Room ESP",
      "model": "ESP32",
      "is_active": true,
      "is_online": true,
      "online_status": "online",
      "last_seen": "2026-01-03T12:00:00Z",
      "created_at": "2026-01-01T00:00:00Z",
      "request_count": 42
    }
  ],
  "total": 1,
  "username": "alice",
  "plan": "free",
  "agents_limit": 1
}
curl
curl -X GET "https://wakelink-project.org/api/v1/agents" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/agentsRegister new agentRequires authentication
Bearer token or session

Register a new agent for the current user. Free plan: up to 2 agents. Pro plan: up to 5 agents. The agent_token (Aegis key) is managed exclusively by the client and ESP32.

Request body application/json · required

FieldTypeDescription
agent_idrequiredstringUnique agent identifier
namestringHuman-readable agent name
modelstringAgent hardware model (e.g. ESP32, ESP8266)
extra_dataobjectCustom metadata for the agent
e2e_tokenstringE2E agent token (Aegis key) — stored encrypted at rest so the owner's other clients can sync it and command the agent
Example body
{
  "agent_id": "WL35080814",
  "name": "Living Room ESP",
  "model": "ESP32"
}

Responses

  • 201Agent registered successfully
  • 400Agent limit reached
  • 401Authentication required
  • 409Agent ID already exists
  • 422Validation Error
Example response
{
  "id": 1,
  "agent_id": "WL35080814",
  "name": "Living Room ESP",
  "model": "ESP32",
  "is_active": true,
  "is_online": false,
  "created_at": "2026-01-03T12:00:00Z"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/agents" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"agent_id":"WL35080814","name":"Living Room ESP","model":"ESP32"}'
POST/api/v1/agents/virtualProvision a virtual (emulator) agent — no hardware neededRequires authentication
Bearer token or session

Create a demo agent backed by the software emulator so the app can be tested without a physical ESP32. Returns everything the client needs to add it (agent_id + E2E agent_token) and everything the hosted emulator needs to come online (dev_ api_token), plus an expiry. Counts against the user's agent limit like any agent.

Responses

  • 201Virtual agent provisioned
  • 400Agent limit reached
  • 401Authentication required
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/agents/virtual" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/agents/{agent_id}Get agent infoRequires authentication
Bearer token or session

Get detailed information about a specific agent.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200Agent info returned
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "id": 1,
  "agent_id": "WL35080814",
  "name": "Living Room ESP",
  "is_online": true,
  "online_status": "online",
  "last_seen": "2026-01-03T12:00:00Z",
  "request_count": 42
}
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
PATCH/api/v1/agents/{agent_id}Update agentRequires authentication
Bearer token or session

Update agent name, model, metadata, or active status.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Request body application/json · required

FieldTypeDescription
namestringUpdated agent name
modelstringUpdated agent hardware model
e2e_tokenstringE2E agent token to store/update (encrypted at rest)
metadataobjectUpdated metadata
is_activebooleanEnable/disable agent
Example body
{
  "name": "Office ESP32",
  "model": "ESP32-S3"
}

Responses

  • 200Agent updated
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "id": 1,
  "agent_id": "WL35080814",
  "name": "Office ESP32"
}
curl
curl -X PATCH "https://wakelink-project.org/api/v1/agents/{agent_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Office ESP32","model":"ESP32-S3"}'
DELETE/api/v1/agents/{agent_id}Delete agentRequires authentication
Bearer token or session

Remove an agent from the user's account.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 204Agent deleted
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "message": "Agent deleted"
}
curl
curl -X DELETE "https://wakelink-project.org/api/v1/agents/{agent_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/agents/{agent_id}/prekey-bundleFetch agent prekey bundle for X3DHRequires authentication
Bearer token or session

Return the agent's prekey bundle, consuming one one-time prekey (if any).

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200Bundle returned (one OPK consumed if available)
  • 401Authentication required
  • 404Agent or bundle not found
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}/prekey-bundle" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
PUT/api/v1/agents/{agent_id}/prekey-bundlePublish agent prekey bundleRequires authentication
Bearer token or session

Store the agent's PUBLIC X3DH prekey bundle. Relay stores it blindly.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Request body application/json · required

FieldTypeDescription
ik_x_pubrequiredstringX25519 identity public key (64 hex)
ik_ed_pubrequiredstringEd25519 identity public key (64 hex)
spk_pubrequiredstringSigned prekey public (64 hex)
spk_sigrequiredstringEd25519 signature over spk_pub (128 hex)
opk_pubsstring[]One-time prekey public pool (each 64 hex); consumed one per fetch
Example body
{
  "ik_x_pub": "...",
  "ik_ed_pub": "...",
  "spk_pub": "...",
  "spk_sig": "...",
  "opk_pubs": [
    "..."
  ]
}

Responses

  • 200Bundle published
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
curl
curl -X PUT "https://wakelink-project.org/api/v1/agents/{agent_id}/prekey-bundle" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ik_x_pub":"...","ik_ed_pub":"...","spk_pub":"...","spk_sig":"...","opk_pubs":["..."]}'
GET/api/v1/agents/{agent_id}/statsGet agent statisticsRequires authentication
Bearer token or session

Get detailed usage statistics for an agent.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200Agent statistics returned
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "agent_id": "WL35080814",
  "total_connections": 15,
  "total_requests": 320,
  "total_wake_commands": 42,
  "first_seen": "2026-01-01T00:00:00Z",
  "last_seen": "2026-01-03T12:00:00Z",
  "avg_requests_per_day": 106.7
}
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}/stats" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/agents/{agent_id}/wakeSend Wake-on-LAN command (not supported via relay)Requires authentication
Bearer token or session

This endpoint is not functional. Wake-on-LAN commands require Aegis end-to-end encryption: the ESP32 firmware processes only Aegis-encrypted packets and silently drops plain relay messages. The relay never holds the agent secret key, so it cannot construct valid Aegis packets. Use the WakeLink CLI (wakelink wake <agent> --mac AA:BB:CC:DD:EE:FF) or the Android app, which implement Aegis directly and hold the agent key.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Request body application/json · required

FieldTypeDescription
mac_addressrequiredstringTarget MAC address
broadcast_ipstringBroadcast IP address (optional)
Example body
{
  "mac_address": "AA:BB:CC:DD:EE:FF",
  "broadcast_ip": "192.168.1.255"
}

Responses

  • 200Successful Response
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
  • 501Not implemented — wake requires Aegis E2E encryption
Example response
{
  "message": "Wake command sent to Living Room ESP (MAC: AA:BB:CC:DD:EE:FF)"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/agents/{agent_id}/wake" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mac_address":"AA:BB:CC:DD:EE:FF","broadcast_ip":"192.168.1.255"}'
POST/api/v1/agents/{agent_id}/activityUpdate agent activityRequires authentication
Bearer token or session

Record that a agent is active (updates last_seen timestamp).

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 204Activity recorded
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "message": "Activity updated"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/agents/{agent_id}/activity" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/agents/{agent_id}/rotate-tokenRotate per-agent API tokenRequires authentication
Bearer token or session

Generate a new agent_token for the specified agent. The old token is immediately invalidated. The new token is returned once — store it securely and send it to the firmware.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200New agent token generated
  • 404Agent not found or not owned by you
  • 422Validation Error
Example response
{
  "agent_token": "wla_...",
  "message": "Agent token rotated"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/agents/{agent_id}/rotate-token" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/agents/{agent_id}/exportExport firmware-ready agent configRequires authentication
Bearer token or session

Export the agent configuration as a JSON object suitable for programming directly into firmware (ESP32) or the CLI client. The response contains all relay-side fields the firmware needs to connect: - agent_id – the unique agent identifier - api_token – the user's API token (used as Bearer authentication with the relay) - server_url – WebSocket relay URL (wss://...) - name – human-readable agent name The Aegis agent_token (shared secret for end-to-end encryption) is managed exclusively by the client and firmware; it is NOT stored on the relay and is therefore not included in this response.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200Agent config exported
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
Example response
{
  "relay_url": "wss://relay.example.com",
  "agent_id": "WL35080814",
  "agent_token": "wla_..."
}
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}/export" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/agents/{agent_id}/e2e-keyFetch the agent's E2E key (owner-only, audited)Requires authentication
Bearer token or session

Retrieve the stored E2E agent token (Aegis key) for one owned agent. This is an explicit, owner-only endpoint that replaces the previous behavior of returning the token on every list/get/update response (which leaked all agent keys on any bulk read). The token is encrypted at rest and decrypted only here. Interim measure until task 013 (AEGIS-native key sync via Pistis/Keryx) lands; at that point this endpoint becomes the Keryx mailbox fetch and the relay will stop holding the key entirely.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200E2E key returned
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}/e2e-key" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/agents/{agent_id}/targetsList an agent's wake targetsRequires authentication
Bearer token or session

List the saved wake-on-LAN target machines (PCs) for an agent.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Responses

  • 200Wake targets returned
  • 401Authentication required
  • 404Agent not found
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/agents/{agent_id}/targets" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/agents/{agent_id}/targetsAdd a wake targetRequires authentication
Bearer token or session

Save a wake-on-LAN target machine (name + MAC) under an agent.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—

Request body application/json · required

FieldTypeDescription
namerequiredstring—
macrequiredstring—
Example body
{
  "name": "...",
  "mac": "..."
}

Responses

  • 201Wake target created
  • 401Authentication required
  • 404Agent not found
  • 409A target with this MAC already exists
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/agents/{agent_id}/targets" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"...","mac":"..."}'
PATCH/api/v1/agents/{agent_id}/targets/{target_id}Update a wake targetRequires authentication
Bearer token or session

Rename a wake target or change its MAC address.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—
target_idrequiredpathinteger—

Request body application/json · required

FieldTypeDescription
namestring—
macstring—
Example body
{
  "name": "...",
  "mac": "..."
}

Responses

  • 200Wake target updated
  • 401Authentication required
  • 404Agent or target not found
  • 409A target with this MAC already exists
  • 422Validation Error
curl
curl -X PATCH "https://wakelink-project.org/api/v1/agents/{agent_id}/targets/{target_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"...","mac":"..."}'
DELETE/api/v1/agents/{agent_id}/targets/{target_id}Delete a wake targetRequires authentication
Bearer token or session

Remove a saved wake-on-LAN target from an agent.

Parameters

NameInTypeDescription
agent_idrequiredpathstring—
target_idrequiredpathinteger—

Responses

  • 204Wake target deleted
  • 401Authentication required
  • 404Agent or target not found
  • 422Validation Error
curl
curl -X DELETE "https://wakelink-project.org/api/v1/agents/{agent_id}/targets/{target_id}" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"

Vault

The end-to-end encrypted client vault (opaque to the server).

GET/api/v1/vaultDownload the user's vaultRequires authentication
Bearer token or session

Return the client-encrypted vault blob and its version. The server cannot decrypt the blob.

Responses

  • 200Vault returned (blob null if none yet)
  • 401Authentication required
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/vault" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
PUT/api/v1/vaultUpload the user's vaultRequires authentication
Bearer token or session

Store a new client-encrypted vault blob. Uses optimistic concurrency: expected_version must match the stored version.

Request body application/json · required

FieldTypeDescription
expected_versionrequiredinteger—
blobrequiredstring—
Example body
{
  "expected_version": 0,
  "blob": "..."
}

Responses

  • 200Vault stored; new version returned
  • 401Authentication required
  • 409Version conflict — re-fetch and merge
  • 422Validation Error
curl
curl -X PUT "https://wakelink-project.org/api/v1/vault" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"expected_version":0,"blob":"..."}'

Limits

Plan limits and current usage.

GET/api/v1/limitsGet plan limits and current usageRequires authentication
Bearer token or session

Return the caller's plan, agent usage and today's wake usage. daily_limit == 0 means unlimited (Pro/premium); daily_remaining is null when unlimited.

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/limits" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"

Statistics

Public project statistics.

GET/api/v1/stats/Get public project stats
No auth

Return non-sensitive aggregate counters and protocol metadata for public dashboards.

Responses

  • 200Successful Response
Example response
{
  "users": 1234,
  "agents": 567,
  "version": "1.0.0",
  "protocol_version": "1.0",
  "open_source": true,
  "e2e_encrypted": true
}
curl
curl -X GET "https://wakelink-project.org/api/v1/stats/"

Releases

Release metadata, artifacts, checksums and update checks.

GET/api/v1/releases/latestGet latest release
No auth

Return the newest published WakeLink release that matches the caller's update channel.

Responses

  • 200Successful Response
Example response
{
  "version": "1.0.0",
  "date": "2024-01-01",
  "changelog": ["Initial release"]
}
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/latest"
GET/api/v1/releases/listList releases
No auth

Return metadata for every published WakeLink release currently known to the relay.

Responses

  • 200Successful Response
Example response
[
  { "version": "1.0.0", "date": "2024-01-01" }
]
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/list"
GET/api/v1/releases/{version}/infoGet release info
No auth

Return metadata for the exact release version requested in the path.

Parameters

NameInTypeDescription
versionrequiredpathstring—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "version": "1.0.0",
  "date": "2024-01-01",
  "changelog": ["..."],
  "files": ["android.apk", "firmware.bin", "wakelink-cli.tar.gz"]
}
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/{version}/info"
GET/api/v1/releases/latest/download/{platform}Download latest release
No auth

Resolve the newest release for the requested platform and stream the matching artifact back to the client.

Parameters

NameInTypeDescription
platformrequiredpathstring—
archquerystring—
chipquerystring—

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/latest/download/{platform}"
GET/api/v1/releases/{version}/download/{filename}Download release file
No auth

Stream a specific release artifact after validating the version and filename.

Parameters

NameInTypeDescription
versionrequiredpathstring—
filenamerequiredpathstring—

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/{version}/download/{filename}"
GET/api/v1/releases/{version}/checksumsGet release checksums
No auth

Return the published checksum manifest for the requested release version.

Parameters

NameInTypeDescription
versionrequiredpathstring—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "android.apk": "sha256:abc123...",
  "firmware.bin": "sha256:def456..."
}
curl
curl -X GET "https://wakelink-project.org/api/v1/releases/{version}/checksums"
POST/api/v1/releases/checkCheck for updates
No auth

Compare a client's current version with the newest release available for its platform.

Request body application/json · required

FieldTypeDescription
current_versionrequiredstringCurrent installed version
platformrequiredstringPlatform: android or firmware
chipstringChip type for firmware (esp32, esp32s3, etc.)
architecturestringABI for Android (arm64-v8a, etc.)
Example body
{
  "version": "0.9.0",
  "platform": "android"
}

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "update_available": true,
  "latest_version": "1.0.0"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/releases/check" \
  -H "Content-Type: application/json" \
  -d '{"version":"0.9.0","platform":"android"}'
POST/api/v1/releases/notifyNotify clients of an available updateRequires authentication
Bearer token or session

Admin-only. Broadcast an 'update available' push notification (via the configured ntfy updates topic) so clients can trigger an OTA / in-app update. Announces the current latest release, or an explicit version/platform supplied in the request body.

Request body application/json · required

FieldTypeDescription
versionstringExplicit version to announce; defaults to the current latest release
platformstringTarget platform label shown in the notification (android, firmware, cli, all)
changelogstringOptional release notes override; defaults to the release's own changelog
Example body
{
  "version": "...",
  "platform": "all",
  "changelog": "..."
}

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/releases/notify" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"version":"...","platform":"all","changelog":"..."}'

Seats and applications for the paid beta.

GET/api/v1/beta/statusPaid beta: seats left and whether applications are openRequires authentication
Bearer token or session

Public numbers; for a signed-in caller also `seat` — the status of their own seat, or null.

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/beta/status" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/beta/applyApply for a paid seat (accepted automatically while there is room)Requires authentication
Bearer token or session

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/beta/apply" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"

Admin

Operator endpoints; every call needs the admin role.

GET/api/v1/admin/usersList usersRequires authentication
Bearer token or session

Return a paginated list of all WakeLink users for administrative review.

Parameters

NameInTypeDescription
pagequeryinteger—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "users": [{ "id": "...", "username": "alice", "is_admin": false, "created_at": "..." }],
  "total": 42,
  "page": 1
}
curl
curl -X GET "https://wakelink-project.org/api/v1/admin/users" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/admin/audit-logsList audit logsRequires authentication
Bearer token or session

Return a paginated audit trail so administrators can review privileged actions.

Parameters

NameInTypeDescription
pagequeryinteger—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "logs": [{ "id": "...", "action": "login", "user_id": "...", "ip": "...", "created_at": "..." }],
  "total": 1000
}
curl
curl -X GET "https://wakelink-project.org/api/v1/admin/audit-logs" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/admin/releases/notifyBroadcast release notificationRequires authentication
Bearer token or session

Send a best-effort push notification about a new release to every user with an ntfy topic configured.

Parameters

NameInTypeDescription
versionrequiredquerystringVersion string, e.g. 1.2.0
changelogquerystringShort release notes

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "notified": 128
}
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/releases/notify?version=..." \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/admin/users/{user_id}/promotePromote user to adminRequires authentication
Bearer token or session

Grant administrative privileges to the specified user account.

Parameters

NameInTypeDescription
user_idrequiredpathinteger—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "message": "User promoted to admin"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/users/{user_id}/promote" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/admin/users/{user_id}/demoteRevoke admin privilegesRequires authentication
Bearer token or session

Remove administrative privileges from the specified user account.

Parameters

NameInTypeDescription
user_idrequiredpathinteger—

Responses

  • 200Successful Response
  • 422Validation Error
Example response
{
  "message": "User demoted"
}
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/users/{user_id}/demote" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
GET/api/v1/admin/overviewUsers by plan, recent signups and the paid-beta numbersRequires authentication
Bearer token or session

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/admin/overview" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/admin/users/{user_id}/planGrant or revoke Pro by handRequires authentication
Bearer token or session

Parameters

NameInTypeDescription
user_idrequiredpathinteger—

Request body application/json · required

FieldTypeDescription
planrequiredstring—
expires_atstring—
Example body
{
  "plan": "...",
  "expires_at": "..."
}

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/users/{user_id}/plan" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"plan":"...","expires_at":"..."}'
POST/api/v1/admin/users/{user_id}/activeDisable or re-enable an accountRequires authentication
Bearer token or session

Parameters

NameInTypeDescription
user_idrequiredpathinteger—

Request body application/json · required

FieldTypeDescription
activerequiredboolean—
Example body
{
  "active": false
}

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/users/{user_id}/active" \
  -H "Authorization: Bearer $WAKELINK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'
GET/api/v1/admin/betaPaid beta: numbers, seats and the latest paymentsRequires authentication
Bearer token or session

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X GET "https://wakelink-project.org/api/v1/admin/beta" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"
POST/api/v1/admin/beta/seats/{user_id}/releaseGive a paid-beta seat backRequires authentication
Bearer token or session

Parameters

NameInTypeDescription
user_idrequiredpathinteger—

Responses

  • 200Successful Response
  • 422Validation Error
curl
curl -X POST "https://wakelink-project.org/api/v1/admin/beta/seats/{user_id}/release" \
  -H "Authorization: Bearer $WAKELINK_TOKEN"

WebSocket

Relay connection statistics. The protocol itself is documented separately.

GET/wss/statsGet websocket stats
No auth

Return runtime counters for connected websocket agents and clients.

Responses

  • 200Successful Response
curl
curl -X GET "https://wakelink-project.org/wss/stats"

Health

Liveness and readiness probes for operators.

GET/healthRun health check
No auth

Perform a comprehensive health check covering configuration, database connectivity, and process state.

Responses

  • 200Successful Response
curl
curl -X GET "https://wakelink-project.org/health"
GET/health/liveRun liveness probe
No auth

Report whether the process is alive enough for the platform to keep it running.

Responses

  • 200Successful Response
curl
curl -X GET "https://wakelink-project.org/health/live"
GET/health/readyRun readiness probe
No auth

Report whether required dependencies are ready before the service accepts traffic.

Responses

  • 200Successful Response
curl
curl -X GET "https://wakelink-project.org/health/ready"

Error codes

Errors answer with a JSON body whose detail explains the failure; validation errors (422) list each invalid field.

StatusMeaning
400Bad Request — validation error or malformed input
401Unauthorized — missing or invalid token
403Forbidden — insufficient permissions
404Not Found — resource does not exist
409Conflict — duplicate agent ID or username
422Unprocessable Entity — schema validation failure
429Too Many Requests — rate limit exceeded
500Internal Server Error