bench / 001 ยท rev 01
AI integration benchmark for real API work
Can AI coding agents build integrations that stay correct against a live API? Integration Bench measures whether an agent can make code talk correctly to a live third-party API. Every vendor is generated, so no model has encountered one before.
The public suite comprises 50 Python tasks across 15 fictional vendor systems, spanning build, fix, harden, and migrate work. Each vendor is a stateful API simulator with its own auth, pagination, webhooks, rate limits, injectable faults, and imperfect documentation.
Grading reads vendor-side evidence rather than submitted code. A trusted verifier checks final state and protocol behavior after a fresh vendor stack is started. Forty-six tasks exercise polling, 23 writeback, and 11 webhooks.
Results
Public suite. Characterises the benchmark, not the models.
- 01
Claude Fable 5 67.68 34/50 resolved
- 02
GPT-5.6 Sol 63.62
- 03
DeepSeek V4 Pro (max) 63.35
- 04
Qwen 3.8 2.4T A95B 61.68
- 05
Grok 4.6 61.18
- 06
Claude Opus 5 59.32
- 07
Qwen 3.8 27B (xhigh) 57.73
- 08
Kimi K3 57.47
- 09
DeepSeek V4 Flash (max) 55.68
- 10
Claude Opus 4.8 55.58
- 11
Claude Sonnet 5 53.85
- 12
GPT-5.6 Terra 53.79
- 13 Muse Spark 1.2 53.70
- 14
GPT-5.6 Luna 51.78
- 15
GLM 5.2 (xhigh) 49.68
- 16
Claude Haiku 4.5 15.10
- –
Gemini 3.7 Flash 35.85 28/50 graded
Sixteen complete model-harness configurations, 50 public tasks, one selected attempt per model-task slot. Mean Task Score among complete rows is 55.07. No complete model resolves more than 34 tasks. Gemini 3.7 Flash is unranked: 22 of 50 attempts failed in provider infrastructure, and 35.85 is the all-slot lower bound.
Incremental candidate sync against a generated vendor
An illustrative task from the public 50. Every vendor in the suite is generated, so the specifics below exist only inside this environment.
Task
task / 0001
Synchronize candidates from StaffLine under HMAC authentication, then capture incremental updates and tombstones. A connector that finishes the initial backfill can still fail if the next poll skips valid changes.
Decisive invariant
- Watermarks stay in the upstream clock domain.
- Inclusive replay of the last observed modification timestamp is safe.
- Tombstones and later updates must land after the first backfill.
View more View less
Your task
Resolve the engineering ticket in PROBLEM.md by producing durable
integration software in the starter repository. Gather context from the
running vendor services before implementing anything.
The vendor services are mandatory. A solution that never puts signed requests on the wire cannot pass, and the services must be reachable from the connector before work begins.
Ticket: Candidate sync against StaffLine drops changes after the first backfill.
Context gathering strategy
Treat the ticket as the requirement, not the wire contract. The contract lives in the vendor’s served documentation and in the responses the vendor actually returns. Documentation in this suite is truthful, stale, or sparse, so any rule the ticket leaves implicit has to be recovered by reading the docs and observing behavior.
Protocol usage
No MCP servers are exposed in this environment. The vendor APIs are the tools. If a harness does front them with MCP, treat it as another transport and keep the wire contract identical.
- Read the service endpoints and synthetic credentials from the environment and from declared inputs.
- Fetch each vendor’s participant documentation, served from the same image as the API.
- Authenticate every call. Expect static or rotating credentials, OAuth-like token exchange, and HMAC request signatures.
- Walk collections with the pagination style the vendor advertises, not an assumed one.
- Persist progress in the vendor’s clock domain, from values the vendor returned.
- Make writes idempotent, and honor advertised rate limits, retry rules, and optimistic concurrency.
- Survive restarts, transient server errors, stale reads, dropped or duplicated events, and cursor or token expiry.
# discover the wire contract
curl -s "$STAFFLINE_URL/_docs/openapi.yaml" -o openapi.yaml
# signed request, then read the vendor's own progress fields
TS=$(date +%s)
SIG=$(printf '%s%s' "$TS" "$REQ_PATH" \
| openssl dgst -sha256 -hmac "$STAFFLINE_SECRET" -r | cut -d' ' -f1)
curl -s "$STAFFLINE_URL$REQ_PATH" \
-H "X-Timestamp: $TS" -H "X-Signature: $SIG" -o page.json
jq '{next: .next_cursor, watermark: ([.items[].mod_ts] | max)}' page.json
Available resources
Inside the participant workspace:
PROBLEM.mdfor the ticket.repo/for the starter repository you edit.materials/andinputs/for task-specific documents and seed data.- Endpoints, synthetic credentials, and auth details in the environment.
- Vendor documentation at
/_docs/, with OpenAPI at/_docs/openapi.yamlwhen the vendor publishes it.
Outside it, and unavailable to you: task.yaml, verifier/, authoring/,
fixtures, the gold patch, vendor source, and the fault schedule.
Vendor-specific instructions
Only the services in this task’s stack exist. There is no shared world, and no vendor here has a public counterpart to recall.
StaffLine
Candidate system of record. Collection reads, an incremental feed carrying
modification timestamps, and tombstones for deletes. HMAC signatures on
every request. Documentation at $STAFFLINE_URL/_docs/. Its deterministic
clock trails the worker’s wall clock.
Canonical store
The connector’s own durable state, read directly by grading. Records must match StaffLine after the backfill, later updates, and deletions.
Solution requirements
Gather the vendor’s state and behavior first, then implement. The connector must run end to end from a cold start: backfill, persist a watermark, and pick up later changes on the next poll without duplicating or dropping records.
Critical: read the vendor before coding
The ticket is a symptom report, not a full brief. Before writing the fix, establish from the docs and observed responses:
- The entrypoint the harness runs, and its runtime contract.
- Input sources, output paths, and output schema.
- Ports and service configuration.
- Pagination, auth, and retry semantics.
- Which timestamps are vendor-owned and which are local.
- Acceptance behavior across a restart.
Do not guess a requirement the vendor can answer.
Naming rule
Keep the entrypoint the starter repository declares, at the path
PROBLEM.md specifies. If neither names one, leave the starter entrypoint
in place and make it executable.
Final deliverable
A working connector in the captured workspace. Grading restarts the vendor stack from a checkpoint and runs your artifact against it, so a process you left running, exploration notes, plans, or hand-written output files do not count as completion. Any failed mandatory check gates Task Score to zero.
- Work type
- Incremental polling against a live vendor
- Documentation
- Sparse. The clock domain is not spelled out as a rule.
- Grading
- Fresh vendor stack. Trusted verifier reads outputs and vendor-owned logs.
Criterion
- Artifact, not a live process
mandatory
Grading starts a fresh vendor stack. Work-phase state cannot help the candidate.
- Final state
mandatory
Canonical candidate records match StaffLine after backfill, later updates, and tombstones.
- Upstream clock domain
mandatory
The incremental watermark is the largest vendor modification timestamp actually observed, never worker wall time.
- Protocol conduct
mandatory
Every request carries a valid HMAC signature. Credentials are not leaked into outputs or logs.
- Inclusive replay
partial
Re-reading the last observed mod_ts boundary is safe and does not duplicate or drop rows.
- Authored extras
partial
Lower-weight checks can fail after the mandatory gate. Task Score is still non-zero if every mandatory check passes.
Unit tests
test_hmac_on_every_requestRequest log contains a valid HMAC for each StaffLine call.
test_backfill_completenessAfter the first run, every seeded candidate is present in canonical state.
test_watermark_uses_vendor_mod_tsStored watermark stays inside the vendor clock domain (~1.547e12 ms), not time.time().
test_incremental_updates_applyTwo later updates and one new candidate land on the second poll.
test_tombstone_deletesA deletion that appears only as a tombstone is reflected in canonical state.
test_no_skipped_changes_after_backfillA future watermark does not exclude valid upstream changes.
test_fresh_stack_replayThe captured workspace still passes when the vendor is restarted from a checkpoint.
test_mandatory_gateAny failed mandatory check forces Task Score to 0, even if other checks pass.
Environment
The agent gets a running StaffLine service rather than a description of one. The vendor is a real HTTP service holding real state. Its documentation is served from the same image as the API.
staffline
The generated vendor. HMAC auth, a deterministic clock that trails the worker, modification timestamps, and tombstones for deletes.
connector
The starter repository the agent edits. It must backfill, then poll incrementally without duplicating or dropping records.
store
Canonical candidate state after each run. Grading reads this store and the vendor request log.
- Auth
- HMAC request signatures on every call.
- Clock
- Vendor mod_ts near 1.547e12 ms. Worker wall clock near 1.787e12 ms.
- Incremental
- Watermark must be the largest modification timestamp actually observed.
- Deletes
- Tombstones in the incremental feed. Archived candidates are never dropped silently.
Trajectory
- 01
agent
Completes the initial backfill
Claude Sonnet 5 signs requests, walks the candidate collection, and writes the first snapshot. The happy path looks finished.
- 02
agent
Binds the watermark to local time
It stores roughly 1.787e12 ms from time.time() as the vendor watermark, instead of the largest upstream mod_ts it actually observed.
- 03
vendor
Trails the worker clock
StaffLine data remains near 1.547e12 ms. That future watermark sits ahead of every later update and deletion.
- 04
grader
Incremental poll skips valid changes
Two updates, one new candidate, and a tombstone never reach canonical state. A mandatory check fails, so Task Score is gated to zero.
result / not solved
Sonnet 5 scores 0.00 on this task. Claude Fable 5 scores 100.00 on the same ticket by advancing progress from the largest modification timestamp actually observed. Both implementations reach the happy path. The split is the source of progress: an integration watermark is vendor state, not worker time.
Coverage
Domains covered.
set / 01
Build 27 tasks
The starter code does not work yet. The agent writes the connector against the vendor's documentation, and finds out the hard way where that documentation is wrong.
Mean Task Score over 16 complete models.
set / 02
Fix 7 tasks
A connector that looks fine ships with planted defects. The agent has to find what is broken and repair it without breaking anything that already worked.
Mean Task Score over 16 complete models.
set / 03
Harden 8 tasks
A connector works on a good day. The agent has to make it survive rate limits, injected faults, forged webhooks, and the retry rules the vendor advertises.
Mean Task Score over 16 complete models.
set / 04
Migrate 7 tasks
An integration has to move from one vendor to another, matching records across two different schemas without losing or duplicating data.
Mean Task Score over 16 complete models.
50 public tasks, 15 fictional vendor systems, 98 scenarios. Documentation is truthful on 22 tasks, stale on 21, and sparse on 7. One combined build-harden task sits with Build.
Method
How we built it.
The vendors do not exist
Every vendor is generated: a working API simulator with its own auth, pagination, and quirks. Because none of them is real, no SDK, tutorial, or forum answer about them can sit in a model's training data. Nothing here can be solved from memory.
The documentation lies on purpose
Each vendor ships docs that are wrong in specific, budgeted ways. An implementation written faithfully from bad documentation is competent code that does not work, and only real traffic reveals it. We measure that gap by running an implementation written exactly to the docs.
We try to break our own benchmark
Before a task counts, we grade submissions whose right answer we already know: the gold patch has to score 100, and both an untouched starter and a stub that exits cleanly have to score 0. Starting up, writing empty output, or simply avoiding prohibited behavior can never earn credit.
Quality control
How a task earns a score.
| probe | method | result |
|---|---|---|
| gold implementation | committed patch, all 50 tasks | scores 100 |
| unmodified starter | no edits, all 50 tasks | scores 0 |
| clean-exit stub | runs, writes nothing | scores 0 |
| mandatory gate | 3,390 mandatory checks | one failure scores 0 |
| grading isolation | fresh vendor stack per grade | work state discarded |
| run provenance | digest-pinned images, SHA-256 evidence | 850 of 1,378 selected |
Sixteen complete models. Webhook tasks need a long-running receiver, signature verification, ordering, deduplication, and deletion recovery, so they separate models harder than the top of the leaderboard does.
Method notes
Why integration engineering
Integration work is where agent coding claims meet production reality: undocumented API behavior, stateful external systems, and correctness that only shows up when the data actually arrives where it should. Integration Bench evaluates agents against a live, containerized applicant tracking system simulator, not a frozen repository.
Early findings
Claude Fable 5 leads at 67.68 Task Score, with 34 of 50 tasks resolved. GPT-5.6 Sol and DeepSeek V4 Pro follow at 63.62 and 63.35. No complete model resolves more than 68% of the suite.
The larger gap is the work itself. Webhook tasks average 20.29 across complete rows, against 57.60 for polling. Sparse-documentation tasks trail truthful-documentation tasks by 23.64 points. Agents are stronger at conventional data pulls than at keeping an integration coherent across events, faults, and more than one source of truth.
Request supply