Public REST API
Versioned JSON endpoints for published opportunities and categories. No API key required.
Embeddable widget
An isolated iframe widget with type, discipline, location, theme and size options.
Partner integrations
Universities, employers and associations can display FETU opportunities and submit their own.
Overview
Base URL https://www.fetu-uganda.org/api/v1. All endpoints are public, read-only GET requests returning JSON. Only opportunities approved by FETU staff are ever returned; pending, rejected and archived records and all submitter details are never exposed.
GET
/api/v1/healthService status and database connectivity check. Not cached.GET
/api/v1/categoriesOpportunity types and engineering disciplines with active published counts.GET
/api/v1/opportunitiesPaginated list of published, non-expired opportunities with search and filters.GET
/api/v1/opportunities/:idA single published opportunity by UUID or slug. Includes deadline_status.Query parameters — GET /opportunities
| Parameter | Values | Description |
|---|---|---|
| q | string ≤100 | Keyword search across title, organization, summary and location. |
| type | job | internship | graduate_trainee | scholarship | fellowship | apprenticeship | competition | professional_development | other | Opportunity type. |
| discipline | civil | mechanical | electrical | electronics_telecom | chemical | software_it | agricultural | biomedical | environmental | mining_petroleum | building_construction | multidisciplinary | Engineering discipline. |
| location | string ≤80 | Partial match on location, e.g. Kampala. |
| page | integer 1–1000, default 1 | Page number. |
| limit | integer 1–50, default 12 | Results per page. |
| sort | recent | deadline, default recent | recent = newest published first; deadline = soonest deadline first. |
| include_expired | true | false, default false | Include published opportunities whose deadline has passed. |
Unknown parameters are ignored; a status parameter is ignored — only published records are served. Invalid values return 400.
200 response
Error response
- 400 invalid_parameter · 404 not_found · 429 rate_limited · 503 service_unavailable
- Deadlines are UTC ISO-8601 timestamps. Detail responses add
deadline_status: open, closing_soon (≤7 days), expired, no_deadline. - Caching: list, detail and categories send
Cache-Control: public, max-age=60, s-maxage=300; health isno-store. - CORS:
Access-Control-Allow-Origin: *for GET and OPTIONS. CORS is not authentication. - Rate limits: about 120 requests per minute per IP, reported via
X-RateLimit-*headers. Enforcement is best-effort per server instance, so exact limits may vary.