Hands
API reference for hands endpoints.
Auto-generated
make generate-docs to refresh after spec changes.GET /api/v1/hands/access/invites
/api/v1/hands/access/invitesYour invite links
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/access/invites \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"quota": 0,
"invites": []
}POST /api/v1/hands/access/join
/api/v1/hands/access/joinJoin the Hands queue
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| invite_code | string | Optional | invite_code |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/access/join \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"state": "example",
"admitted": true,
"admissions_open": true,
"position": "example",
"waiting": 0,
"points": "example"
}GET /api/v1/hands/access/me
/api/v1/hands/access/meQueue state and position
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/access/me \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"state": "example",
"admitted": true,
"admissions_open": true,
"position": "example",
"waiting": 0,
"points": "example"
}POST /api/v1/hands/access/redeem
/api/v1/hands/access/redeemRedeem an invite code
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| code | string | Required | Code |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/access/redeem \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"code": "example_code"
}'Response Example
{
"state": "example",
"admitted": true,
"admissions_open": true,
"position": "example",
"waiting": 0,
"points": "example"
}POST /api/v1/hands/access/request
/api/v1/hands/access/requestAn agent requests Hands access for its user
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| resume_ref | string | Optional | resume_ref |
| invite_code | string | Optional | invite_code |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/access/request \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"state": "example",
"admitted": true,
"admissions_open": true,
"position": "example",
"waiting": 0,
"points": "example"
}GET /api/v1/hands/access/rules
/api/v1/hands/access/rulesThe published queue rules
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/access/rules \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/accounts
/api/v1/hands/accountsGet Account Map
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/accounts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/accounts/resolve
/api/v1/hands/accounts/resolveResolve Accounts
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| targets | object[] | Required | Targets |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/accounts/resolve \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"targets": []
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/alerts
/api/v1/hands/alertsHands List Alerts
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/alerts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"alerts": []
}POST /api/v1/hands/alerts/notify-pending
/api/v1/hands/alerts/notify-pendingHands Notify Pending Alerts
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/alerts/notify-pending \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/artifacts
/api/v1/hands/artifactsUpload Artifact
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/artifacts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/artifacts
/api/v1/hands/artifactsList Artifacts
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | limitDefault: 50 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/artifacts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"artifacts": []
}POST /api/v1/hands/artifacts/from-task-file
/api/v1/hands/artifacts/from-task-fileRegister Artifact From Task File
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | Task Id |
| file_id | string | Required | File Id |
| retention_s | integer | Optional | retention_s |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/artifacts/from-task-file \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task_id": "example_task_id",
"file_id": "example_file_id"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/artifacts/from-url
/api/v1/hands/artifacts/from-urlRegister Artifact From Url
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Required | Public http(s) URL to fetch and register |
| filename | string | Optional | filename |
| retention_s | integer | Optional | retention_s |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/artifacts/from-url \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "example_url"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/artifacts/verify-link
/api/v1/hands/artifacts/verify-linkVerify Link
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Required | Url |
| sha256 | string | Optional | sha256 |
| artifact_id | string | Optional | artifact_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/artifacts/verify-link \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "example_url"
}'Response Example
{
"status": 0,
"content_type": "example",
"hash_matches": "example",
"requires_login": true,
"ok": true
}GET /api/v1/hands/artifacts/{artifact_id}
/api/v1/hands/artifacts/{artifact_id}Read Artifact
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| artifact_id | string | Required | artifact_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/artifacts/<artifact_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"artifact_id": "example",
"filename": "example",
"mime": "example",
"size": 0,
"sha256": "example",
"origin": "example"
}DELETE /api/v1/hands/artifacts/{artifact_id}
/api/v1/hands/artifacts/{artifact_id}Remove Artifact
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| artifact_id | string | Required | artifact_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/artifacts/<artifact_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/audit
/api/v1/hands/auditHands List Audit
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | limitDefault: 50 |
| before_id | integer | Optional | before_id |
| task_id | string | Optional | task_id |
| outcome | string | Optional | outcome |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/audit \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"entries": [],
"next_before_id": "example"
}GET /api/v1/hands/audit/export
/api/v1/hands/audit/exportHands Export Audit
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| format | string | Optional | formatDefault: csv |
| include | string | Optional | receipts: add the signed outcome receipts (JSON only; the default shape is unchanged) |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/audit/export \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/budgets
/api/v1/hands/budgetsHands Get Budgets
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/budgets \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"site_classes": [],
"pacing": {}
}PUT /api/v1/hands/budgets
/api/v1/hands/budgetsPut Budgets
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| site_class | string | Required | Site Class |
| limits | object | Optional | Limits |
| median_s | number | Optional | median_s |
| working_hours_start | integer | Optional | working_hours_start |
| working_hours_end | integer | Optional | working_hours_end |
| utc_offset_minutes | integer | Optional | Utc Offset MinutesDefault: 0 |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/budgets \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"site_class": "example_site_class"
}'Response Example
{
"site_classes": [],
"pacing": {}
}POST /api/v1/hands/connect
/api/v1/hands/connectAsk the user to connect a site
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| site | string | Required | Site |
| scopes | string[] | Optional | scopes |
| reason | string | Optional | Reason |
| task_ref | string | Optional | task_ref |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/connect \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"site": "example_site",
"reason": "example_reason"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/connect/{connect_id}
/api/v1/hands/connect/{connect_id}Poll a connect request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| connect_id | string | Required | connect_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/connect/<connect_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/connect/{connect_id}/complete
/api/v1/hands/connect/{connect_id}/completeBind the approved session handle
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| connect_id | string | Required | connect_id |
| session_id | string | Required | Session Id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/connect/<connect_id>/complete \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "example_session_id"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/connect/{connect_id}/view
/api/v1/hands/connect/{connect_id}/viewRecord that the user opened a connect request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| connect_id | string | Required | connect_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/connect/<connect_id>/view \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/content/check
/api/v1/hands/content/checkContent Check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| content | object | Required | Outward text Hands will write for the user, with its claim bindings. |
| must_be_user_authored | boolean | Optional | Policy mark: the text is a personal statement only the user may authorDefault: False |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/content/check \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "...",
"must_be_user_authored": false
}'Response Example
{
"status": "example",
"issues": [],
"claims": [],
"bindings": [],
"content_hash": "example"
}GET /api/v1/hands/context-sources
/api/v1/hands/context-sourcesList Context Sources
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/context-sources \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"sources": []
}PUT /api/v1/hands/context-sources/{source}
/api/v1/hands/context-sources/{source}Toggle Context Source
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| source | string | Required | source |
| enabled | boolean | Required | Enabled |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/context-sources/<source> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'Response Example
{
"sources": []
}DELETE /api/v1/hands/context-sources/{source}
/api/v1/hands/context-sources/{source}Revoke Context Source
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| source | string | Required | source |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/context-sources/<source> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"source": "example",
"facts_marked_stale": 0
}POST /api/v1/hands/conversations
/api/v1/hands/conversationsCreate Conversation
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| counterparty | object | Required | Counterparty |
| channel | string | Required | Channel |
| goal | object | Required | Goal |
| limits | object | Optional | Set by the user at creation; nothing an inbound message says can change them. |
| persona | object | Optional | Persona |
| sender | string | Optional | sender |
| thread_ref | string | Optional | thread_ref |
| message_budget | integer | Optional | Message BudgetDefault: 10 |
| min_gap_s | integer | Optional | Min Gap SDefault: 60 |
| follow_up_delay_s | integer | Optional | follow_up_delay_s |
| follow_up_text | string | Optional | follow_up_text |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"counterparty": "...",
"channel": "example_channel",
"goal": "..."
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/conversations
/api/v1/hands/conversationsList Conversations
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/conversations \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"items": []
}GET /api/v1/hands/conversations/{conversation_id}
/api/v1/hands/conversations/{conversation_id}Get Conversation
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/conversations/<conversation_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"counterparty": {},
"channel": "example",
"goal": {},
"limits": {},
"persona": {}
}POST /api/v1/hands/conversations/{conversation_id}/inbound
/api/v1/hands/conversations/{conversation_id}/inboundPost Inbound
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| body | string | Required | Body |
| external_id | string | Optional | external_id |
| source | string | Optional | SourceDefault: mailbox |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/inbound \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "example_body",
"source": "example_source"
}'Response Example
{
"message": "example",
"conversation": "example"
}GET /api/v1/hands/conversations/{conversation_id}/messages
/api/v1/hands/conversations/{conversation_id}/messagesList Messages
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| limit | integer | Optional | limitDefault: 200 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/messages \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"items": []
}POST /api/v1/hands/conversations/{conversation_id}/messages
/api/v1/hands/conversations/{conversation_id}/messagesDraft Message Endpoint
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| body | string | Required | Body |
| claims | object[] | Optional | Claims |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/messages \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "example_body"
}'Response Example
{
"message": "example",
"decision": "example",
"reasons": [],
"dispatch": "example"
}POST /api/v1/hands/conversations/{conversation_id}/messages/{message_id}/approve
/api/v1/hands/conversations/{conversation_id}/messages/{message_id}/approveApprove Message Endpoint
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| message_id | string | Required | message_id |
| content_hash | string | Required | content_hash |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/messages/<message_id>/approve \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/conversations/{conversation_id}/messages/{message_id}/dispatch
/api/v1/hands/conversations/{conversation_id}/messages/{message_id}/dispatchDispatch Message
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| message_id | string | Required | message_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/messages/<message_id>/dispatch \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/conversations/{conversation_id}/messages/{message_id}/report
/api/v1/hands/conversations/{conversation_id}/messages/{message_id}/reportReport Message
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
| message_id | string | Required | message_id |
| outcome | string | Required | Outcome |
| external_id | string | Optional | external_id |
| thread_ref | string | Optional | thread_ref |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/messages/<message_id>/report \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"outcome": "example_outcome"
}'Response Example
{
"id": "example",
"counterparty": {},
"channel": "example",
"goal": {},
"limits": {},
"persona": {}
}POST /api/v1/hands/conversations/{conversation_id}/stop
/api/v1/hands/conversations/{conversation_id}/stopStop Conversation
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Required | conversation_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/conversations/<conversation_id>/stop \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"counterparty": {},
"channel": "example",
"goal": {},
"limits": {},
"persona": {}
}POST /api/v1/hands/credential-requests
/api/v1/hands/credential-requestsAsk the user for a credential
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | Task Id |
| domain | string | Required | Domain |
| fields | object[] | Required | Fields |
| reuse | "once" | "task" | "standing" | Optional | ReuseDefault: once |
| reason | string | Optional | Reason |
| expires_in_s | integer | Optional | Expires In SDefault: 900 |
| use_limit | integer | Optional | use_limit |
| valid_for_days | integer | Optional | valid_for_days |
| ask_each_time | boolean | Optional | Ask Each TimeDefault: False |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task_id": "example_task_id",
"domain": "example_domain",
"fields": [],
"reuse": "...",
"reason": "example_reason"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/credential-requests
/api/v1/hands/credential-requestsList credential requests
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Optional | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-requests \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"requests": []
}GET /api/v1/hands/credential-requests/standing
/api/v1/hands/credential-requests/standingStanding credentials a task on the same domain can reuse
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET 'https://api.alterlab.io/api/v1/hands/credential-requests/standing?task_id=<task_id>' \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"requests": []
}GET /api/v1/hands/credential-requests/{request_id}
/api/v1/hands/credential-requests/{request_id}Poll a credential request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-requests/<request_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}DELETE /api/v1/hands/credential-requests/{request_id}
/api/v1/hands/credential-requests/{request_id}Delete a credential request and its stored ciphertext
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/credential-requests/<request_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/credential-requests/{request_id}/confirm
/api/v1/hands/credential-requests/{request_id}/confirmLet one later task use an ask-each-time standing credential
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| task_id | string | Required | Task Id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/confirm \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task_id": "example_task_id"
}'Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}POST /api/v1/hands/credential-requests/{request_id}/confirm/email-code
/api/v1/hands/credential-requests/{request_id}/confirm/email-codeEmail a 6-digit code that confirms this request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/confirm/email-code \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"sent": true,
"expires_in": 0
}POST /api/v1/hands/credential-requests/{request_id}/confirm/options
/api/v1/hands/credential-requests/{request_id}/confirm/optionsPasskey challenge bound to this request and its terms
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| reuse | "once" | "task" | "standing" | Required | Reuse |
| ask_each_time | boolean | Optional | Ask Each TimeDefault: False |
| expires_in_days | integer | Optional | expires_in_days |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/confirm/options \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reuse": "...",
"ask_each_time": false
}'Response Example
{
"nonce": "example",
"challenge": "example",
"rpId": "example",
"allowCredentials": [],
"userVerification": "example",
"timeout": 0
}POST /api/v1/hands/credential-requests/{request_id}/decline
/api/v1/hands/credential-requests/{request_id}/declineDecline a credential request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/decline \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}GET /api/v1/hands/credential-requests/{request_id}/entry
/api/v1/hands/credential-requests/{request_id}/entryEntry-page data: envelope public key for browser-side sealing
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| short_code | string | Optional | short_code |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/entry \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request": "example",
"envelope": {},
"aad": "example",
"alternatives": "example"
}POST /api/v1/hands/credential-requests/{request_id}/handoffs
/api/v1/hands/credential-requests/{request_id}/handoffsCreate a single-use phone handoff (QR) for a credential request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/handoffs \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}
/api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}Poll a handoff's state
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| handoff_id | string | Required | handoff_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/handoffs/<handoff_id> \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"state": "example",
"device_label": "example"
}DELETE /api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}
/api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}Cancel a handoff (take it back on the laptop)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| handoff_id | string | Required | handoff_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/handoffs/<handoff_id> \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}/events
/api/v1/hands/credential-requests/{request_id}/handoffs/{handoff_id}/eventsSSE of handoff state changes
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| handoff_id | string | Required | handoff_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/handoffs/<handoff_id>/events \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/credential-requests/{request_id}/oauth/start
/api/v1/hands/credential-requests/{request_id}/oauth/startStart the OAuth connector alternative for a pending request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| short_code | string | Optional | short_code |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/oauth/start \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"authorization_url": "example",
"provider": "example"
}POST /api/v1/hands/credential-requests/{request_id}/pause
/api/v1/hands/credential-requests/{request_id}/pausePause a credential (fills fail until resumed)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/pause \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}POST /api/v1/hands/credential-requests/{request_id}/provide
/api/v1/hands/credential-requests/{request_id}/provideSubmit the browser-sealed credential (ciphertext only)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
| short_code | string | Optional | short_code |
| key_id | string | Required | Key Id |
| sealed | string | Required | Sealed |
| confirmation | object | Optional | Confirmation |
| handoff_token | string | Optional | handoff_token |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/provide \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"key_id": "example_key_id",
"sealed": "example_sealed"
}'Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}POST /api/v1/hands/credential-requests/{request_id}/resume
/api/v1/hands/credential-requests/{request_id}/resumeResume a paused credential
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/resume \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}POST /api/v1/hands/credential-requests/{request_id}/revoke
/api/v1/hands/credential-requests/{request_id}/revokeRevoke: destroy the stored ciphertext, immediate for running tasks
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| request_id | string | Required | request_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-requests/<request_id>/revoke \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"request_id": "example",
"task_id": "example",
"domain": "example",
"fields": [],
"reuse": "example",
"reason": "example"
}GET /api/v1/hands/credential-uses/{use_id}
/api/v1/hands/credential-uses/{use_id}One pending credential use
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| use_id | string | Required | use_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credential-uses/<use_id> \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"request_id": "example",
"task_id": "example",
"domain": "example",
"status": "example",
"method": "example"
}POST /api/v1/hands/credential-uses/{use_id}/approve
/api/v1/hands/credential-uses/{use_id}/approveApprove this use
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| use_id | string | Required | use_id |
| confirmation | object | Optional | Confirmation |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-uses/<use_id>/approve \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"request_id": "example",
"task_id": "example",
"domain": "example",
"status": "example",
"method": "example"
}POST /api/v1/hands/credential-uses/{use_id}/deny
/api/v1/hands/credential-uses/{use_id}/denyDeny this use
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| use_id | string | Required | use_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-uses/<use_id>/deny \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"request_id": "example",
"task_id": "example",
"domain": "example",
"status": "example",
"method": "example"
}POST /api/v1/hands/credential-uses/{use_id}/email-code
/api/v1/hands/credential-uses/{use_id}/email-codeEmail a use code
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| use_id | string | Required | use_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-uses/<use_id>/email-code \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"sent": true,
"expires_in": 0
}POST /api/v1/hands/credential-uses/{use_id}/options
/api/v1/hands/credential-uses/{use_id}/optionsPasskey challenge
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| use_id | string | Required | use_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/credential-uses/<use_id>/options \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"nonce": "example",
"challenge": "example",
"rpId": "example",
"allowCredentials": [],
"userVerification": "example",
"timeout": 0
}GET /api/v1/hands/credentials
/api/v1/hands/credentialsDashboard access map: which agent can reach which site
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/credentials \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"agents": [],
"sites": [],
"live": [],
"stream": []
}GET /api/v1/hands/facts
/api/v1/hands/factsGet Facts
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| subject | string | Optional | subject |
| key | string | Optional | Exact key |
| prefix | string | Optional | Key prefix |
| version | integer | Optional | version |
| history | boolean | Optional | All versions of subject+key, newest firstDefault: False |
| limit | integer | Optional | limitDefault: 50 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/facts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"facts": []
}PUT /api/v1/hands/facts
/api/v1/hands/factsPut Fact Route
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| subject | string | Required | Whose fact: user, org.acme, shop-a ... |
| key | string | Required | Namespaced key, e.g. user.address.home |
| value | string | Required | Value |
| kind | string | Optional | KindDefault: text |
| confidence | number | Optional | confidence |
| as_of | string | Optional | as_of |
| ttl_s | integer | Optional | ttl_s |
| system_of_record | string | Optional | system_of_record |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/facts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subject": "example_subject",
"key": "example_key",
"value": "example_value",
"kind": "example_kind"
}'Response Example
{
"subject": "example",
"key": "example",
"value": "example",
"kind": "example",
"status": "example",
"confidence": 0
}POST /api/v1/hands/facts/confirm
/api/v1/hands/facts/confirmConfirm Fact Route
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| subject | string | Required | Subject |
| key | string | Required | Key |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/facts/confirm \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subject": "example_subject",
"key": "example_key"
}'Response Example
{
"subject": "example",
"key": "example",
"value": "example",
"kind": "example",
"status": "example",
"confidence": 0
}POST /api/v1/hands/graphs
/api/v1/hands/graphsCreate Task Graph
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| credentials | string[] | Optional | Credentials |
| discovered_routes | object[] | Optional | Discovered Routes |
| graph | object | Required | Graph |
| policy | object | Required | What policy rules may match on when labelling a graph (same fields as the dry run). |
| name | string | Required | Name |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/graphs \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"graph": "...",
"policy": "...",
"name": "example_name"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/graphs/route
/api/v1/hands/graphs/routeRoute Task Graph
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| credentials | string[] | Optional | Credentials |
| discovered_routes | object[] | Optional | Discovered Routes |
| graph | object | Required | Graph |
| policy | object | Required | What policy rules may match on when labelling a graph (same fields as the dry run). |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/graphs/route \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"graph": "...",
"policy": "..."
}'Response Example
{
"valid": true,
"errors": [],
"routes": {},
"labels": []
}POST /api/v1/hands/graphs/validate
/api/v1/hands/graphs/validateValidate Task Graph
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| graph | object | Required | Graph |
| policy | object | Required | What policy rules may match on when labelling a graph (same fields as the dry run). |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/graphs/validate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"graph": "...",
"policy": "..."
}'Response Example
{
"valid": true,
"errors": [],
"graph": {},
"labels": []
}POST /api/v1/hands/graphs/{workflow_id}/replan
/api/v1/hands/graphs/{workflow_id}/replanTask Graph Replan
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| workflow_id | string | Required | workflow_id |
| node | string | Required | Node |
| evidence | object | Optional | Evidence |
| graph | object | Required | Graph |
| policy | object | Required | What policy rules may match on when labelling a graph (same fields as the dry run). |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/graphs/<workflow_id>/replan \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"node": "example_node",
"graph": "...",
"policy": "..."
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/graphs/{workflow_id}/replan-request
/api/v1/hands/graphs/{workflow_id}/replan-requestTask Graph Replan Request
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| workflow_id | string | Required | workflow_id |
| node | string | Required | Node |
| evidence | object | Optional | Evidence |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/graphs/<workflow_id>/replan-request \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"node": "example_node"
}'Response Example
{
"graph_version": "example",
"next_version": "example",
"failing_node": {},
"evidence": {},
"options": [],
"replans_remaining": 0
}POST /api/v1/hands/growth-run
/api/v1/hands/growth-runCreate Growth Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| rules | object | Optional | Rules |
| drafts | object | Optional | Drafts |
| approvals | object | Optional | Approvals |
| accounts | object[] | Optional | Accounts |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/growth-run \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/growth-run/scoreboard/public
/api/v1/hands/growth-run/scoreboard/publicPublic Growth Scoreboard
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/growth-run/scoreboard/public \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/growth-run/{run_id}/detail
/api/v1/hands/growth-run/{run_id}/detailGrowth Run Detail
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/growth-run/<run_id>/detail \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/growth-run/{run_id}/scoreboard
/api/v1/hands/growth-run/{run_id}/scoreboardPublish Growth Scoreboard
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/growth-run/<run_id>/scoreboard \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/handoffs/open
/api/v1/hands/handoffs/openOpen a handoff on the phone (same account, once)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| token | string | Required | Token |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/handoffs/open \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"token": "example_token"
}'Response Example
{
"request_id": "example"
}POST /api/v1/hands/identities
/api/v1/hands/identitiesPost Identity
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Name |
| profile | object | Optional | Profile |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/identities \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/identities
/api/v1/hands/identitiesList Identities
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/identities \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}DELETE /api/v1/hands/identities/{identity_id}
/api/v1/hands/identities/{identity_id}Remove Identity
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| identity_id | string | Required | identity_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/identities/<identity_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}PUT /api/v1/hands/identities/{identity_id}/accounts
/api/v1/hands/identities/{identity_id}/accountsPut Account
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| identity_id | string | Required | identity_id |
| target | string | Required | Target |
| session_id | string | Required | Session Id |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/identities/<identity_id>/accounts \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": "example_target",
"session_id": "example_session_id"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/identities/{identity_id}/sessions
/api/v1/hands/identities/{identity_id}/sessionsAttach Session
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| identity_id | string | Required | identity_id |
| session_id | string | Required | Session Id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/identities/<identity_id>/sessions \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "example_session_id"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/kill-switch
/api/v1/hands/kill-switchKill Switch Status
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/kill-switch \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"active": true
}DELETE /api/v1/hands/kill-switch
/api/v1/hands/kill-switchRelease Kill Switch
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/kill-switch \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"active": true
}POST /api/v1/hands/launch-campaign
/api/v1/hands/launch-campaignCreate Launch Campaign
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| launch_day | string | Required | Launch Day |
| rules | object | Optional | Rules |
| drafts | object | Optional | Drafts |
| accounts | object[] | Optional | Accounts |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/launch-campaign \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"launch_day": "example_launch_day"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/launch-campaign/reply-decision
/api/v1/hands/launch-campaign/reply-decisionLaunch Campaign Reply Decision
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| channel | string | Required | Channel |
| text | string | Required | Text |
| accounts | object[] | Optional | Accounts |
| dm_recipients | integer | Optional | Dm RecipientsDefault: 0 |
| paid | boolean | Optional | PaidDefault: False |
| disclosed | boolean | Optional | DisclosedDefault: False |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/launch-campaign/reply-decision \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "example_channel",
"text": "example_text",
"dm_recipients": 0,
"paid": false
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/launch-campaign/results/public
/api/v1/hands/launch-campaign/results/publicPublic Launch Results
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/launch-campaign/results/public \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/launch-campaign/{run_id}/conversations
/api/v1/hands/launch-campaign/{run_id}/conversationsOpen Launch Campaign Conversation
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| counterparty | object | Required | Counterparty |
| channel | string | Required | Channel |
| goal | object | Required | Goal |
| limits | object | Optional | Set by the user at creation; nothing an inbound message says can change them. |
| persona | object | Optional | Persona |
| sender | string | Optional | sender |
| thread_ref | string | Optional | thread_ref |
| message_budget | integer | Optional | Message BudgetDefault: 10 |
| min_gap_s | integer | Optional | Min Gap SDefault: 60 |
| follow_up_delay_s | integer | Optional | follow_up_delay_s |
| follow_up_text | string | Optional | follow_up_text |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/launch-campaign/<run_id>/conversations \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"counterparty": "...",
"channel": "example_channel",
"goal": "..."
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/launch-campaign/{run_id}/kill
/api/v1/hands/launch-campaign/{run_id}/killKill Launch Campaign
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/launch-campaign/<run_id>/kill \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/launch-campaign/{run_id}/results
/api/v1/hands/launch-campaign/{run_id}/resultsRecord Launch Campaign Results
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| metrics | object | Optional | Metrics |
| utm_clicks | object | Optional | Utm Clicks |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/launch-campaign/<run_id>/results \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/live-view
/api/v1/hands/live-viewStart a remote-browser sign-in
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain |
| domain_set | string[] | Optional | domain_set |
| name | string | Optional | NameDefault: Remote sign-in |
| capture_context | object | Required | Browser telemetry (user_agent, locale, timezone, ...) pinning the identity |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/live-view \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "example_domain",
"name": "example_name",
"capture_context": "..."
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/live-view/{live_view_id}
/api/v1/hands/live-view/{live_view_id}Poll a remote-browser sign-in
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| live_view_id | string | Required | live_view_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/live-view/<live_view_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"live_view_id": "example",
"status": "example",
"expires_at": "example",
"session_id": "example"
}DELETE /api/v1/hands/live-view/{live_view_id}
/api/v1/hands/live-view/{live_view_id}Cancel a remote-browser sign-in
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| live_view_id | string | Required | live_view_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/live-view/<live_view_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/local/tasks
/api/v1/hands/local/tasksLocal Tasks
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/local/tasks \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/permissions
/api/v1/hands/permissionsList Permissions
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/permissions \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/permissions
/api/v1/hands/permissionsCreate Permission
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| site | string | Required | Registered domain |
| action_class | "click" | "form_input" | "upload" | "any_write" | Required | Action Class |
| daily_limit | integer | Required | Daily Limit |
| recipe | string | Optional | recipe |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/permissions \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"site": "example_site",
"action_class": "...",
"daily_limit": 0
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/permissions/audit
/api/v1/hands/permissions/auditPermission Audit
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/permissions/audit \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}DELETE /api/v1/hands/permissions/{permission_id}
/api/v1/hands/permissions/{permission_id}Revoke Permission
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| permission_id | string | Required | permission_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/permissions/<permission_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/policies
/api/v1/hands/policiesGet Policies
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/policies \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"account": "example",
"keys": []
}PUT /api/v1/hands/policies
/api/v1/hands/policiesPut Policies
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| rules | object[] | Optional | Rules |
| key_id | string | Optional | key_id |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/policies \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"key_id": "example",
"version": 0,
"rules": [],
"created_at": "example"
}POST /api/v1/hands/policies/evaluate
/api/v1/hands/policies/evaluateEvaluate Policy
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| domains | string[] | Required | Domains |
| actions | object[] | Required | Actions |
| risk_classes | string[] | Optional | risk_classes |
| recipe | string | Optional | recipe |
| facts_verified | "all" | "any" | "none" | Optional | Facts VerifiedDefault: none |
| amount | number | Optional | amount |
| currency | string | Optional | currency |
| counterparty_class | string | Optional | counterparty_class |
| task_label | string | Optional | task_label |
| key_id | string | Optional | key_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/policies/evaluate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": [],
"actions": [],
"facts_verified": "..."
}'Response Example
{
"decision": "example",
"rule_ids": [],
"reasons": [],
"actions": []
}POST /api/v1/hands/policies/revoke
/api/v1/hands/policies/revokeRevoke Policies
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/policies/revoke \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"account": "example",
"keys": []
}GET /api/v1/hands/preferences
/api/v1/hands/preferencesList Standing Preferences
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/preferences \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"facts": []
}PUT /api/v1/hands/preferences
/api/v1/hands/preferencesPut Standing Preference
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Name |
| value | string | Required | Value |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/preferences \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "example_name",
"value": "example_value"
}'Response Example
{
"subject": "example",
"key": "example",
"value": "example",
"kind": "example",
"status": "example",
"confidence": 0
}POST /api/v1/hands/preview
/api/v1/hands/previewCreate Preview
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| goal | string | Required | Goal |
| public_url | string | Optional | public_url |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/preview \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"goal": "example_goal"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/quote
/api/v1/hands/quoteQuote Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| goal | string | Optional | goal |
| plan_hash | string | Optional | plan_hash |
| targets | integer | Optional | Number of sites or itemsDefault: 1 |
| browser_seconds | integer | Optional | browser_seconds |
| lookups | integer | Optional | lookups |
| proxy_bytes | integer | Optional | Proxy BytesDefault: 0 |
| browse_only | boolean | Optional | Browse OnlyDefault: False |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/quote \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"targets": 1
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/receipt-keys
/api/v1/hands/receipt-keysHands Receipt Keys
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/receipt-keys \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"schema_version": 0,
"keys": []
}GET /api/v1/hands/replays
/api/v1/hands/replaysPublic recorded-run replays: only approved runs whose receipt verifies
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/replays \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"v": 0,
"runs": []
}GET /api/v1/hands/replays/{run_id}/receipt
/api/v1/hands/replays/{run_id}/receiptPublic receipt check for a published replay (verify_url target)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/replays/<run_id>/receipt \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"verdict": "example",
"signature_valid": true,
"key_version": "example",
"bundle_hash": "example",
"recorded_at": "example"
}GET /api/v1/hands/requests/pending
/api/v1/hands/requests/pendingList Pending
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/requests/pending \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/requirements
/api/v1/hands/requirementsRequirements
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| goal | string | Required | Goal |
| target | object | Optional | What the goal acts on: a page, a named entity, or nothing in particular. |
| page_schema_id | string | Optional | page_schema_id |
| page_schema | object | Optional | What the current page asks of an agent (#39813); bounded, with a structural hash. |
| context_refs | string[] | Optional | Connected sources the user has (e.g. calendar, mail, drive, stripe) |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/requirements \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"goal": "example_goal"
}'Response Example
{
"requirements": [],
"unmapped": [],
"plan_hash": "example",
"page_schema_id": "example",
"untrusted_content": "example"
}GET /api/v1/hands/risk-disclosure
/api/v1/hands/risk-disclosureGet Risk Disclosure
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| site_class | string | Required | site_class |
Request Example
curl -X GET 'https://api.alterlab.io/api/v1/hands/risk-disclosure?site_class=<site_class>' \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"site_class": "example",
"version": 0,
"text": "example",
"acknowledged": true
}POST /api/v1/hands/risk-disclosure/ack
/api/v1/hands/risk-disclosure/ackAcknowledge Risk Disclosure
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| site_class | string | Required | Site Class |
| version | integer | Required | Disclosure version the user was shown |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/risk-disclosure/ack \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"site_class": "example_site_class",
"version": 0
}'Response Example
{
"site_class": "example",
"version": 0,
"text": "example",
"acknowledged": true
}POST /api/v1/hands/routes
/api/v1/hands/routesRoutes
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| goal | string | Required | Goal |
| entity | object | Required | RouteEntity |
| constraints | object | Optional | RouteConstraints |
| evidence | object[] | Optional | Evidence |
| connected_evidence | object[] | Optional | Connected Evidence |
| context_refs | string[] | Optional | Context Refs |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/routes \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"goal": "example_goal",
"entity": "..."
}'Response Example
{
"goal": "example",
"entity": {},
"routes": [],
"conflicts": [],
"intro_note": "example",
"discovery_plan": []
}POST /api/v1/hands/runs
/api/v1/hands/runsCreate Delegated Run Route
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| label | string | Required | Label |
| template | object | Optional | Template |
| targets | object | Required | Where a run's targets come from: a list, a fact query, or a fan-out over accounts. |
| schedule_interval_s | integer | Optional | schedule_interval_s |
| followup_after_s | integer | Optional | Followup After SDefault: 86400 |
| max_followups | integer | Optional | Max FollowupsDefault: 3 |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "example_label",
"targets": "...",
"followup_after_s": 86400
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/runs
/api/v1/hands/runsList Runs
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | limitDefault: 50 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/runs \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"runs": []
}POST /api/v1/hands/runs/stop-all
/api/v1/hands/runs/stop-allStop All Runs
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| scope | "user" | "agent_key" | Optional | ScopeDefault: user |
| api_key_id | string | Optional | api_key_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/stop-all \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": "..."
}'Response Example
{
"scope": "example",
"stopped": [],
"kill_switch": true
}POST /api/v1/hands/runs/targets/{target_id}/answer
/api/v1/hands/runs/targets/{target_id}/answerAnswer Target
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| target_id | string | Required | target_id |
| approved | boolean | Required | Approved |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/targets/<target_id>/answer \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"approved": false
}'Response Example
{
"id": "example",
"label": "example",
"status": "example",
"parent_run_id": "example",
"period_key": "example",
"schedule_interval_s": "example"
}POST /api/v1/hands/runs/wake
/api/v1/hands/runs/wakeWake Targets
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| type | "message" | "trigger" | "webhook" | Optional | TypeDefault: webhook |
| ref | string | Required | Ref |
| payload | object | Optional | Payload |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/wake \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "...",
"ref": "example_ref"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/runs/{run_id}
/api/v1/hands/runs/{run_id}Get Delegated Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/runs/<run_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"label": "example",
"status": "example",
"parent_run_id": "example",
"period_key": "example",
"schedule_interval_s": "example"
}POST /api/v1/hands/runs/{run_id}/advance
/api/v1/hands/runs/{run_id}/advanceAdvance Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| facts | object[] | Optional | Facts |
| act | object | Optional | ActRequest |
| finish | boolean | Optional | FinishDefault: False |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/<run_id>/advance \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"finish": false
}'Response Example
{
"id": "example",
"mode": "example",
"state": "example",
"blocked_reason": "example",
"goal": "example",
"target": {}
}POST /api/v1/hands/runs/{run_id}/answer
/api/v1/hands/runs/{run_id}/answerAnswer Delegation Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| request_id | string | Required | Request Id |
| decision | "approve" | "deny" | Optional | decision |
| answer | string | Optional | answer |
| via | "api" | "mcp" | "extension" | "dashboard" | "email" | "telegram" | Optional | ViaDefault: api |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/<run_id>/answer \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"request_id": "example_request_id",
"via": "..."
}'Response Example
{
"id": "example",
"mode": "example",
"state": "example",
"blocked_reason": "example",
"goal": "example",
"target": {}
}POST /api/v1/hands/runs/{run_id}/cancel
/api/v1/hands/runs/{run_id}/cancelCancel Delegated Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/<run_id>/cancel \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"label": "example",
"status": "example",
"parent_run_id": "example",
"period_key": "example",
"schedule_interval_s": "example"
}GET /api/v1/hands/runs/{run_id}/events
/api/v1/hands/runs/{run_id}/eventsRun Events
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| after | integer | Optional | afterDefault: 0 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/runs/<run_id>/events \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/runs/{run_id}/publish
/api/v1/hands/runs/{run_id}/publishPublish a completed run as a redacted, receipt-verified replay (owner-approved)
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| run_id | string | Required | run_id |
| approve | boolean | Required | Must be true: the owner approves publishing this run |
| title | string | Optional | title |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/runs/<run_id>/publish \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"approve": false
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/sessions
/api/v1/hands/sessionsList session handles with health and scopes
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/sessions \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}DELETE /api/v1/hands/sessions/{session_id}
/api/v1/hands/sessions/{session_id}Revoke a session handle
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| session_id | string | Required | session_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/sessions/<session_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/sessions/{session_id}/clear-risk
/api/v1/hands/sessions/{session_id}/clear-riskClear Session Risk
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| session_id | string | Required | session_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/sessions/<session_id>/clear-risk \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"session_id": "example",
"cleared_alerts": 0,
"status": "example"
}POST /api/v1/hands/skills
/api/v1/hands/skillsPromote Skill
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| workflow_id | string | Required | Stored task graph of the confirmed run |
| run_id | string | Required | The completed workflow run that confirmed it |
| name | string | Required | Name |
| description | string | Optional | description |
| bindings | object[] | Optional | Bindings |
| selectors | object | Optional | Selectors |
| schema_hashes | object | Optional | Schema Hashes |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/skills \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": "example_workflow_id",
"run_id": "example_run_id",
"name": "example_name"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/skills
/api/v1/hands/skillsList Skills
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/skills \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"items": []
}POST /api/v1/hands/skills/match
/api/v1/hands/skills/matchMatch Skills
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| goal | string | Required | Goal |
| site | string | Required | Site |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/skills/match \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"goal": "example_goal",
"site": "example_site"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/skills/{workflow_id}/repair
/api/v1/hands/skills/{workflow_id}/repairRepair Skill
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| workflow_id | string | Required | workflow_id |
| node | string | Required | Node |
| selectors | string[] | Required | Selectors |
| schema_hash | string | Optional | schema_hash |
| preview_task_id | string | Required | Preview-mode task that validated the patch |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/skills/<workflow_id>/repair \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"node": "example_node",
"selectors": [],
"preview_task_id": "example_preview_task_id"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks
/api/v1/hands/tasksCreate Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| start_url | string | Required | Start Url |
| session_id | string | Optional | session_id |
| identity_id | string | Optional | identity_id |
| mode | "read" | "write" | "preview" | Optional | 'preview' explores and fills in a throwaway context with no side effects: non-GET requests are aborted and submit, message, money and legal_attestation actions return preview_blockedDefault: read |
| execution | "remote" | "local" | Optional | 'local' runs actions in the user's own browser via the extension; no session material is uploadedDefault: remote |
| ttl_s | integer | Optional | Ttl SDefault: 900 |
| limits | object | Optional | TaskLimits |
| allowed_domains | string[] | Optional | allowed_domains |
| instruction | string | Optional | instruction |
| plan_hash | string | Optional | plan_hash |
| fact_refs | object[] | Optional | fact_refs |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"start_url": "example_start_url",
"mode": "...",
"execution": "..."
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/tasks
/api/v1/hands/tasksList Tasks
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | limitDefault: 25 |
| cursor | string | Optional | cursor |
| status | string | Optional | status |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"items": [],
"next_cursor": "example"
}GET /api/v1/hands/tasks/{task_id}
/api/v1/hands/tasks/{task_id}Get Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"status": "example",
"mode": "example",
"execution": "example",
"failure_reason": "example",
"start_url": "example"
}DELETE /api/v1/hands/tasks/{task_id}
/api/v1/hands/tasks/{task_id}Close Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X DELETE https://api.alterlab.io/api/v1/hands/tasks/<task_id> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"status": "example",
"mode": "example",
"execution": "example",
"failure_reason": "example",
"start_url": "example"
}POST /api/v1/hands/tasks/{task_id}/act
/api/v1/hands/tasks/{task_id}/actAct
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| actions | object[] | Required | Actions |
| approval_ref | string | Optional | approval_ref |
| budget_kind | "write" | "post" | "message" | "application" | Optional | budget_kind |
| recipe | string | Optional | recipe |
| provenance | object | Optional | Where a write intent came from; recorded in the audit log for every executed write. |
| bindings | object[] | Optional | bindings |
| require_verified | boolean | Optional | Refuse any fill/type/select value that has no binding (verification gate)Default: False |
| intent | object | Optional | Context the policy engine matches on (#39818). The amount is never taken from the caller: ''amount_fact'' points at a price fact that must verify at act time, and only then can a ''money'' rule auto-approve. |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/act \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actions": []
}'Response Example
{
"task_id": "example",
"step_id": "example",
"status": "example",
"failure_reason": "example",
"action_results": [],
"pending_request": "example"
}POST /api/v1/hands/tasks/{task_id}/answer
/api/v1/hands/tasks/{task_id}/answerAnswer
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| request_id | string | Required | Request Id |
| decision | "approve" | "deny" | Optional | decision |
| answer | string | Optional | answer |
| via | "api" | "mcp" | "extension" | "dashboard" | "email" | "telegram" | Optional | ViaDefault: api |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/answer \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"request_id": "example_request_id",
"via": "..."
}'Response Example
{
"id": "example",
"task_id": "example",
"kind": "example",
"status": "example",
"prompt": "example",
"choices": "example"
}GET /api/v1/hands/tasks/{task_id}/events
/api/v1/hands/tasks/{task_id}/eventsTask Events
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| after | integer | Optional | after |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/events \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/files
/api/v1/hands/tasks/{task_id}/filesUpload File
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| filename | string | Required | Filename |
| content_type | string | Optional | Content TypeDefault: application/octet-stream |
| content_base64 | string | Required | Content Base64 |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/files \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filename": "example_filename",
"content_type": "example_content_type",
"content_base64": "example_content_base64"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/human
/api/v1/hands/tasks/{task_id}/humanAsk Human
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| reason | "founder_video" | "signature" | "legal_attestation" | "live_interview" | Required | Reason |
| prompt | string | Required | Prompt |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/human \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "...",
"prompt": "example_prompt"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/human/{request_id}/complete
/api/v1/hands/tasks/{task_id}/human/{request_id}/completeComplete Human
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| request_id | string | Required | request_id |
| attested | boolean | Required | The user confirms they did this step themselves |
| artifact_base64 | string | Optional | artifact_base64 |
| filename | string | Optional | filename |
| content_type | string | Optional | content_type |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/human/<request_id>/complete \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"attested": false
}'Response Example
{
"id": "example",
"task_id": "example",
"kind": "example",
"status": "example",
"prompt": "example",
"choices": "example"
}GET /api/v1/hands/tasks/{task_id}/local/next
/api/v1/hands/tasks/{task_id}/local/nextLocal Next
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/local/next \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"step": "example"
}POST /api/v1/hands/tasks/{task_id}/local/result
/api/v1/hands/tasks/{task_id}/local/resultLocal Result
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| step_id | string | Required | Step Id |
| status | string | Optional | StatusDefault: running |
| failure_reason | string | Optional | failure_reason |
| action_results | object[] | Optional | Action Results |
| observation | object | Optional | observation |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/local/result \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"step_id": "example_step_id",
"status": "example_status"
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/local/stop
/api/v1/hands/tasks/{task_id}/local/stopLocal Stop
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/local/stop \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"status": "example",
"mode": "example",
"execution": "example",
"failure_reason": "example",
"start_url": "example"
}GET /api/v1/hands/tasks/{task_id}/observe
/api/v1/hands/tasks/{task_id}/observeObserve
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/observe \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"url": "example",
"observation": "example",
"untrusted_content": "example"
}PUT /api/v1/hands/tasks/{task_id}/outcome
/api/v1/hands/tasks/{task_id}/outcomeDeclare what resolved means for a task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| definition | object | Required | What resolved means and how to observe it. |
| deadline_s | integer | Required | Deadline S |
| check_interval_s | integer | Optional | Check Interval SDefault: 3600 |
Request Example
curl -X PUT https://api.alterlab.io/api/v1/hands/tasks/<task_id>/outcome \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"definition": "...",
"deadline_s": 0,
"check_interval_s": 3600
}'Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/outcome/observations
/api/v1/hands/tasks/{task_id}/outcome/observationsRecord an observation of a task's outcome
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| source | "api" | "mail" | "page" | "ledger" | "confirmation_page" | Required | Source |
| value | string | Required | Value |
| evidence | object | Optional | evidence |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/outcome/observations \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": "...",
"value": "example_value"
}'Response Example
{
"task_id": "example",
"state": "example",
"definition": {},
"deadline_at": "example",
"next_check_at": "example",
"followup_count": 0
}POST /api/v1/hands/tasks/{task_id}/pause
/api/v1/hands/tasks/{task_id}/pausePause Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/pause \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"paused_by": "example"
}POST /api/v1/hands/tasks/{task_id}/questions
/api/v1/hands/tasks/{task_id}/questionsAsk User
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| kind | "question" | "connect" | Optional | KindDefault: question |
| prompt | string | Required | Prompt |
| choices | string[] | Optional | choices |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/questions \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "...",
"prompt": "example_prompt"
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/tasks/{task_id}/requests
/api/v1/hands/tasks/{task_id}/requestsList Task Requests
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/requests \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/tasks/{task_id}/resume
/api/v1/hands/tasks/{task_id}/resumeResume Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/resume \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"paused_by": "example"
}POST /api/v1/hands/tasks/{task_id}/schema
/api/v1/hands/tasks/{task_id}/schemaPage Schema
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/schema \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"url": "example",
"page_schema": "example",
"untrusted_content": "example"
}POST /api/v1/hands/tasks/{task_id}/steer
/api/v1/hands/tasks/{task_id}/steerSteer Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| instruction | string | Required | Instruction |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/steer \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"instruction": "example_instruction"
}'Response Example
{
"id": "example",
"text": "example",
"at": "example",
"by": "example",
"trusted": true
}POST /api/v1/hands/tasks/{task_id}/stop
/api/v1/hands/tasks/{task_id}/stopStop Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/stop \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"paused_by": "example"
}POST /api/v1/hands/tasks/{task_id}/takeover
/api/v1/hands/tasks/{task_id}/takeoverTakeover Task
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/takeover \
-H "Authorization: Bearer YOUR_SESSION_TOKEN" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/tasks/{task_id}/timeline
/api/v1/hands/tasks/{task_id}/timelineOne timeline per task: declaration, observations, state changes, follow-up
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/timeline \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"outcome": "example",
"events": []
}POST /api/v1/hands/tasks/{task_id}/vision/act
/api/v1/hands/tasks/{task_id}/vision/actVision Act
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| x | number | Required | CSS pixels from the viewport origin |
| y | number | Required | Y |
| selector | string | Optional | selector |
| expect | object | Optional | Read-back expectation: {{'text': 'shown after'}} or {{'changed': true}} |
| approval_ref | string | Optional | approval_ref |
| recipe | string | Optional | recipe |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/vision/act \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"x": 0,
"y": 0
}'Response Example
{
"task_id": "example",
"step_id": "example",
"status": "example",
"failure_reason": "example",
"action_results": [],
"pending_request": "example"
}POST /api/v1/hands/tasks/{task_id}/vision/capture
/api/v1/hands/tasks/{task_id}/vision/captureVision Capture
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
| selector | string | Optional | selector |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/tasks/<task_id>/vision/capture \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"failure_reason": "example",
"capture": "example",
"vision": "example",
"untrusted_content": "example"
}GET /api/v1/hands/tasks/{task_id}/watch
/api/v1/hands/tasks/{task_id}/watchWatch Run
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| task_id | string | Required | task_id |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/tasks/<task_id>/watch \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"task_id": "example",
"status": "example",
"paused_by": "example",
"pages": 0,
"actions": 0,
"events": []
}POST /api/v1/hands/triggers
/api/v1/hands/triggersCreate Trigger
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| label | string | Required | Label |
| source_type | string | Required | Source Type |
| source_ref | string | Optional | source_ref |
| condition | object | Optional | Fires when the observed fact value satisfies ''op threshold''; verified before acting. |
| run_template | object | Required | RunTemplate |
| rate_limit_per_hour | integer | Optional | Rate Limit Per HourDefault: 4 |
| spend_limit | number | Optional | spend_limit |
| breaker_threshold | integer | Optional | Breaker ThresholdDefault: 3 |
| interval_s | integer | Optional | interval_s |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/triggers \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "example_label",
"source_type": "example_source_type",
"run_template": "..."
}'Response Example
{
"status": "ok"
}GET /api/v1/hands/triggers
/api/v1/hands/triggersList Triggers
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/triggers \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"triggers": []
}POST /api/v1/hands/triggers/{trigger_id}/fire
/api/v1/hands/triggers/{trigger_id}/fireFire Trigger
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| trigger_id | string | Required | trigger_id |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/triggers/<trigger_id>/fire \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}GET /api/v1/hands/triggers/{trigger_id}/firings
/api/v1/hands/triggers/{trigger_id}/firingsList Firings
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| trigger_id | string | Required | trigger_id |
| limit | integer | Optional | limitDefault: 50 |
Request Example
curl -X GET https://api.alterlab.io/api/v1/hands/triggers/<trigger_id>/firings \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"firings": []
}POST /api/v1/hands/triggers/{trigger_id}/webhook
/api/v1/hands/triggers/{trigger_id}/webhookTrigger Webhook
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| trigger_id | string | Required | trigger_id |
| x-trigger-token | string | Optional | x-trigger-token |
| value | string | Optional | Value |
| step_id | string | Optional | step_id |
| job_id | string | Optional | job_id |
| url | string | Optional | url |
| fetched_at | string | Optional | fetched_at |
| tier | string | Optional | tier |
| evidence | string | Optional | Evidence |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/triggers/<trigger_id>/webhook \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"status": "ok"
}POST /api/v1/hands/triggers/{trigger_id}/{action}
/api/v1/hands/triggers/{trigger_id}/{action}Trigger Action
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| trigger_id | string | Required | trigger_id |
| action | string | Required | action |
Request Example
curl -X POST https://api.alterlab.io/api/v1/hands/triggers/<trigger_id>/<action> \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json"Response Example
{
"id": "example",
"label": "example",
"source_type": "example",
"source_ref": "example",
"condition": "example",
"run_template": {}
}