Migration from splan-api
Mapping the retired /api/v1 routes onto /v1/starplan
The previous public StarPlan service (splan.dev.hfu.digital/api/v1/*) has been folded into the unified backend at api.hfu.digital. Every old route has a one-to-one replacement under the /v1/starplan prefix.
If you're starting a new integration today, ignore this page — go straight to Getting started.
What changed
| Aspect | Before | After |
|---|---|---|
| Host | splan.dev.hfu.digital | api.hfu.digital |
| Path prefix | /api/v1/* | /v1/starplan/* |
| Auth header | X-API-Key: <key> | X-API-Key: <key> (unchanged) |
| Key prefix | spk_ | spk_ (unchanged; existing keys were migrated) |
| Response envelope | { data: … } | { data: … } (unchanged) |
| Webhook signature | sha256=<HMAC(secret, "<ts>.<body>")> | identical |
Existing API keys remain valid. You do not need to re-register.
Compatibility shim
Until the 6-month grace window ends, every request to splan.dev.hfu.digital/api/v1/* is 301-redirected to the new host and prefix. Most HTTP clients follow redirects automatically, so existing integrations keep working — but the redirect adds latency, so you should still cut over.
When the grace window ends, the splan.dev.hfu.digital host will stop responding. Plan your cutover before then.
Route mapping
Every catalog, search, statistics, week, iCal, and changes endpoint moved verbatim minus the /api prefix. Most are direct: /api/v1/programs → /v1/starplan/programs.
| Old | New |
|---|---|
GET /api/v1/programs | GET /v1/starplan/programs |
GET /api/v1/programs/:id | GET /v1/starplan/programs/:id |
GET /api/v1/programs/:id/semesters | GET /v1/starplan/programs/:id/semesters |
GET /api/v1/programs/:id/courses | GET /v1/starplan/programs/:id/courses |
GET /api/v1/semesters | GET /v1/starplan/semesters |
GET /api/v1/semesters/:id | GET /v1/starplan/semesters/:id |
GET /api/v1/semesters/:id/courses | GET /v1/starplan/semesters/:id/courses |
GET /api/v1/courses | GET /v1/starplan/courses |
GET /api/v1/courses/:id | GET /v1/starplan/courses/:id |
GET /api/v1/rooms | GET /v1/starplan/rooms |
GET /api/v1/rooms/:id | GET /v1/starplan/rooms/:id |
GET /api/v1/rooms/:id/schedule | GET /v1/starplan/rooms/:id/schedule |
GET /api/v1/instructors | GET /v1/starplan/instructors |
GET /api/v1/instructors/:id | GET /v1/starplan/instructors/:id |
GET /api/v1/instructors/:id/courses | GET /v1/starplan/instructors/:id/courses |
GET /api/v1/week/current | GET /v1/starplan/week/current |
GET /api/v1/week/:week | GET /v1/starplan/week/:week |
GET /api/v1/changes | GET /v1/starplan/changes |
GET /api/v1/changes/:id | GET /v1/starplan/changes/:id |
GET /api/v1/ical/:semesterId | GET /v1/starplan/ical/:semesterId |
GET /api/v1/ical/:semesterId/url | GET /v1/starplan/ical/:semesterId/url |
GET /api/v1/search | GET /v1/starplan/search |
GET /api/v1/statistics | GET /v1/starplan/statistics |
GET /api/v1/sync/status | GET /v1/starplan/sync/status |
Developer key and webhook routes:
| Old | New |
|---|---|
POST /api/v1/developers/register | POST /v1/starplan/developers/register |
GET /api/v1/developers/me | GET /v1/starplan/developers/me |
POST /api/v1/developers/regenerate-key | POST /v1/starplan/developers/regenerate-key |
POST /api/v1/developers/deactivate | POST /v1/starplan/developers/deactivate |
GET /api/v1/developers/usage | GET /v1/starplan/developers/usage |
GET /api/v1/webhooks | GET /v1/starplan/webhooks |
POST /api/v1/webhooks | POST /v1/starplan/webhooks |
GET /api/v1/webhooks/:id | GET /v1/starplan/webhooks/:id |
PATCH /api/v1/webhooks/:id | PATCH /v1/starplan/webhooks/:id |
DELETE /api/v1/webhooks/:id | DELETE /v1/starplan/webhooks/:id |
GET /api/v1/webhooks/:id/deliveries | GET /v1/starplan/webhooks/:id/deliveries |
POST /api/v1/webhooks/:id/test | POST /v1/starplan/webhooks/:id/test |
What's gone
A few legacy endpoints are intentionally not exposed by the new API:
/api/v1/export/*— bespoke export endpoints from the old service. There is no direct replacement; reach the same data by composing the catalog endpoints, or open an issue describing the export shape you need./healthonsplan.dev.hfu.digital— replaced by the platform-widehttps://api.hfu.digital/health.
Step-by-step
- Search-and-replace
splan.dev.hfu.digital/api/v1→api.hfu.digital/v1/starplanin your codebase. - Re-test against the new URLs (responses are byte-equivalent within the
dataenvelope; if your tests snapshot timestamps or order, expect those to update naturally). - Re-validate webhook signature handling against the new host. The signing scheme is identical, but if you locked the
Origin/Hostheader you'll need to update that. - Remove follow-redirect workarounds, if any, since you're now hitting the canonical host.
- Optionally remove your old
splan.dev.hfu.digitalallow-list entries once your traffic has fully cut over.
Rate-limit difference
The legacy splan-api documentation referenced two tiers (5/30/200 for anonymous, 10/60/1000 with a key). The new service applies a single tier of 10 / 60 / 1000 to every public read endpoint regardless of authentication — see Rate limits. For most consumers that is a raise, but if you previously relied on the 200/hour cap as a guard rail you may want to add your own quota at the edge.