Agent Spend Quickstart

Fund a wallet, issue a spending key, and make your first governed spend request in Dino.

Dino's flagship developer flow is governed spend for agents: fund a wallet, create a spend account, issue a spending key, then call the public REST /v1 API.

#Current status

Today, the canonical shipped surface for agent spend is:

  • REST /v1
  • Dino spending keys
  • dashboard approvals and ledger

CLI, MCP spend tools, and the TypeScript SDK are rolling out in stages. Use the REST flow below as the source of truth.

#What you need

Before making your first request:

  1. In the Dino dashboard, add a funding source to your team wallet.
  2. Create a spend account for the agent, automation, or service.
  3. Configure its budget, max transaction size, and optional approval threshold.
  4. Issue a Dino spending key for that spend account.

The plaintext spending key is only shown once.

#Request spend

Use the public agent-spend API:

curl -sS -X POST "https://api.dino.id/v1/spend" \
  -H "Authorization: Bearer YOUR_DINO_SPEND_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "amount_cents": 12000,
    "currency": "usd",
    "merchant_name": "AWS",
    "reason": "GPU runtime for evaluation job"
  }'

#Possible responses

#Approved

{
  "id": "req_123",
  "status": "approved",
  "decision_reason": "Spend request approved",
  "budget_period": "monthly",
  "remaining_budget_cents": 38000,
  "remaining_monthly_budget_cents": 38000,
  "amount_cents": 12000,
  "currency": "usd",
  "merchant_name": "AWS"
}

#Needs approval

{
  "id": "req_124",
  "status": "needs_approval",
  "decision_reason": "Amount requires approval",
  "budget_period": "monthly",
  "remaining_budget_cents": 50000,
  "remaining_monthly_budget_cents": 50000,
  "amount_cents": 60000,
  "currency": "usd",
  "merchant_name": "OpenAI",
  "approval_url": "https://app.dino.id/agents/approvals?spendRequestId=req_124"
}

#Declined

{
  "id": "req_125",
  "status": "declined",
  "decision_reason": "Amount would exceed the budget for this period",
  "budget_period": "monthly",
  "remaining_budget_cents": 5000,
  "remaining_monthly_budget_cents": 5000,
  "amount_cents": 12000,
  "currency": "usd",
  "merchant_name": "Vercel"
}

#Check status

curl -sS "https://api.dino.id/v1/spend/req_123" \
  -H "Authorization: Bearer YOUR_DINO_SPEND_KEY"

#Check remaining budget

curl -sS "https://api.dino.id/v1/balance" \
  -H "Authorization: Bearer YOUR_DINO_SPEND_KEY"

#Error handling

Expect machine-readable errors in this shape:

{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded"
  }
}

Common codes:

  • invalid_api_key
  • revoked_api_key
  • invalid_request
  • funding_source_budget_exceeded
  • plan_spend_volume_exceeded
  • rate_limited

#Approvals and ledger

If a request returns needs_approval, route the operator to approval_url and treat the request as pending. Every decision is persisted to Dino's ledger for later audit.

#Next steps