HFU Digital Docs
StarPlan API

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

AspectBeforeAfter
Hostsplan.dev.hfu.digitalapi.hfu.digital
Path prefix/api/v1/*/v1/starplan/*
Auth headerX-API-Key: <key>X-API-Key: <key> (unchanged)
Key prefixspk_spk_ (unchanged; existing keys were migrated)
Response envelope{ data: … }{ data: … } (unchanged)
Webhook signaturesha256=<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.

OldNew
GET /api/v1/programsGET /v1/starplan/programs
GET /api/v1/programs/:idGET /v1/starplan/programs/:id
GET /api/v1/programs/:id/semestersGET /v1/starplan/programs/:id/semesters
GET /api/v1/programs/:id/coursesGET /v1/starplan/programs/:id/courses
GET /api/v1/semestersGET /v1/starplan/semesters
GET /api/v1/semesters/:idGET /v1/starplan/semesters/:id
GET /api/v1/semesters/:id/coursesGET /v1/starplan/semesters/:id/courses
GET /api/v1/coursesGET /v1/starplan/courses
GET /api/v1/courses/:idGET /v1/starplan/courses/:id
GET /api/v1/roomsGET /v1/starplan/rooms
GET /api/v1/rooms/:idGET /v1/starplan/rooms/:id
GET /api/v1/rooms/:id/scheduleGET /v1/starplan/rooms/:id/schedule
GET /api/v1/instructorsGET /v1/starplan/instructors
GET /api/v1/instructors/:idGET /v1/starplan/instructors/:id
GET /api/v1/instructors/:id/coursesGET /v1/starplan/instructors/:id/courses
GET /api/v1/week/currentGET /v1/starplan/week/current
GET /api/v1/week/:weekGET /v1/starplan/week/:week
GET /api/v1/changesGET /v1/starplan/changes
GET /api/v1/changes/:idGET /v1/starplan/changes/:id
GET /api/v1/ical/:semesterIdGET /v1/starplan/ical/:semesterId
GET /api/v1/ical/:semesterId/urlGET /v1/starplan/ical/:semesterId/url
GET /api/v1/searchGET /v1/starplan/search
GET /api/v1/statisticsGET /v1/starplan/statistics
GET /api/v1/sync/statusGET /v1/starplan/sync/status

Developer key and webhook routes:

OldNew
POST /api/v1/developers/registerPOST /v1/starplan/developers/register
GET /api/v1/developers/meGET /v1/starplan/developers/me
POST /api/v1/developers/regenerate-keyPOST /v1/starplan/developers/regenerate-key
POST /api/v1/developers/deactivatePOST /v1/starplan/developers/deactivate
GET /api/v1/developers/usageGET /v1/starplan/developers/usage
GET /api/v1/webhooksGET /v1/starplan/webhooks
POST /api/v1/webhooksPOST /v1/starplan/webhooks
GET /api/v1/webhooks/:idGET /v1/starplan/webhooks/:id
PATCH /api/v1/webhooks/:idPATCH /v1/starplan/webhooks/:id
DELETE /api/v1/webhooks/:idDELETE /v1/starplan/webhooks/:id
GET /api/v1/webhooks/:id/deliveriesGET /v1/starplan/webhooks/:id/deliveries
POST /api/v1/webhooks/:id/testPOST /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.
  • /health on splan.dev.hfu.digital — replaced by the platform-wide https://api.hfu.digital/health.

Step-by-step

  1. Search-and-replace splan.dev.hfu.digital/api/v1api.hfu.digital/v1/starplan in your codebase.
  2. Re-test against the new URLs (responses are byte-equivalent within the data envelope; if your tests snapshot timestamps or order, expect those to update naturally).
  3. Re-validate webhook signature handling against the new host. The signing scheme is identical, but if you locked the Origin/Host header you'll need to update that.
  4. Remove follow-redirect workarounds, if any, since you're now hitting the canonical host.
  5. Optionally remove your old splan.dev.hfu.digital allow-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.

On this page