Lesson 12 / 27

Long-Running Operations and Bulk Requests

Return quickly with 202 and a status resource, and design bulk endpoints deliberately.

Do not make clients wait on a socket

When work takes more than a few seconds (video processing, large exports, report generation), accept the request, respond 202 Accepted with a Location pointing to a status resource (/exports/exp_9), and let the client poll it (pending, running, succeeded with a result link, or failed with a problem) or receive a webhook on completion. Include a Retry-After hint for polling. For bulk operations (create 500 items), decide the semantics up front: all-or-nothing, or per-item results (a 207-style list of successes and failures), cap the batch size, and make each item idempotent. Bulk endpoints reduce round trips but add complexity, so offer them only where clients truly need them.

The 202 flow

Illustrative HTTP exchange; the demo API does not implement exports.

POST /v1/exports          {"report": "orders", "month": "2026-09"}
<- 202 Accepted
   Location: /v1/exports/exp_9
   Retry-After: 5

GET /v1/exports/exp_9
<- 200 {"id":"exp_9","status":"running","progress":0.4}

GET /v1/exports/exp_9      (later)
<- 200 {"id":"exp_9","status":"succeeded","download_url":"https://files.example.com/exp_9.csv"}

Quick check: What should an API return for a request that will take minutes to finish?

  • 200 after blocking for minutes
  • 202 Accepted with a Location for a status resource
  • 204 and forget it
  • 401
Answer

202 Accepted with a Location for a status resource — Acknowledge quickly and let the client check progress separately.