Seventy-eight days until sunset.
The sprint planning board showed thirty-four tickets when Priya arrived, which was three more than it had shown on Monday and would probably be two more by end of week. Rohan was already at the head of the table in his usual standing position, one hand resting on the edge and the other gesturing at the projected Jira board with the ease of someone for whom this ritual had long since become automatic. The sprint goal on the whiteboard said Platform Stability & Technical Debt Reduction. Someone had drawn a small rocket ship next to it in blue marker. Nobody had erased it.
The sprint planning room had glass on two sides, which meant Priya could see the engineering floor while they talked — desks in their morning configuration, monitors brightening as the floor came alive. She had a notebook open in front of her and a pen in her hand. She always took notes in sprint planning even when she didn't need to. It helped her pay attention.
They worked through the backlog in the standard order. Infrastructure first. A certificate renewal on the Denver nodes, sixty days out but worth starting now. A monitoring upgrade that Priya had already half-finished. A dependency audit that nobody wanted. Then Rohan scrolled to a ticket near the bottom of the queue, distinguished by the faded orange of low priority and the tag LEGACY in its label field.
"INFRA-2847," Rohan said. "WeatherAPI v1.2.3 sunset prep. Deprecation notice goes out today. Somebody needs to own the shutdown process."
Silence did a brief circuit of the table. Dmitri from platform found something to examine on his keyboard. Sunita from SRE opened a browser tab with the focused expression of someone who had just remembered an urgent task.
"Priya." Rohan clicked to assign it. He said her name with the casual confidence of a decision already made. "Good experience on legacy procedures. Mostly documentation at this point — audit remaining traffic, flag any integrators still active, make sure the endpoint terminates cleanly on June first. Two weeks at most." He made the small motion with his hand that meant don't complicate it. "Just housekeeping."
"Sure," Priya said, and wrote in her notebook: INFRA-2847. WeatherAPI v1.2.3. Sunset: June 1, 2024. She underlined the date because she always underlined deadlines. The meeting moved on to the v3.0 latency improvements, and she stopped thinking about it until she got back to her desk, where the deprecation notice was already at the top of her browser history.
She pulled it onto her second monitor while the Jira ticket sat open on her first.
WeatherAPI v1.2.3 — Deprecation Notice
Effective March 15, 2024, WeatherAPI v1.2.3 is officially deprecated. All v1.x endpoints will reach end-of-life on June 1, 2024, at which point requests will return HTTP 410 Gone. Developers currently using v1.x are strongly encouraged to migrate to WeatherAPI v3.0, which offers improved accuracy, lower latency, and enhanced reliability. Migration documentation is available at docs.cloudweather.io/migrate/v3. Questions may be directed to the developer forum.
She read it twice. It had the cadence of a scheduled thing — clean and professional. The company had been signaling this migration for two years and announcing it formally for three months across every developer channel they maintained. Any active integrator paying attention would have already moved. What remained was administrative closure: verify the stragglers, send the notices, clean up the logs.
The API documentation filled her second screen. The endpoint list ran to four pages: current conditions, forecast data, historical queries, severe weather alerts, a geolocation helper added in 2017. Standard REST calls, JSON responses over HTTPS, authentication via API key. She scrolled through the version history at the bottom. A minor patch in January 2022. A security update the previous September. Before that, nothing significant going back to the v1.2 release in 2018. Six years in service, the last two without any development activity. The documentation read like something carefully maintained and then, at some point, quietly locked — nothing wrong with it, nothing missing, just still. WeatherAPI v1.2.3. Released November 2018. It was a version number, not a name.
The monitoring dashboard lived in a separate tab: request volume trending downward across three years, response latency flat at 47 milliseconds, error rate low. The volume graph told the migration story without commentary — peak traffic at 340,000 daily requests in early 2020, down to 2,847 now. A long decline. Nothing dramatic. In the upper corner of the dashboard, a green indicator glowed: 200 OK. The API was running. Health check passing. She typed into the ticket: Deprecation notice reviewed. Documentation reviewed. Beginning traffic audit. It took thirty seconds.
By twelve-fifteen, Claire had already claimed the good table, the one by the windows where the west-facing glass let in thin March light that fell across Claire's laptop screen. Priya sat down with her thermos and a sandwich from the kitchen refrigerator.
"You got the graveyard shift," Claire said.
Priya unscrewed the thermos lid. Her mother had made the chai Sunday morning and pressed the thermos into Priya's hands at the door, still on a call with her aunt, the warmth of it carrying across the week in a way that always made Priya a little guilty for not calling home more often. She drank before answering. "INFRA-2847. Basically already done."
"Audit, notify, terminate." Claire clicked something on her laptop without looking at it. "A week, tops."
"Rohan said two."
"Rohan was being generous." Claire spun her coffee cup on the table, a small circular habit. "I'm on the data pipeline refactor. Requirements changed again Thursday. Third time in a month."
They talked about that for a while — the requirements document that had grown to forty-two pages, the product manager who kept adding edge cases to the acceptance criteria, whether Rohan actually knew about the scope creep or was choosing not to see it. Then they talked about a bug that had been in the monitoring alerts for two weeks without resolution and whether the new coffee machine in the kitchen was actually better or if they had all simply decided it was. The WeatherAPI ticket receded to where routine tasks lived, somewhere behind the conversation.
"At least your thing has a clear definition of done," Claire said eventually.
"June first. Endpoint returns 410. Done."
"That sounds genuinely refreshing right now."
The window light shifted, and they went back to their desks. Setting up the traffic audit took longer than running it. Priya pulled the API key registry first — the database of registered credentials issued since the API's 2016 launch. Three hundred and twelve entries, spanning from the early days through early 2022, when new key registrations had been redirected to v3.0. She exported the list: key ID, registration date, owner email, organization name. The organization column was scattered — personal project, blank, residential automation, a cluster of startup names she recognized as defunct. She set the export aside and opened a query window against the production request logs.
She thought for a moment about what she was looking for, then wrote the query:
```sql SELECT client_id, COUNT(*) as request_count, MAX(request_timestamp) as last_seen FROM api_requests_v1 WHERE request_timestamp >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY client_id ORDER BY last_seen DESC; ```
She clicked Execute and reached for her thermos while the database processed. The result indicator spun for five seconds, six, seven — the table was large and the query was unindexed on the filtered columns, which she noted as a minor thing worth fixing before the service terminated. The results populated and she looked at the row count in the status bar at the bottom of the panel.
247 distinct clients.
She had expected twenty at the outside — the standard deprecation tail, small integrators who had missed the migration notices, personal projects with stale dependencies that nobody had touched in months. The kind of traffic that resolved itself once she sent the automated notification emails. Two weeks of work, the way Rohan had described. Two hundred and forty-seven was a different problem. She sorted by last_seen and worked down the list. The timestamps showed activity from hours ago, from minutes ago — not the declining curve of users gradually moving off the platform but consistent ongoing traffic, week over week across the thirty-day window. The request counts were steady, not tapering. She sorted by client_id and pulled up the timestamp detail for the top entries.
One client had made requests at 09:00:01, 10:00:01, 11:00:01, 12:00:01. The seconds were consistent within a margin of two or three, which was the drift of a scheduled cron job, not a person refreshing a dashboard. Not approximately hourly. Hourly exactly.
Another client: 07:23:14, 07:38:14, 07:53:14, 08:08:14. Fifteen minutes between each request, the interval precise enough that she could set a clock by it. She extended the time range and checked the previous week. The same rhythm, without a gap.
A third entry carried only one request for the day — at 06:02:17. One the day before. One the day before that. A single daily call at the same hour every morning, as regular as an alarm.
She sat with this for a moment. These weren't developers who had missed an email. The request patterns were too exact for human traffic, too consistent for active development work. These were automated systems — processes configured on schedules by someone who was no longer watching them run. She pulled up the ticket and typed a note: Active caller count higher than anticipated (247 unique clients in the 30-day window). Traffic pattern analysis indicates the majority are automated or scheduled integrations, not active developer accounts. Recommend categorizing caller types before proceeding with notification workflow. She read it back. It was more words than the task probably required. She left it and submitted the update.
At five-thirty she closed her laptop, updated the ticket status to In Progress, and put on her coat. The floor was emptying around her — monitors darkening in sequence, standing desks lowering to their default heights as their owners logged off. Through the glass walls, she could see the open area clearing, the weekend taking hold of the space. In the elevator, the engineering floor rose and shrank through the glass panels as she descended. Monday she would pull the registration records for each of the 247 client IDs — map the API keys back to their original accounts, trace the IP addresses, see what she was actually dealing with. It would take a day. Two at the most. The query results would look the same when she came back, the API still answering.
Seventy-eight days.