AI + human labeling · Cloudflare edge

Labels that settle
on agreement,
not on one opinion.

Every sample is answered by AI models and human labelers. Nothing is delivered until the votes agree under the quality tier you picked. Realtime in under two minutes, or batch for half the price.

7 task types 3 quality tiers 120 s realtime deadline 0 unverified labels
tsk_7f2k… bounding_boxes · verifiedhuman_pending → settled
ai · gemini-3.7-flash
human · lab_9kd2
car · IoU 0.91 · settled
x 124 y 169 w 286 h 166
00.00created → ask ai gemini-3.7-flash, ask 1 human
04.12ai_vote valid · [{x:116,y:163,w:300,h:173}]
11.48human_vote valid · [{x:132,y:175,w:272,h:159}]
11.49settled · consensus — cluster of 2 (1 human) met quorum 2/1 · charged $0.05

How it works

One state machine. Three ways to exit it.

A task is a vote. AI models and labelers each submit a label; labels that match under the task's tolerance form a cluster. The task settles the moment a cluster meets the quorum of its tier.

01 — VOTE

AI answers first, in parallel with a human

A structured prompt per task type asks a vision model for JSON in the exact label shape. A labeler gets the same image with the same question at the same moment.

aihuman
02 — CLUSTER

Agreement is measured, not eyeballed

Grid cells must match as a set, clicks within a pixel radius, boxes by IoU, text after normalisation. Geometric clusters deliver the mean, so five clicks return the centre.

set equalityradius pxIoU ≥ 0.7
03 — SETTLE

Disagreement adds a human, never a guess

If the AI and the human disagree, one more labeler is asked, until two votes agree. Two humans can overrule the model. Past the cap, the task escalates to review instead of delivering noise.

settledescalated
ai_consensus
Two models agree

Cheapest. Humans enter only when the model pool runs out without a quorum.

quorum 2 · min human 0 · max human 3
verified — default
AI + human agree

One model and one labeler in parallel; disagreement adds labelers one at a time until two votes match.

quorum 2 · min human 1 · max human 5
gold
Two humans agree

For ground truth and evaluation sets. The AI vote is a hint that can only be part of a bigger cluster.

quorum 2 · min human 2 · max human 6

Pricing

Priced by what the task actually costs.

A yes/no question and a bounding box are not the same amount of work, for a model or for a person. Prices are per 1,000 samples in the verified tier; you are charged only when a task settles.

Task typeAnswerRealtimeBatchAgreement rule
Yes / no about an imageimage_yesnotrue · false$10$5equal
Select matching grid cellsgrid_select[0, 4, 7]$10$5same set of cells
Click the requested objectsclick_points[{x, y}]$12$6every point within 20 px
Transcribe the characterstranscribe_text"x7k2pq"$15$8equal after normalisation
Drag pieces to their targetsdrag_pieces[{from, to}]$25$12both ends within 20 px
Slider puzzle offsetslide_offset137$25$12within 5 px
Draw bounding boxesbounding_boxes[{x, y, w, h, label}]$50$25IoU ≥ 0.7, same label

Escalated and failed tasks are never charged. Realtime tasks that hit the 120 s deadline without a quorum are delivered best-effort, flagged as such, at the batch price. Volume and custom task types on request.

API

One POST in, one webhook out.

Send an image and a task type. Poll the task or register a webhook; the payload carries the label, who agreed on it, and the cluster it came from. Coordinates are always pixels of the image you sent.

create a task

# realtime, verified tier (defaults)
curl https://boundbox.ai/v1/tasks \
  -H "Authorization: Bearer $BOUNDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "task_type": "grid_select",
    "image_url": "https://…/captcha.png",
    "width": 300, "height": 300,
    "prompt": "cells with a bus",
    "config": { "rows": 3, "cols": 3 }
  }'

webhook · task.settled

{
  "event": "task.settled",
  "task": {
    "id": "tsk_fkqg1zigqgks",
    "state": "settled", "outcome": "consensus",
    "label": [0, 4],
    "source": "mixed",
    "agreement": { "clusters": [{ "size": 2, "humans": 1, "ais": 1 }],
                   "quorum": 2, "min_human": 1 },
    "price_usd": 0.01
  }
}

Quality

Every labeler is measured on every shift.

Gold honeypots

Samples with a known answer are mixed into every labeler's queue. Accuracy on them drives a trust score that gates who gets work.

Agreement rate

At settlement, every vote is marked as inside or outside the winning cluster. Labelers who keep landing outside stop receiving that task type.

Frozen policy

A task snapshots its tolerances, prompt and quorum at creation. A catalogue change never re-scores a task in flight.

Full audit trail

Every state transition, vote, model cost and payout is a ledger row you can ask for. No label without a reason attached.