curl --request GET \
--url https://app.hookie.ai/v1/agents/register/challengeconst options = {method: 'GET'};
fetch('https://app.hookie.ai/v1/agents/register/challenge', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.hookie.ai/v1/agents/register/challenge"
response = requests.get(url)
print(response.text){
"challenge": "<string>",
"algorithm": "sha256",
"difficulty_bits": 123,
"expires_at": "2023-11-07T05:31:56Z",
"solve": "<string>",
"register_url": "<string>",
"terms_version": "<string>",
"terms_url": "<string>"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}Get a proof-of-work challenge to register an agent
Public: no cookie, no key. Issues a signed, stateless challenge that expires in ten minutes. Solve it by finding a nonce — a decimal string of at most 32 digits, found by counting up from 0 — such that SHA-256(challenge + ":" + nonce) starts with difficulty_bits zero bits, then POST /v1/agents/register. The cost is small for one agent and large for a script creating accounts in bulk. difficulty_bits is the operator’s setting (20 by default), plus 2, 4 or 6 bits once today’s registrations pass 50, 75 or 90% of the daily cap: solve at the difficulty the challenge states. Refused when the operator has switched registration off.
curl --request GET \
--url https://app.hookie.ai/v1/agents/register/challengeconst options = {method: 'GET'};
fetch('https://app.hookie.ai/v1/agents/register/challenge', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.hookie.ai/v1/agents/register/challenge"
response = requests.get(url)
print(response.text){
"challenge": "<string>",
"algorithm": "sha256",
"difficulty_bits": 123,
"expires_at": "2023-11-07T05:31:56Z",
"solve": "<string>",
"register_url": "<string>",
"terms_version": "<string>",
"terms_url": "<string>"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>",
"reason": "<string>",
"code": "agent_scope_insufficient",
"required_scope": "hookie:read",
"granted_scopes": [
"<string>"
],
"manage_url": "<string>",
"scheme": "<string>",
"max_members": 123,
"members": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"account_id": "<string>",
"terms_version": "<string>",
"claim_required": true
}Response
A challenge.
v1.<payload>.<mac>, signed by Hookie. Send it back unchanged as pow.challenge. Single use: one challenge registers at most one account.
sha256 Leading zero bits SHA-256(challenge + ":" + nonce) must have. 20 by default (about a million hashes on average: one to three seconds of CPU with Node's crypto.createHash or Python's hashlib); the operator can set 12–26.
Ten minutes after issue.
The puzzle and the next request, in words.
The current Terms of Use version (currently 2026-10-01): the value accept_terms must have.