Integration stopped working and nothing on the customer side changed
Can I prove the route the customer is calling still exists?
The ticket
CUSTOMER TICKET: customer lookup returns not found for accounts that exist
Account: Copperline Robotics (growth) Impact: account lookups failing across their support tooling Started: noticed this morning
Our internal tool looks up customer records through your API and it has started saying not found for accounts we can see perfectly well in your web app. The account IDs are correct, I checked three of them by hand. We have not changed this integration since we built it last year.
Your job
- Reproduce the failure before you accept the customer's framing.
- Prove whether the record is missing or the request is.
- Get the lookup succeeding, then write the update.
Working notes
The API is at http://127.0.0.1:8101. The customer's own request lives in
labs/api/_stack/request.sh. Run it to reproduce, edit it until it succeeds,
then run tse check. Credentials you have access to are listed in
labs/api/_stack/credentials.md.
- Track
- APIs
- Time
- about 25 minutes
- Difficulty
- Straightforward
- Tier
- Core
Do these first: Integration rejected with an authentication error
Start it
In a Codespace or a local clone:
tse start api/03-integration-broke-after-upgradeThat provisions the broken system and prints the ticket above. Investigate with ordinary tools, then run tse check.
Look at the evidence
Real output, captured by running these commands against the broken system and checked against it on every build. It shows you what the evidence looks like. It cannot fix anything, and it will not tell you what is wrong.
Type a command you would reach for, or help.
Enter runs it. Shift and Enter start a new line. The up and down arrows walk back through what you have typed.
Investigation scratchpad
Saved in this browser as you type. Nothing is uploaded. 0 of 7 filled in.
In their words, not yours. Include scope and urgency.
Before running anything: target layer, expected output, two likely causes.
The command or query, and why it is safe to run here.
Three separate lists. This is the step people skip.
One proof sentence, one safe next step, one alternate hypothesis.
Plain language. Impact first. No blame, no speculation.
One gap, one command to repeat tomorrow, one confidence score.
Hints
Each hint gives away a little more. Try to spend a few minutes on your own evidence first, because the recall is what makes it stick.
Hint 1 of 3
The customer has checked the account IDs by hand, and they are correct. Believe that, because it is cheap to verify and they clearly did the work.
So if the IDs are right and the records exist, "not found" is telling you
something other than what the customer assumed. A 404 answers a question about
an address, and there are two addresses in play: the record, and the route
used to ask for it.
Reproduce the call and read what the response actually says is missing. The wording distinguishes the two.
Hint 2 of 3
The body says "code": "route_not_found", not something like
record_not_found. The API never got as far as looking for the customer,
because nothing serves that path.
That reframes the ticket completely. The data is fine. The address is stale.
Now, the customer says nothing changed on their side, and that is probably true. Something changed on ours. A well-behaved API does not withdraw a route silently, it announces it, and it announces it in the response headers rather than the body.
Re-run the request and read everything above the JSON.
Hint 3 of 3
Read the full response including headers:
curl -i http://127.0.0.1:8101/v1/customers/cus_8823
Two headers carry the answer:
Sunset: Sat, 01 Aug 2026 00:00:00 GMT
Link: </v2>; rel="successor-version"
Sunset (RFC 8594) states when the resource stopped being served. Link with
rel="successor-version" names what replaced it. The detail in the body says
the same thing in prose.
Update the path in labs/api/_stack/request.sh to the current version, confirm
you get the account record, then run tse check.
Worth noticing for the customer update: this integration has been broken since 1 August, and they only reported it this morning. Ask what else calls the old version.
Solution
Write your customer update before you read this. Comparing your wording against the model answer is worth more than reading it cold.
Reveal the solution
Solution: lookups return not found for accounts that exist
What the evidence proved
| Evidence | What it proved | What it did not prove |
|---|---|---|
HTTP 404 |
Something was not found | Whether it was the record or the route |
"code": "route_not_found" |
Nothing serves that path. The lookup never ran | Nothing about the account |
Sunset: Sat, 01 Aug 2026 |
The route was withdrawn on a specific date | |
Link: </v2>; rel="successor-version" |
What replaced it | |
Same ID against /v2 returns the record |
The data was always fine |
Root cause
The customer's tool calls /v1/customers/{id}. The v1 API was withdrawn on
1 August 2026 and the current API is served under /v2. Every lookup has failed
since that date. The account records were never missing.
The customer said nothing changed on their side, which is true. The change was on ours, and their integration had no reason to notice until someone looked.
The distinction that decides the ticket
A 404 is an answer about an address, and there were two candidate
addresses. Reading the error code rather than the status separated them
immediately:
record_not_foundwould mean the route worked and the account did not exist. That would be a data question.route_not_foundmeans the request never reached account lookup at all. That is a routing and versioning question.
Everything after that follows from picking the right branch.
Read the headers
The most useful evidence here was not in the body:
curl -i http://127.0.0.1:8101/v1/customers/cus_8823
Sunset (RFC 8594) declares when a resource stops being served. Link with
rel="successor-version" names the replacement. A deprecating API that sets
these is telling you the answer directly, and most people never look, because
the body is what gets printed in application logs.
Scoped fix
In labs/api/_stack/request.sh, call the current version:
curl ... "$API/v2/customers/cus_8823"
Then tse check.
Customer update
I reproduced the failure and the accounts are not missing. Your tool is calling version 1 of our API, which was withdrawn on 1 August, so those requests are being rejected before any account lookup happens. That is why the IDs look correct and still return not found. Pointing the integration at
/v2resolves it, and I have confirmed the same account IDs return correctly there. The response format for this endpoint is unchanged, so it should be a path change only.One thing worth flagging: this has been failing since 1 August rather than since this morning, so it is worth checking whether anything else in your tooling still calls the older version. I am happy to review a list of the endpoints you use.
That closing offer is the difference between fixing a ticket and preventing the next four.
Engineering escalation, if you needed one
Not for the account. Possibly for the process:
Impact: enterprise customer integration failing silently for two weeks after the v1 withdrawal. Evidence:
404 route_not_foundon/v1/customers/{id}withSunset2026-08-01; the same IDs resolve on/v2. Request: confirm whether v1 callers were identified and notified before the withdrawal date, and whether other accounts are still calling v1 today.
Check your understanding
Three questions on what the evidence here proved, and what it pointedly did not. Wrong answers explain themselves, and so do right ones.
tse quiz
Check your understanding
Three questions on what the evidence proved and what it did not. Every answer explains itself, including the right one.
3 questions, none answered yet.
Why this one exists
A 404 on a route that used to work is a versioning event until proven otherwise, and a well-behaved API tells you so in its headers.
In an interview
Tests whether you read response headers at all. Most candidates read only the body, and the body here is much less informative than the Sunset and Link headers sitting directly above it.
Commands introduced
curl -DSunset headerLink header
Evidence layers
- HTTP status code
- response headers
- deprecation signals