Getting Started
This guide covers the conventions and patterns you'll encounter when working with the Keep'em API. For authentication setup, see Authentication.
Want to jump straight in? Make sure you have an API key, then try creating an event.
Base URL
All API requests are made to:
https://api.keepem.io/v1Request format
| Convention | Detail |
|---|---|
| Content type | application/json for all request bodies |
| Query parameters | Standard URL encoding |
| Dates | ISO 8601 (2026-03-05T10:00:00Z) |
| IDs | UUIDs |
| HTTP methods | GET (read), POST (create), PUT (full update), PATCH (partial update), DELETE (remove) |
Errors
The API returns errors in RFC 7807 Problem Details format with Content-Type: application/problem+json.
{
"type": "https://keepem.io/docs/api-reference/errors#validation-error",
"title": "Bad Request",
"status": 400,
"detail": "Property 'name' is required but is missing.",
"instance": "/v1/events",
"errors": [
{
"field": "name",
"message": "required field"
}
]
}Error fields
| Field | Description |
|---|---|
type | URI identifying the error type |
title | Short, human-readable summary (stable across occurrences) |
status | HTTP status code |
detail | Human-readable explanation specific to this occurrence |
instance | URI identifying this specific occurrence |
errors | Optional array of field-level validation errors |
HTTP status codes
| Code | Meaning |
|---|---|
200 | Success |
201 | Created |
204 | No content (successful delete) |
400 | Bad request — invalid parameters or body |
401 | Unauthorized — missing or invalid credentials |
403 | Forbidden — valid credentials but insufficient permissions |
404 | Not found |
409 | Conflict — resource already exists |
422 | Unprocessable entity — validation failed |
429 | Too many requests — rate limit exceeded |
500 | Internal server error |
Rate limits
API requests are rate limited to ensure fair usage. When you exceed the limit, you'll receive a 429 response.
Rate limit headers
Every response includes rate limit information:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait before retrying (only on 429 responses) |
Handling rate limits
When you receive a 429 response:
- Read the
Retry-Afterheader for the wait duration - Wait the specified number of seconds
- Retry the request
For production integrations, implement exponential backoff with jitter to avoid thundering herd issues when multiple clients retry simultaneously.
Pagination
List endpoints return paginated results. Use query parameters to control pagination:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1-indexed) |
limit | integer | 20 | Items per page (max 100) |
curl "https://api.keepem.io/v1/events?page=2&limit=10" \
-H "X-API-Key: sk_live_your_secret_key"Responses include pagination metadata:
{
"data": [...],
"pagination": {
"page": 2,
"limit": 10,
"total": 142,
"totalPages": 15
}
}Idempotency
For POST requests that create resources, you can pass an Idempotency-Key header to safely retry requests without creating duplicates.
curl -X POST https://api.keepem.io/v1/events \
-H "X-API-Key: sk_live_your_secret_key" \
-H "Idempotency-Key: unique-request-id-123" \
-H "Content-Type: application/json" \
-d '{"name": "My Event"}'- Keys are valid for 24 hours
- Repeating a request with the same key returns the original response
- Use UUIDs or another unique identifier as the key value
Versioning
The API is versioned via the URL path (/v1). Non-breaking changes (new optional fields, new endpoints) may be added without a version bump. Breaking changes will be introduced in new versions.