REST API
JSON over HTTPS. Bearer-token authenticated. Tenant-scoped per API key.
Authentication
Every request must include an Authorization header with a Bearer token issued in your organization's settings.
Authorization: Bearer rk_<your-key>
Keys are issued by your organization's admin in Settings → API keys. Each key has explicit scopes (e.g. TASKS_READ) and an optional expiry. The plain key is shown once on creation; store it securely.
If a request fails with 401 the key is invalid, revoked, or expired. 403 insufficient_scope means the key lacks the required scope for that endpoint.
Base URL & versioning
https://vesper.rallyve.com/api/v1
All endpoints are versioned. Breaking changes will introduce a new version (v2) without removing the old one.
Pagination
List endpoints support ?limit= (max 200, default 50) and ?cursor=<last_id>. The response includes nextCursor when more results exist.
Endpoints
/mescope: anyReturns key + organization metadata. Useful for sanity-checking a key.
/tasksscope: TASKS_READList tasks. Filters: status, tier, workspace (slug), since (ISO 8601 — only tasks updated after).
/tasksscope: TASKS_WRITECreate a task. Body: { name, type?, tier?, status?, workspace, ownerEmail?, startDate?, endDate?, description? }.
/tasks/:idscope: TASKS_READRead a single task.
/tasks/:idscope: TASKS_WRITEUpdate name, status, tier, dates, or description.
/eventsscope: EVENTS_READList event-type tasks. Filters: scheduled=true|false, workspace.
/usersscope: USERS_READList members of your organization.
/comments?taskId=…scope: COMMENTS_READList comments on a task.
/commentsscope: COMMENTS_WRITEAdd a comment. Body: { taskId, body }.
Examples (curl)
# Sanity check
curl https://vesper.rallyve.com/api/v1/me \
-H "Authorization: Bearer rk_…"
# List open T1 tasks
curl "https://vesper.rallyve.com/api/v1/tasks?status=PENDING&tier=T1" \
-H "Authorization: Bearer rk_…"
# Create a task
curl -X POST https://vesper.rallyve.com/api/v1/tasks \
-H "Authorization: Bearer rk_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Investigate latency spike",
"tier": "T1",
"workspace": "noc",
"ownerEmail": "alice@acme.com"
}'
# Mark a task done
curl -X PATCH https://vesper.rallyve.com/api/v1/tasks/clxyz123… \
-H "Authorization: Bearer rk_…" \
-H "Content-Type: application/json" \
-d '{"status":"DONE"}'Errors
All errors return JSON with a stable error code and an optional human message.
{
"error": "insufficient_scope",
"required": ["TASKS_WRITE"],
"missing": ["TASKS_WRITE"]
}missing_authorization— no Bearer header (401)invalid_key/invalid_key_format— key not recognized (401)key_revoked/key_expired— admin revoked or expiry passed (401)insufficient_scope— key lacks required scope (403)organization_suspended— org account suspended (403)not_found— resource doesn't exist or isn't in your org (404)validation— body failed schema validation (422)
Rate limits
For now, the API is generously rate-limited per key (~10 req/sec). We recommend exponential backoff on 429 responses. Stricter limits may be introduced for free-tier orgs in the future.