Developers
API reference
Everything the dashboard does, it does over these endpoints. They're here so you can create tasks from your own tooling — a form, a cron job, an internal admin page.
Authentication
Requests are authenticated with the session cookie issued at login, or with an API key sent as a bearer token. Keys are issued per organization and scoped to it — a key can never read another organization's tasks.
curl https://onboardelisha.com/api/dashboard/overview \ -H "Authorization: Bearer $ELISHA_API_KEY"
Endpoints
| Method | Path | What it does |
|---|---|---|
| POST | /api/tasks | Create a task. Returns the task id immediately — the run happens asynchronously. |
| GET | /api/dashboard/tasks/{taskId} | Read one task: its gate decision, current status, run events, and pull request URL once opened. |
| GET | /api/dashboard/overview | Recent activity across the organization — tasks, outcomes, and integration health. |
| GET | /api/dashboard/scheduled-jobs | List recurring jobs. The per-job route supports updating the schedule or disabling it. |
| GET | /api/github/repos | The repositories the installation can reach, for a picker. |
Creating a task
title and repo are required. body is where the detail goes — write it the way you'd write a ticket for a person, because that is exactly what the gate reads it as.
POST /api/tasks
Content-Type: application/json
{
"title": "500 on checkout when the coupon field is empty",
"body": "Three customers hit this today. Reproduces with an
empty coupon input on the cart page.",
"repo": "acme/web",
"kind": "bug"
}
201 Created
{ "taskId": "tsk_8f21c0", "status": "queued" }Reading the outcome
Poll the task, or let Elisha report back on Slack or the Notion card — which is what most teams do. status moves through queued, running, and then one of shipped, needs_human, or failed.
GET /api/dashboard/tasks/tsk_8f21c0
200 OK
{
"taskId": "tsk_8f21c0",
"status": "shipped",
"gate": { "decision": "accept", "filesScoped": 3 },
"prUrl": "https://github.com/acme/web/pull/482",
"checks": { "tests": "passed", "reproVerified": true }
}Errors
Errors are JSON with an error string that says what to do about it, not just what went wrong. A 403 on a repository means the GitHub App's selection doesn't include it; a 409 means a run for that task is already in flight.
Rate limits
Read endpoints are limited generously. Task creation is limited per organization to keep a runaway loop in someone's script from filling your queue — if you need a bulk import, tell us rather than working around it.