Skip to content
Hoody.com

Use these endpoints to read and update Hoody user profiles, audit account security, browse activity logs, manage free-tier onboarding, and read or write entries in your personal encrypted vault. Every endpoint on this page is a control-plane operation served from https://api.hoody.com. Authenticate with a first-party JWT for account-setting endpoints (onboarding milestones and invite redemption) or with an auth token for everything else, sent in the Authorization header as Bearer <token>.

Retrieve a user profile by ID. Admins can read any account; regular users may only read their own. The endpoint continues to work for banned accounts (read-only access). When the caller is an auth token that lacks the resources.read_account permission, the response is reduced to identity fields and email / account PII are omitted.

NameInTypeRequiredDescription
idpathstringYesUser ID to retrieve (24-character hexadecimal identifier)
Terminal window
curl -X GET "https://api.hoody.com/api/v1/users/507f1f77bcf86cd799439011" \
-H "Authorization: Bearer <token>"

Update a user profile. Regular accounts may change their own display alias and password (the request must include current_password for verification). Admins may update any account and may set the is_admin and is_banned flags. When the caller is an auth token that lacks the resources.read_account permission, the returned profile is reduced to identity fields and email / account PII are omitted.

NameInTypeRequiredDescription
idpathstringYesUser ID to update (24-character hexadecimal identifier)
FieldTypeRequiredDescription
aliasstringNoNew display name / alias (1-100 characters)
public_keystringNoED25519 public key (exactly 64 hexadecimal characters)
metadataobjectNoCustom metadata object for additional user information; may include nested objects
passwordstringNoNew password, at least 12 characters and three of four character classes; requires current_password for verification
current_passwordstringNoCurrent password (required when password is set)
is_adminbooleanNoAdmin status (admin-only field)
is_bannedbooleanNoBan status; banned accounts cannot call the API
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/users/507f1f77bcf86cd799439011" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"alias": "John Smith",
"current_password": "OldSecretPhrase42!",
"password": "NewSecretPhrase42!",
"metadata": { "department": "Engineering", "location": "San Francisco" }
}'

Returns whether the beta gate is enabled, whether this account is unlocked, whether it already owns a free server, and (advisory, point-in-time) why a claim is currently blocked. Never attempts a claim. Auth-token callers must hold the resources.read_account permission (account-level status); tokens without it receive 403. JWT / owner callers are unaffected.

This endpoint takes no parameters.

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

Redeem a single-use invite code to unlock free-tier server claiming during the beta, then immediately provision a free server. Idempotent if already unlocked. No-op (no code consumed) when the beta gate is disabled. Requires a first-party JWT; auth tokens, HTTP Basic, and impersonation are rejected.

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

Manually claim a free-tier server and create the default project and container. Idempotent; safe to call if already provisioned.

FieldTypeRequiredDescription
regionstringNoOptional preferred region override (lowercase alphanumeric and hyphens, up to 50 characters)
Terminal window
curl -X POST "https://api.hoody.com/api/v1/users/me/retry-setup" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"region": "node-us"
}'

Idempotently records a per-account onboarding / UI milestone (key to ISO timestamp). Used by the /auth/home first-run tour (milestone hub_tour_v1) and reusable for any future onboarding step. Setting an already-present milestone is a no-op; the original timestamp is kept.

FieldTypeRequiredDescription
milestonestringYesMilestone key, for example hub_tour_v1. Must match one of the supported milestone patterns.

This endpoint takes no additional path, query, or header parameters.

Terminal window
curl -X POST "https://api.hoody.com/api/v1/users/me/onboarding" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"milestone": "hub_tour_v1"
}'

Returns your own account security history: sign-ins and, on request, rejected attempts and other security events (logout, 2FA changes, OTP outcomes), with IP address, resolved country, source channel, and timestamp, newest first.

History covers the last 180 days, which is platform policy and the same for every account; 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.

Pass include_failed=true to also see rejected sign-in attempts. A burst of them, or any from a country you have not visited, is the clearest sign someone else is trying to get in. Failures are only recorded when a credential was presented against a real account (an attempt on an unknown address is never recorded, so this cannot be used to test whether an account exists), and are capped at 200 per account per hour; beyond that, further attempts in the same hour are not listed.

Pass include_security=true for other account-security events: logout, 2FA enable / disable, OTP verification outcomes, and backup-code use.

country is resolved in the background after the event is recorded. It is null when the address is not geolocatable at all (private, reserved, or IPv6; these stay null permanently), when the provider returned no country for it, or when resolution has not completed. Treat null as unavailable, never as a location. A null does not necessarily become non-null later: background retries stop once the row ages out of the retry window.

NameInTypeRequiredDescription
pagequeryintegerNoPage number (default 1)
limitqueryintegerNoResults per page (default 50)
include_failedquerybooleanNoAlso return rejected sign-in attempts against this account. Opt-in: mixing them in by default would make failed attempts look like your own sessions. (default false)
include_securityquerybooleanNoAlso return other account-security events: logout, 2FA enabled / disabled, 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&include_security=true&page=1&limit=50" \
-H "Authorization: Bearer <token>"

Retrieve activity logs for the authenticated user with optional filtering.

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

Retrieve storage usage statistics for activity logs.

This endpoint takes no parameters.

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

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 <token>"

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

NameInTypeRequiredDescription
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
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/my-encrypted-notes" \
-H "Authorization: Bearer <token>"

Create or update a key-value pair in your personal encrypted vault. Values can be any UTF-8 string (JSON, encrypted data, plain text). The API does not validate content; encryption is highly recommended.

NameInTypeRequiredDescription
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
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.
FieldTypeRequiredDescription
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 highly recommended for sensitive data such as secrets, passwords, and API keys.
metadataobjectNoOptional JSON metadata (max 256 KB). Useful for file uploads to store content-type, filename, upload date, and so on. Must be valid JSON or null. Counts toward storage.
Terminal window
curl -X PUT "https://api.hoody.com/api/v1/vault/keys/api-keys.json" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"value": "{\"api_key\": \"sk_test_123456\", \"encrypted\": true}",
"metadata": {
"filename": "api-keys.json",
"content_type": "application/json",
"purpose": "Production API keys"
}
}'

Permanently delete a single key-value pair from your vault. The action cannot be undone.

NameInTypeRequiredDescription
keypathstringYesVault key name (alphanumeric, dots, underscores, hyphens)
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/keys/api-keys.json" \
-H "Authorization: Bearer <token>"
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 <token>"

Return vault usage statistics. 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 <token>"