login
quiescence.eu
Skip to content

Quickstart

From a blank terminal to a finished, evidence-backed result in under five minutes, spending nothing. Get a sandbox key, discover a capability, price it, order it, and read the answer — the same four calls you will make in production, against the same endpoints, with the same shapes.

Get a key

Sign in and create an agent in the console. Take the ho_test_ key: it is free, unlimited within the rate limit, and a task ordered with it completes on a timer without any money moving or any person being contacted.

Create a sandbox key

Run this

Paste your key into the first line and run the rest as written. It needs curl and jq and nothing else. This exact script is executed by our test suite on every change, so if it stops working the build fails before you do.

export HO_KEY=ho_test_replace_me
export HO=https://quiescence.eu/humanops/api/v1

# 1. What can be delegated to a person?
curl -s "$HO/capabilities" | jq -r '.data.capabilities[].capability'

# 2. What does one cost in Barcelona, and by when?
curl -s -X POST "$HO/quote" -H 'Content-Type: application/json' \
  -d '{"capability":"human.verify",
       "location":{"country_iso":"ES","city_slug":"barcelona"}}' \
  | jq '.data | {feasible, price_cents, deadline: .sla.deadline_at}'

# 3. Order it. max_price_cents is a hard ceiling, and the Idempotency-Key
#    means a retry can never charge you twice.
REF=$(curl -s -X POST "$HO/tasks" \
  -H "Authorization: Bearer $HO_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: quickstart-$(date +%s)" \
  -d '{"capability":"human.verify",
       "spec":{"claim":"This address is a working office, not a mailbox",
               "subject":"Acme SL, Carrer de Balmes 200"},
       "location":{"country_iso":"ES","city_slug":"barcelona"},
       "max_price_cents":20000}' | jq -r '.data.ref')
echo "ordered $REF"

# 4. Wait exactly as long as you are told to, then read the answer.
while :; do
  SNAP=$(curl -s "$HO/tasks/$REF/result" -H "Authorization: Bearer $HO_KEY")
  [ "$(echo "$SNAP" | jq -r '.data.ready')" = "true" ] && break
  echo "  $(echo "$SNAP" | jq -r '.data.status')…"
  sleep "$(echo "$SNAP" | jq -r '.data.poll_after_s')"
done
echo "$SNAP" | jq '.data | {status, confidence_bps, answer}'

What just happened

The task walked the real state machine — queued, offered, accepted, in_progress, submitted, verifying, completed — and each step fired the webhook event a live task fires. The loop obeyed poll_after_s rather than guessing, which is the habit that keeps a production client inside its rate limit.

Everything the sandbox returns is marked. The answer says SANDBOX — synthetic result, not real evidence, and every sandbox task returns the same photograph, whose SHA-256 is always 55f1545adfcc724fc9e97880eb834a64d098c95898a95a32682590b65fabb86d. Never present one to a user as a finding.

Going live

Change the key. Nothing else: same base URL, same shapes, same limits. A ho_live_ key orders real work from a real person, so check coverage first and set max_price_cents to something you are happy to pay.

The task lifecycle, in full