{ API Reference
REST API documentation for building integrations and custom clients.
_base_url
https://gh-env.sh/api/v1All endpoints are prefixed with this base URL. For example, the login endpoint is: https://gh-env.sh/api/v1/auth/login
_authentication
Most endpoints require authentication via a JWT Bearer token. Include it in the Authorization header:
Token Lifecycle
| Token Type | Expiry | Usage |
|---|---|---|
| accessToken | 15 minutes | API requests (Authorization header) |
| refreshToken | 7 days | Get new access tokens via /auth/refresh |
_request_format
All requests should include these headers:
Request bodies should be JSON. Example:
{
"email": "user@example.com",
"password": "securepass123"
}_endpoints/auth
/api/v1/auth/register publicCreate a new user account
{ "email": "user@example.com", "username": "hunter42", "password": "securepass123" }{ "user": { "id": "...", "email": "...", "username": "..." }, "accessToken": "...", "refreshToken": "..." }/api/v1/auth/login publicAuthenticate and get tokens
{ "email": "user@example.com", "password": "securepass123" }{ "accessToken": "...", "refreshToken": "..." }
// or if 2FA enabled:
{ "requires2fa": true, "pendingId": "..." }/api/v1/auth/login/2fa publicComplete 2FA verification
{ "pendingId": "...", "code": "123456" }{ "accessToken": "...", "refreshToken": "..." }/api/v1/auth/refresh publicRefresh access token
{ "refreshToken": "..." }{ "accessToken": "...", "refreshToken": "..." }/api/v1/auth/device publicStart device code flow
{ "hostname": "my-laptop" }{ "deviceCode": "...", "userCode": "XKCD-1337", "verificationUrl": "...", "expiresIn": 600, "interval": 5 }/api/v1/auth/device/poll publicPoll for device authorization
{ "deviceCode": "..." }{ "status": "pending" }
// or when authorized:
{ "status": "authorized", "accessToken": "...", "refreshToken": "..." }_endpoints/profiles
/api/v1/profiles requires authList all profiles for authenticated user
{ "profiles": [{ "id": "...", "name": "default", "description": "...", "isDefault": true, "createdAt": "..." }] }/api/v1/profiles requires authCreate a new profile
{ "name": "work", "description": "Work environment", "isDefault": false }{ "profile": { "id": "...", "name": "work", ... } }/api/v1/profiles/:id requires authGet profile details
{ "profile": { "id": "...", "name": "...", "scripts": [...] } }/api/v1/profiles/:id requires authUpdate a profile
{ "name": "...", "description": "...", "isDefault": false }{ "profile": { ... } }/api/v1/profiles/:id requires authDelete a profile
{ "success": true }_endpoints/scripts
/api/v1/profiles/:id/scripts requires authGet all scripts for a profile
{ "scripts": [{ "id": "...", "type": "aliases", "content": "...", "signature": "..." }] }/api/v1/profiles/:id/scripts/:type requires authUpdate a script (auto-signed)
{ "content": "alias ll=\"ls -la\"" }{ "script": { "id": "...", "type": "aliases", "content": "...", "signature": "..." } }/api/v1/scripts/activate/:profileId requires authGet signed scripts for activation (CLI endpoint)
{ "scripts": [...], "timestamp": "...", "bundleSignature": "..." }Script Types
Valid values for the :type parameter:
env_variablesaliasesfunctionspromptcompletioninitcleanup_endpoints/devices
/api/v1/devices requires authList all registered devices
{ "devices": [{ "id": "...", "hostname": "...", "lastSeen": "...", "mode": "normal" }] }/api/v1/devices/:id requires authRevoke device access
{ "success": true }_error_codes
Error responses follow this format:
{
"error": "Error message here",
"code": "ERROR_CODE"
}| Status | Code | Description |
|---|---|---|
| 400 | INVALID_REQUEST | Missing or invalid parameters |
| 401 | UNAUTHORIZED | Missing or invalid token |
| 401 | TOKEN_EXPIRED | Access token has expired |
| 403 | FORBIDDEN | Not authorized for this resource |
| 404 | NOT_FOUND | Resource doesn't exist |
| 409 | CONFLICT | Resource already exists (duplicate) |
| 429 | RATE_LIMITED | Too many requests |
| 500 | INTERNAL_ERROR | Server error |
_rate_limits
| Endpoint Group | Limit | Window |
|---|---|---|
| Global (all endpoints) | 100 requests | per minute per IP |
| Auth endpoints (/auth/*) | 10 requests | per minute per IP |
Rate limit headers are included in responses: