Skip to content
Hoody.com

Retrieve and update user profiles, audit account activity, and read or manage the secure per-user vault. This page covers the control-plane user endpoints under /api/v1/users/ and /api/v1/vault/.

Two endpoints on this page require a first-party signed-in session JWT and refuse API auth tokens, HTTP Basic credentials, and impersonated sessions:

  • POST /api/v1/users/me/redeem-invite (redeem a beta invite code)
  • POST /api/v1/users/me/onboarding (mark an onboarding milestone)

All other endpoints on this page accept either a session JWT or an auth token that carries the relevant permission, such as resources.read_account for account-scoped reads.

Read and update account records. You can only view and update your own profile.

GET /api/v1/users/{id}

Retrieve a user profile by ID. You can only view your own profile. This endpoint works even for banned users (read-only access).

NameInTypeRequiredDescription
idpathstringYesUser ID to retrieve
Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/507f1f77bcf86cd799439011" \
-H "Authorization: Bearer $HOODY_TOKEN"

PUT /api/v1/users/{id} (also accepted: PATCH, identical behaviour)

Update your user profile: alias, public key, and password (a new password needs current_password for verification). You can only update your own profile; a request for another user’s profile is refused with 403.

NameInTypeRequiredDescription
idpathstringYesUser ID to update
NameTypeRequiredDescription
aliasstringNoNew display name/alias (1 to 100 characters)
public_keystringNoED25519 public key (exactly 64 hexadecimal characters)
passwordstringNoNew password (12 to 128 characters, at most 72 UTF-8 bytes, 3 of 4 character classes); requires current_password
current_passwordstringNoCurrent password (8 to 128 characters); required when setting a new password
{
"alias": "John Smith",
"public_key": "a1b2c3d4e5f6789012345678901234567890abcdefabcdefabcdefabcdef1234"
}
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/users/507f1f77bcf86cd799439011" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"alias": "John Smith"
}'

Inspect and manage beta access, free-tier server claiming, and per-account onboarding milestones.

GET /api/v1/users/me/free-tier-status

Return whether the beta gate is enabled, whether this account is unlocked, whether it already owns a free server, and an advisory reason explaining why a claim is currently blocked. This endpoint never attempts a claim.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/me/free-tier-status" \
-H "Authorization: Bearer $HOODY_TOKEN"

POST /api/v1/users/me/redeem-invite

Redeem a single-use invite code to unlock free-tier server claiming during the beta, then immediately provision a free server. The call is idempotent if the account is already unlocked. When the beta gate is disabled, no code is consumed (the call is a no-op).

NameTypeRequiredDescription
codestringYesThe invite code (case/format-insensitive), 1 to 64 characters
{
"code": "HOODY-7Q4K-9F2M-3B8T-XR5W-2HKD-1"
}
Terminal window
curl -X POST "https://api.hoody.com/api/v1/users/me/redeem-invite" \
-H "Authorization: Bearer $HOODY_JWT" \
-H "Content-Type: application/json" \
-d '{
"code": "HOODY-7Q4K-9F2M-3B8T-XR5W-2HKD-1"
}'

POST /api/v1/users/me/retry-setup

Manually claim a free-tier server and create the default project and container. The call is idempotent and safe to invoke if the account is already provisioned.

NameTypeRequiredDescription
regionstringNoOptional preferred region override (lowercase letters, digits, hyphens; up to 50 characters)
{
"region": "us-east-1"
}
Terminal window
curl -X POST "https://api.hoody.com/api/v1/users/me/retry-setup" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'

POST /api/v1/users/me/onboarding

Idempotently record a per-account onboarding or UI milestone (key mapped to an ISO timestamp). Setting an already-present milestone changes nothing; the original timestamp is kept.

NameTypeRequiredDescription
milestonestringYesMilestone key, for example hub_tour_v1. Must match `^(hub_tour_v[0-9]3
{
"milestone": "hub_tour_v1"
}
Terminal window
curl -X POST "https://api.hoody.com/api/v1/users/me/onboarding" \
-H "Authorization: Bearer $HOODY_JWT" \
-H "Content-Type: application/json" \
-d '{ "milestone": "hub_tour_v1" }'

List and summarise the authenticated user’s API activity, including the method, path, status code, and source IP of each call.

GET /api/v1/users/auth/activity

Retrieve activity logs for the authenticated user with optional filtering. Results are paginated; the pages field is capped to the server’s reachable pagination window.

NameInTypeRequiredDescription
pagequeryintegerNoPage number (default: 1)
limitqueryintegerNoResults per page (default: 50)
start_datequerystringNoFilter logs after this date
end_datequerystringNoFilter logs before this date
errors_onlyquerybooleanNoShow only errors (status >= 400)
min_statusqueryintegerNoMinimum status code
max_statusqueryintegerNoMaximum status code
methodquerystringNoFilter by HTTP method; one of GET, POST, PUT, PATCH, DELETE
realm_idquerystringNoFilter by realm ID
Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/auth/activity?errors_only=true&limit=20" \
-H "Authorization: Bearer $HOODY_TOKEN"

GET /api/v1/users/auth/activity/stats

Retrieve storage usage statistics for activity logs, including the total size, the oldest and newest record, and the configured retention period.

Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/auth/activity/stats" \
-H "Authorization: Bearer $HOODY_TOKEN"

GET /api/v1/users/me/security-history

Return your own account security history: sign-ins and, on request, rejected attempts and other security events (logout, 2FA changes, OTP outcomes, backup-code use). Each entry carries the IP address, the resolved country, the source channel, and the timestamp, newest first.

History covers the last 180 days; older logins are purged automatically and cannot be recovered. Login records cannot be edited or deleted by the account holder. The trail is append-only so it stays trustworthy as evidence.

NameInTypeRequiredDescription
pagequeryintegerNoPage number (default: 1)
limitqueryintegerNoResults per page (default: 50)
include_failedquerybooleanNoAlso return rejected sign-in attempts against this account (default: false). Opt-in, because mixing them in by default would make failed attempts look like your own sessions
include_securityquerybooleanNoAlso return other account-security events: logout, 2FA enable/disable, OTP verification outcomes, backup-code regeneration (default: false)
Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/me/security-history?include_failed=true" \
-H "Authorization: Bearer $HOODY_TOKEN"

The vault stores per-user key-value pairs scoped to a realm (or globally when no realm_id is given). Values can be any UTF-8 string: JSON, encrypted data, or plain text. The API does not validate or verify the content of stored values.

GET /api/v1/vault/keys

List all keys in your encrypted vault with metadata (key names, sizes, timestamps). Values are not included in this response; use GET /api/v1/vault/keys/{key} to retrieve individual values.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
Terminal window
curl -X GET "https://api.hoody.com/api/v1/vault/keys" \
-H "Authorization: Bearer $HOODY_TOKEN"

GET /api/v1/vault/keys/{key}

Retrieve a specific key-value pair from your encrypted vault by key name.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
Terminal window
curl -X GET "https://api.hoody.com/api/v1/vault/keys/api-keys.json" \
-H "Authorization: Bearer $HOODY_TOKEN"

PUT /api/v1/vault/keys/{key} (also accepted: PATCH, identical behaviour)

Create or update a key-value pair in your personal encrypted vault.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
NameTypeRequiredDescription
valuestringYesValue to store. Can be any UTF-8 string (JSON, encrypted data, plain text). The API does not validate or verify the content; encryption is required for sensitive data such as secrets, passwords, or API keys
metadataobjectNoOptional JSON metadata (max 256KB). Useful for file uploads to store content-type, filename, upload date, and similar. Must be valid JSON or null. Counts toward total vault storage
{
"value": "{\"api_key\": \"sk_test_123456\", \"encrypted\": true}",
"metadata": {
"filename": "api-keys.json",
"content_type": "application/json",
"encrypted": true
}
}
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/vault/keys/api-keys.json" \
-H "Authorization: Bearer $HOODY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"value": "{\"api_key\": \"sk_test_123456\", \"encrypted\": true}",
"metadata": { "encrypted": true }
}'

GET /api/v1/vault/stats

Retrieve statistics about your vault usage. total_keys and total_size_bytes are scoped to the current realm. limit_mb, remaining_mb, and used_percentage reflect global vault usage across all realms.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
Terminal window
curl -X GET "https://api.hoody.com/api/v1/vault/stats" \
-H "Authorization: Bearer $HOODY_TOKEN"

DELETE /api/v1/vault/keys/{key}

Permanently delete a key-value pair from your encrypted vault. This action cannot be undone.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/vault/keys/api-keys.json" \
-H "Authorization: Bearer $HOODY_TOKEN"

DELETE /api/v1/vault

Permanently delete all keys and values from your encrypted vault. This action cannot be undone.

NameInTypeRequiredDescription
realm_idquerystringNoTarget a specific realm (24-character hex). When omitted and not on a realm subdomain, defaults to global scope (realm_id = ""). Case-insensitive; uppercase is normalized to lowercase
Terminal window
curl -X DELETE "https://api.hoody.com/api/v1/vault" \
-H "Authorization: Bearer $HOODY_TOKEN"