Skip to content
Hightop docs header art
Hightop
API and Integrations

Endpoints#

Agent API v1 is the public /v1/agent/* surface. Generated OpenAPI artifacts may also include legacy agent-callable /actions/* and /info/* routes; those are not the v1 surface.

Trusted-destination mutation routes are not callable or exposed in public Agent API v1. If generated artifacts list mutation routes such as adding, confirming, cancelling, or removing trusted destinations, treat them as stale or reserved and do not call them.

Catalog#

Agent Context#

MethodPathDescription
GET/v1/agent/selfReturn the authenticated agent and scoped wallet context
GET/v1/agent/self/usageReturn rate-limit and usage state
GET/v1/agent/capabilitiesReturn capabilities for the authenticated agent
GET/v1/agent/capabilities.jsonReturn capabilities as JSON
GET/v1/agent/openapi.jsonReturn the generated Agent API OpenAPI document when the feature flag is enabled

Account and Balances#

MethodPathDescription
GET/v1/agent/accountReturn a scoped account summary
GET/v1/agent/assetsList visible assets
GET/v1/agent/protocolsList visible protocols
GET/v1/agent/balancesList balances
GET/v1/agent/balances/cashList cash balances
GET/v1/agent/activityList scoped Activity rows without marking them read

Operations#

MethodPathDescription
GET/v1/agent/operationsList AgentOperation rows
GET/v1/agent/operations/{id}Get one AgentOperation
POST/v1/agent/simulateValidate a write request shape without broadcasting

Recipients and Payments#

MethodPathDescription
GET/v1/agent/recipientsList recurring-payment and one-off-payment recipients
GET/v1/agent/recipients/{id}Get one recipient
POST/v1/agent/recipients/resolveResolve an agent-facing recipient identifier
GET/v1/agent/recurring-paymentsList recurring payment recipients
GET/v1/agent/recurring-payments/{id}Get one recurring payment recipient
GET/v1/agent/trusted-destinationsList trusted destinations
GET/v1/agent/trusted-destinations/{id}Get one trusted destination
GET/v1/agent/paymentsList payment operations
GET/v1/agent/payments/{id}Get one payment operation
POST/v1/agent/paymentsCreate a payment operation
GET/v1/agent/one-off-paymentsList one-off payment operations
GET/v1/agent/one-off-payments/{id}Get one one-off payment operation
POST/v1/agent/one-off-paymentsCreate a one-off payment operation

Transfers and Methods#

MethodPathDescription
GET/v1/agent/withdrawal-methodsList withdrawal methods
GET/v1/agent/deposit-methodsList deposit methods
GET/v1/agent/deposit-addressReturn a Base deposit address
GET/v1/agent/withdrawalsList withdrawal operations
GET/v1/agent/withdrawals/{id}Get one withdrawal operation
POST/v1/agent/withdrawals/to-bankCreate a bank withdrawal operation
POST/v1/agent/withdrawals/to-cryptoCreate a crypto withdrawal operation

Earn, Borrow, and Conversion#

MethodPathDescription
GET/v1/agent/earnList earn positions
GET/v1/agent/earn/{id}Get one earn position
GET/v1/agent/earn/opportunitiesList earn opportunities
POST/v1/agent/earn/depositCreate an earn deposit operation
POST/v1/agent/earn/withdrawCreate an earn withdrawal operation
POST/v1/agent/earn/moveCreate an earn move operation
POST/v1/agent/earn/rewards/claimCreate a rewards claim operation
GET/v1/agent/borrowReturn borrow summary
POST/v1/agent/borrowCreate a borrow operation
GET/v1/agent/borrow/collateralList collateral
POST/v1/agent/borrow/repayCreate a debt repayment operation
POST/v1/agent/borrow/deleverageCreate a target-LTV deleverage operation
POST/v1/agent/borrow/collateral/addCreate a collateral add operation
POST/v1/agent/borrow/collateral/removeCreate a collateral remove operation
POST/v1/agent/conversions/quoteCreate a stateful conversion quote
GET/v1/agent/conversionsList conversion operations
GET/v1/agent/conversions/{id}Get one conversion operation
POST/v1/agent/conversionsExecute a conversion from a quote

Webhooks#

MethodPathDescription
GET/v1/agent/webhooksList webhook endpoints
POST/v1/agent/webhooksCreate a webhook endpoint
GET/v1/agent/webhooks/{id}Get one webhook endpoint
PATCH/v1/agent/webhooks/{id}Update a webhook endpoint
DELETE/v1/agent/webhooks/{id}Delete or disable a webhook endpoint
POST/v1/agent/webhooks/{id}/rotate-secretRotate a webhook signing secret
GET/v1/agent/webhooks/{id}/deliveriesList webhook delivery attempts
POST/v1/agent/webhooks/{id}/testSend a webhook.test delivery

Endpoint Cards#

GET /v1/agent/self#

Purpose: return the authenticated agent, scoped wallet context, permissions, limits, and current usage.

Auth and scope: header-key auth or OAuth agent:read.

Idempotency: not required.

Request: no body.

Response:

json
example
{
  "ok": true,
  "agent": {
    "id": "uuid",
    "name": "Ops Agent",
    "enabled": true,
    "wallet_address": "0x...",
    "manager_address": "0x...",
    "agent_wrapper_address": "0x...",
    "active_window": {
      "starts_at": "2026-05-16T00:00:00.000Z",
      "expires_at": null
    }
  },
  "permissions": {},
  "limits": {},
  "cannot": [
    {
      "action": "string",
      "reason": "string"
    }
  ],
  "current_usage": {}
}

permissions, limits, and current_usage are agent-specific JSON objects and may grow over time. Treat additive fields as expected. cannot enumerates actions this agent configuration blocks, which is useful for surfacing capability boundaries in your own UI.

Common errors: authentication_failed, agent_disabled, agent_not_yet_active, agent_expired, insufficient_scope.

Related recipe: Quickstart.

GET /v1/agent/balances#

Purpose: list balances for the authenticated agent wallet.

Auth and scope: header-key auth or OAuth agent:read.

Idempotency: not required.

Query:

json
example
{
  "cursor": "string, optional",
  "limit": 50
}

Response:

json
example
{
  "ok": true,
  "items": [
    {
      "asset_symbol": "USDC",
      "asset_display_name": "USD Coin",
      "amount": "1",
      "amount_usd": "1",
      "category": "cash"
    }
  ],
  "next_cursor": null,
  "has_more": false
}

amount is a decimal asset-unit string. For USDC, "1" means 1 USDC.

Common errors: authentication_failed, insufficient_scope, rate_limited.

Related recipe: Quickstart.

POST /v1/agent/recipients/resolve#

Purpose: resolve an opaque recipient identifier, address, or handle into a recipient-shaped resource.

Auth and scope: header-key auth or OAuth agent:read.

Idempotency: not required.

Request:

json
example
{
  "to": "recipient id, address, or handle",
  "asset": "USDC",
  "action": "send_payment"
}

Fields:

FieldTypeRequired
tononempty stringYes
assetstringNo
actionrecipient action enumNo

Response:

json
example
{
  "ok": true,
  "recipient": {
    "id": "string",
    "type": "recurring_payment",
    "display_name": "Vendor",
    "nickname": "Compute vendor",
    "asset_symbols": ["USDC"],
    "status": "active",
    "agent_actions": ["send_payment"],
    "blocked_actions": {}
  }
}

Common errors: validation_failed, not_found, recipient_not_allowed, insufficient_scope.

Related recipe: Pay a Vendor.

POST /v1/agent/payments#

Purpose: create a payment operation to an active recurring-payment recipient, active one-off payment, or currently trusted destination.

Auth and scope: header-key auth or OAuth agent:payments:write.

Idempotency: required.

Request:

json
example
{
  "to": "recipient id, address, or handle",
  "asset": "USDC",
  "amount": "1",
  "deliver_as": "auto",
  "prefer": "auto",
  "note": null,
  "slippage_percent": 1
}

Use exactly one of amount or amount_usd. amount is a decimal asset-unit string. For USDC, "1" means 1 USDC.

Fields:

FieldTypeRequired
tononempty stringYes
assetnonempty stringYes
amountpositive decimal stringOne of amount or amount_usd
amount_usdpositive decimal stringOne of amount or amount_usd
deliver_asauto, one_off_payment, recurring_payment, or trusted_destinationNo
prefersame values as deliver_as; defaults to autoNo
notestring up to 500 chars, null, or omittedNo
slippage_percentnumber from 0 inclusive to 100 exclusiveNo

Current v1 execution rejects unsupported modifiers it cannot honor. Omit note unless you have confirmed support for the specific payment path.

Response:

json
example
{
  "ok": true,
  "operation_id": "uuid",
  "status": "submitted",
  "resource": {
    "type": "payment",
    "id": "uuid"
  },
  "fee_usd": "0",
  "human_message": "string"
}

Common errors: recipient_not_allowed, permission_not_granted, asset_not_allowed, limit_exceeded, insufficient_funds, validation_failed, idempotency_key_reuse_mismatch, idempotency_request_in_progress.

Related recipe: Pay a Vendor.

POST /v1/agent/conversions/quote#

Purpose: create a 60-second, single-use conversion quote.

Auth and scope: header-key auth or OAuth agent:simulate.

Quote creation uses agent:simulate because it prices and stores a short-lived quote without broadcasting. Only POST /v1/agent/conversions requires agent:conversions:write.

Idempotency: required.

Request:

json
example
{
  "from_asset": "USDC",
  "to_asset": "ETH",
  "amount": "1",
  "slippage_percent": 1
}

Use exactly one of amount or amount_usd. amount is a decimal asset-unit string in the from_asset. slippage_percent is a number.

Response:

json
example
{
  "ok": true,
  "quote": {
    "quote_id": "uuid",
    "from_asset": "USDC",
    "to_asset": "ETH",
    "from_amount": "1",
    "expected_out": "0.0003",
    "min_amount_out": "0.000297",
    "slippage_percent": 1,
    "human_rate": "string",
    "route": {
      "legs": [
        {
          "protocol_id": "string",
          "protocol_name": "string",
          "pool_address": "0x...",
          "from_asset": "USDC",
          "to_asset": "ETH",
          "expected_out": "0.0003",
          "fee_bps": 0
        }
      ],
      "intermediate_assets": []
    },
    "expires_at": "2026-05-16T00:00:00.000Z",
    "expires_in_seconds": 60
  }
}

Common errors: validation_failed, asset_not_allowed, protocol_not_allowed, limit_exceeded, price_stale, rate_limited.

Related recipe: Convert with a Quote.

POST /v1/agent/conversions#

Purpose: execute a conversion using a previously created quote.

Auth and scope: header-key auth or OAuth agent:conversions:write.

Idempotency: required.

Request:

json
example
{
  "quote_id": "uuid"
}

Response:

json
example
{
  "ok": true,
  "operation_id": "uuid",
  "status": "submitted",
  "resource": {
    "type": "conversion",
    "id": "uuid"
  },
  "fee_usd": "0"
}

Common errors: quote_expired, quote_already_consumed, slippage_exceeded, price_stale, insufficient_funds, permission_not_granted.

Related recipe: Convert with a Quote.

GET /v1/agent/operations/{id}#

Purpose: fetch one operation scoped to the authenticated agent.

Auth and scope: header-key auth or OAuth agent:read.

Idempotency: not required.

Path params:

json
example
{
  "id": "operation uuid"
}

Query:

json
example
{
  "include": "onchain"
}

include=onchain is optional.

Response:

error response
application/json
{
  "ok": true,
  "operation": {
    "id": "uuid",
    "idempotency_key_hash": "sha256 hex or null",
    "type": "payment",
    "status": "submitted",
    "resource": {
      "type": "payment",
      "id": "uuid"
    },
    "amount_usd": "1",
    "asset_symbol": "USDC",
    "human_message": "string",
    "fee_usd": "0",
    "created_at": "2026-05-16T00:00:00.000Z",
    "submitted_at": "2026-05-16T00:00:01.000Z",
    "executed_at": "2026-05-16T00:00:30.000Z",
    "failed_at": "2026-05-16T00:00:30.000Z",
    "error": {
      "code": "string",
      "message": "string"
    },
    "onchain": {
      "chain_id": 8453,
      "wallet_address": "0x...",
      "manager_address": "0x...",
      "agent_wrapper_address": "0x...",
      "agent_sender_address": "0x...",
      "tx_hash": "0x...",
      "user_operation_hash": "0x...",
      "bundler_hash": "0x...",
      "raw_destination_address": "0x...",
      "tx_calldata": "0x..."
    }
  }
}

Common errors: not_found, insufficient_scope, rate_limited.

Related recipe: any operation-backed recipe on this page.

POST /v1/agent/simulate#

Purpose: validate a target write request and body shape without broadcasting.

Auth and scope: header-key auth or OAuth agent:simulate.

Idempotency: not required.

Request:

json
example
{
  "method": "POST",
  "path": "/v1/agent/conversions/quote",
  "body": {
    "from_asset": "USDC",
    "to_asset": "ETH",
    "amount": "1",
    "slippage_percent": 1
  }
}

method may be POST, PATCH, or DELETE. path must start with /v1/agent/.

The simulate wrapper accepts body as an object and then validates it against the target route. Simulation validates request shape only. It does not check balances, permissions, LTV, recipient policy, quote freshness, fees, or broadcast viability.

Response:

json
example
{
  "ok": true,
  "would_succeed": true,
  "execution_path": ["validation"],
  "blocks": []
}

Common errors: validation_failed, insufficient_scope.

Related recipe: Quickstart.

POST /v1/agent/earn/deposit#

Purpose: create an earn deposit operation.

Auth and scope: header-key auth or OAuth agent:earn:write.

Idempotency: required.

Request:

json
example
{
  "asset": "USDC",
  "amount": "1",
  "use_best_available": true
}

Use exactly one of amount or amount_usd. Use exactly one of vault_id or use_best_available: true. amount is a decimal asset-unit string.

Response:

json
example
{
  "ok": true,
  "operation_id": "uuid",
  "status": "submitted",
  "resource": {
    "type": "earn_position",
    "id": "uuid"
  },
  "fee_usd": "0"
}

Common errors: validation_failed, asset_not_allowed, protocol_not_allowed, insufficient_funds, permission_not_granted, limit_exceeded.

Related recipe: Move Funds into Earn.

POST /v1/agent/withdrawals/to-bank#

Purpose: create a bank withdrawal operation to an owner-linked bank method that passes the authenticated wallet's trust checks.

Auth and scope: header-key auth or OAuth agent:withdrawals:write.

Idempotency: required.

Request:

json
example
{
  "method_id": "bank-method-id",
  "asset": "USDC",
  "amount": "1",
  "note": null
}

Use exactly one of amount or amount_usd. amount is a decimal asset-unit string. For USDC, "1" means 1 USDC. Current v1 execution rejects unsupported non-empty withdrawal notes, so omit note unless support is confirmed.

Response:

json
example
{
  "ok": true,
  "operation_id": "uuid",
  "status": "submitted",
  "resource": {
    "type": "withdrawal",
    "id": "uuid"
  },
  "fee_usd": "0"
}

Common errors: validation_failed, recipient_not_allowed, permission_not_granted, insufficient_funds, limit_exceeded.

Related recipe: Withdraw to a Bank.

POST /v1/agent/webhooks#

Purpose: create an outbound webhook endpoint.

Auth and scope: header-key auth or OAuth agent:webhooks:manage.

Idempotency: required.

Request:

json
example
{
  "url": "https://example.com/hightop/webhook",
  "description": "Production webhook",
  "event_types": ["payment.executed", "conversion.executed"]
}

event_types accepts only currently subscribable event types, not every reserved event in the full vocabulary.

Response:

json
example
{
  "ok": true,
  "webhook": {
    "id": "uuid",
    "url": "https://example.com/hightop/webhook",
    "description": "Production webhook",
    "event_types": ["payment.executed", "conversion.executed"],
    "enabled": true,
    "disabled_reason": null,
    "consecutive_failures": 0,
    "last_delivered_at": null,
    "last_failure_at": null,
    "created_at": "2026-05-16T00:00:00.000Z",
    "updated_at": "2026-05-16T00:00:00.000Z"
  },
  "signing_secret": "shown once"
}

Common errors: validation_failed, limit_exceeded, idempotency_key_reuse_mismatch, insufficient_scope.

Related recipe: Verify a Webhook.

PATCH /v1/agent/webhooks/{id}#

Purpose: update an outbound webhook endpoint.

Auth and scope: header-key auth or OAuth agent:webhooks:manage.

Idempotency: required.

Path params:

json
example
{
  "id": "webhook endpoint uuid"
}

Request:

json
example
{
  "url": "https://example.com/hightop/webhook",
  "description": "Updated webhook",
  "event_types": ["payment.executed"],
  "enabled": true
}

At least one field is required. event_types accepts only currently subscribable event types. If an endpoint was auto-disabled for sustained failures, enabled: true is owner-only and returns owner_only_action.

Response:

json
example
{
  "ok": true,
  "webhook": {
    "id": "uuid",
    "url": "https://example.com/hightop/webhook",
    "description": "Updated webhook",
    "event_types": ["payment.executed"],
    "enabled": true,
    "disabled_reason": null,
    "consecutive_failures": 0,
    "last_delivered_at": null,
    "last_failure_at": null,
    "created_at": "2026-05-16T00:00:00.000Z",
    "updated_at": "2026-05-16T00:05:00.000Z"
  }
}

Common errors: validation_failed, not_found, owner_only_action, idempotency_key_reuse_mismatch, insufficient_scope.

Related recipe: Verify a Webhook.

DELETE /v1/agent/webhooks/{id}#

Purpose: delete an outbound webhook endpoint.

Auth and scope: header-key auth or OAuth agent:webhooks:manage.

Idempotency: required.

Path params:

json
example
{
  "id": "webhook endpoint uuid"
}

Request: no body.

Response:

json
example
{
  "ok": true,
  "webhook": {
    "id": "uuid",
    "url": "https://example.com/hightop/webhook",
    "description": "Production webhook",
    "event_types": ["payment.executed"],
    "enabled": true,
    "disabled_reason": null,
    "consecutive_failures": 0,
    "last_delivered_at": null,
    "last_failure_at": null,
    "created_at": "2026-05-16T00:00:00.000Z",
    "updated_at": "2026-05-16T00:05:00.000Z"
  }
}

Common errors: not_found, idempotency_key_reuse_mismatch, insufficient_scope.

Related recipe: Verify a Webhook.

GET /v1/agent/webhooks/{id}/deliveries#

Purpose: list delivery attempts for one outbound webhook endpoint.

Auth and scope: header-key auth or OAuth agent:read.

Idempotency: not required.

Path params:

json
example
{
  "id": "webhook endpoint uuid"
}

Query:

json
example
{
  "status": "delivered",
  "event_id": "uuid",
  "cursor": "uuid",
  "limit": 50
}

status, event_id, cursor, and limit are optional. cursor is a delivery UUID and is valid only for the same endpoint and active filters.

Response:

json
example
{
  "ok": true,
  "items": [
    {
      "id": "uuid",
      "event_id": "uuid",
      "event_type": "payment.executed",
      "event_created_at": "2026-05-16T00:00:00.000Z",
      "endpoint_id": "uuid",
      "attempt": 1,
      "status": "delivered",
      "http_status": 200,
      "error_class": null,
      "latency_ms": 120,
      "response_body": "ok",
      "next_attempt_at": null,
      "first_attempt_at": "2026-05-16T00:00:00.000Z",
      "last_attempt_at": "2026-05-16T00:00:00.000Z",
      "terminal_at": "2026-05-16T00:00:00.000Z",
      "created_at": "2026-05-16T00:00:00.000Z",
      "updated_at": "2026-05-16T00:00:00.000Z"
    }
  ],
  "next_cursor": null,
  "has_more": false
}

Common errors: not_found, validation_failed, insufficient_scope, rate_limited.

Related recipe: Verify a Webhook.

Previous

Conventions

Next

Operations and Lifecycle