Skip to main content
Most FastDrop capabilities are asynchronous: you submit a video, we return a job_id, and the work happens on a worker. There are three ways to get the result, and the right one depends on how long the answer takes and whether your service can receive an HTTP request.
Polling is never removed and never deprecated. Even with webhooks configured, the status endpoint stays the source of truth — it is how you reconcile after an outage on either side. What changed is that it is no longer the default.

Webhooks — the default

Register an endpoint once and stop asking:
You get the result the moment it exists, you make zero status requests, and you receive batch events that no single job status call could tell you about. See the Webhooks guide for payload shape, signature verification, and delivery history.

Long-poll — when you cannot receive callbacks

Add ?wait=N to any status request. The connection is held open until the job reaches a terminal state, or N seconds elapse — whichever comes first.
Set your client timeout above wait. A 60-second wait with a 30-second client timeout hangs up on a request that was about to answer. wait accepts 0–90 seconds and is available on:
  • GET /v1/classify/{job_id}
  • GET /v1/batch/{batch_id}
  • GET /mpp/classify/{job_id}
A wait that elapses is not an error. You get the current state — the same response wait=0 would have returned — and can call again:
Note there is no sleep in that loop. The wait is the sleep, and it ends the instant the job does.

Why this matters more than it looks

A 30–180 second job polled every 5 seconds costs 6–36 requests to return one answer. Nearly all of them say “not yet”. That has three consequences:
  • It can rate-limit you on a single job. The Free tier allows 10 requests/minute. A 5-second poll loop issues 12 in the first minute.
  • For agents, every poll is a turn. An MCP or machine-payments client spends a model turn and a round of tokens on each check. One waiting request costs one turn for the answer, not one turn per guess.
  • It scales badly. Batch status is recomputed from every job row on each request. A 50-video batch polled every 3 seconds does that work hundreds of times to return the same answer.

Choosing a wait value

Idempotency

Whichever mode you use, deliveries are at-least-once. Webhook events carry an id (evt_...) that is stable across retries and manual replays — key your handler on it and ignore ids you have already processed.

Reconciliation

Webhooks are a delivery mechanism, not a system of record. If your endpoint was down past the retry window, or you are not certain you processed everything:
  1. Check delivery history — GET /v1/webhooks/deliveries?status=failed shows what we could not deliver and why.
  2. Replay what you missed. The payload and its id are unchanged, so it costs no credits and your handler dedupes normally.
  3. Or read the job directly with GET /v1/classify/{job_id} — always available, always authoritative.

Webhooks guide

Payload shape, signature verification, delivery history, and replay.