API Documentation
Access Dzaleka Online Services data through our RESTful API endpoints. All endpoints support CORS and return JSON responses.
Quick Start
All API endpoints are publicly accessible and require no authentication.
curl https://services.dzaleka.com/api/services
Rate Limiting
All endpoints are rate-limited to prevent abuse:
- Limit: 60 requests per minute per IP address
- Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
- 429 Response: Includes Retry-After header (in seconds)
Caching
Search API includes intelligent caching:
- TTL: 5 minutes for search results
- Cache-Control: public, max-age=300
- X-Cache Header: HIT (cached) or MISS (fresh query)
- Max Size: 100 unique queries cached
API Endpoints
GET
Rate Limit: 60 requests per minute /api/search Server-side search across multiple collections with caching
Cache: 5 minutes TTL, 100 queries max
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query (min 2 characters) |
collections | string | No | Comma-separated list of collections (services,events,resources,news,photos,jobs,docs) |
limit | number | No | Max results per collection (default: 10) |
Example Request
https://services.dzaleka.com/api/search?q=education&collections=services,events&limit=5 Example Response
{
"status": "success",
"query": "refugee services",
"totalResults": 25,
"results": {
"services": [
{
"slug": "example",
"title": "Example Service",
"description": "...",
"category": "Education"
}
],
"events": []
},
"cached": false
} GET
Rate Limit: 60 requests per minute /api/services Retrieve all service organizations
Example Request
https://services.dzaleka.com/api/services Example Response
{
"status": "success",
"count": 100,
"data": {
"services": [
{
"id": "...",
"title": "Service Name",
"category": "Education",
"verified": true
}
]
}
} GET
Rate Limit: 60 requests per minute /api/events Retrieve all events
Example Request
https://services.dzaleka.com/api/events Example Response
{
"status": "success",
"count": 30,
"data": {
"events": [
{
"id": "...",
"title": "Event Name",
"date": "2025-01-15",
"location": "Dzaleka"
}
]
}
} GET
Rate Limit: 60 requests per minute /api/resources Retrieve all resources and documents
Example Request
https://services.dzaleka.com/api/resources Example Response
{
"status": "success",
"count": 300,
"data": {
"resources": [
{
"id": "...",
"title": "Resource Name",
"category": "Policy",
"fileType": "pdf"
}
]
}
} GET
Rate Limit: 60 requests per minute /api/news Retrieve all news articles
Example Request
https://services.dzaleka.com/api/news Example Response
{
"status": "success",
"count": 50,
"data": {
"news": [
{
"id": "...",
"title": "News Title",
"category": "announcement",
"date": "2025-01-10"
}
]
}
} GET
Rate Limit: 60 requests per minute /api/photos Retrieve photo gallery items
Example Request
https://services.dzaleka.com/api/photos Example Response
{
"status": "success",
"count": 35,
"data": {
"photos": [
{
"id": "...",
"title": "Photo Title",
"date": "2024-12-01",
"image": "url"
}
]
}
} GET
Rate Limit: 60 requests per minute /api/jobs Retrieve job listings
Example Request
https://services.dzaleka.com/api/jobs Example Response
{
"status": "success",
"count": 20,
"data": {
"jobs": [
{
"id": "...",
"title": "Job Title",
"type": "full-time",
"category": "education",
"status": "open"
}
]
}
} GET
Rate Limit: 60 requests per minute /api/docs Retrieve documentation pages
Example Request
https://services.dzaleka.com/api/docs Example Response
{
"status": "success",
"count": 20,
"data": {
"docs": [
{
"id": "...",
"title": "Getting Started",
"description": "..."
}
]
}
} Additional Information
Error Responses
400 Bad Request
{
"status": "error",
"message": "Search query must be at least 2 characters long"
} 429 Too Many Requests
{
"status": "error",
"message": "Rate limit exceeded. Please try again later.",
"retryAfter": 45
} 500 Internal Server Error
{
"status": "error",
"message": "Failed to fetch services",
"error": "Error details..."
} CORS Support
All API endpoints support Cross-Origin Resource Sharing (CORS) with the following headers:
Access-Control-Allow-Origin: *Access-Control-Allow-Methods: GET, POST, OPTIONSAccess-Control-Allow-Headers: Content-Type