Workspace-scoped API keys, a clean REST surface, and signed webhooks — connect your sites, forms, and systems to your Workel workspace.
In Workel, open Settings → Developers → Create key (workspace owners and admins only). Pick the scopes the integration needs, then copy the wk_… secret — it is shown exactly once.
curl https://api.workel.com/api/public/v1/me \
-H "Authorization: Bearer wk_YOUR_KEY"
GET /me returns your workspace, the key's scopes, and its rate-limit state — the "is my key working" endpoint.
curl -X POST https://api.workel.com/api/public/v1/tasks \
-H "Authorization: Bearer wk_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-4821" \
-d '{"project_id": "PROJECT_ID", "title_text": "New order #4821"}'
Find PROJECT_ID via GET /projects. The task appears on the team's board in realtime, attributed to the key's creator with a via API label.
Every request carries Authorization: Bearer wk_<secret>. Keys are minted by a workspace owner or admin and act as their creator: writes are recorded and notified as that person (labeled via API). If the creator loses owner/admin membership, the key stops working within ~60 seconds. Keys can be rotated with an overlap window and revoked instantly from the Developers tab — a key can never mint, widen, or manage keys or webhooks itself.
Each key holds only the scopes you grant it:
| Scope | Grants |
|---|---|
| read:projects | List/read projects and their board columns |
| read:tasks | List/read tasks and their comments |
| read:events | List calendar events |
| read:members | List active workspace members (incl. email, for identity mapping) |
| write:tasks | Create and update tasks |
| write:events | Create calendar events |
| write:comments | Comment on tasks |
wk_ key in browser or mobile code. If a key leaks: Developers tab → Revoke (instant), or Rotate with zero grace. Each key's last-used time and IP are shown to help triage.Full request/response schemas, parameters, and examples for every operation live in the API reference (rendered from the OpenAPI 3.1 spec, which is verified against the live route table by an automated parity test).
| Path | Scope | Description | |
|---|---|---|---|
| GET | /me | — | Key + workspace + rate-limit state |
| GET | /projects | read:projects | List visible projects with task counts |
| GET | /projects/{id} | read:projects | One project |
| GET | /projects/{id}/cards | read:projects | Board columns — target one on task create |
| GET | /members | read:members | Active members: id, name, role, email |
| GET | /tasks | read:tasks | Tasks across visible projects; filters: project_id, card_id, completed, due_before/after, updated_since |
| POST | /tasks | write:tasks | Create a task (column optional — defaults to the first open one) |
| GET | /tasks/{id} | read:tasks | One task, incl. description and assignees |
| PATCH | /tasks/{id} | write:tasks | Update title, description, priority, due date/time, progress |
| GET | /tasks/{id}/comments | read:tasks | A task's comments |
| POST | /tasks/{id}/comments | write:comments | Comment on a task |
| GET | /events | read:events | Workspace + project calendar events in a date window |
| POST | /events | write:events | Create a calendar event, with optional invitees |
Always {"error": {type, code, message, param?, request_id}}. Every response carries an X-Request-Id header — quote it in support requests.
Cursor-based: {"data": […], "meta": {"next_cursor"}}. No offset pages — polling under concurrent writes stays consistent.
Every POST honors Idempotency-Key. Same key + same body replays the stored response (Idempotent-Replay: true); same key + different body → 409. Failed attempts are never stored, so retries re-run the work.
Per key and per workspace, never by IP. 429 responses name the exceeded limiter and include retry_after.
A key sees exactly one workspace. Resources outside it — or in private/personal spaces — return 404, never 403.
Writes appear in Workel as the key's creator, labeled via API, so teammates always know a machine acted.
Register HTTPS endpoints from Settings → Developers → Webhooks and Workel calls you when things change — including changes your team makes in the Workel UI, so you never poll. Seven event types:
task.created task.updated task.completed task.deleted comment.created event.created project.created
Deliveries retry with backoff for hours on failure; an endpoint that keeps failing is auto-disabled (re-enable it from the tab, where a full delivery log and a "Send test event" button live). Payloads are deliberately thin — identifiers and safe fields, never free text; fetch detail with your key.
Each request is signed over its exact raw body:
Workel-Signature: t=1755950000,v1=5257a86… ← HMAC-SHA256(secret, "{t}.{rawBody}")
Workel-Event-Id: evt_8f3ka92x ← stable, dedupe on it
Workel-Event-Type: task.completed
// Node — express example (use the RAW body, not parsed JSON)
const crypto = require("crypto");
function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
if (Math.abs(Date.now()/1000 - Number(parts.t)) > 300) return false; // 5-min replay window
const expected = crypto.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
// PHP
function verify(string $rawBody, string $header, string $secret): bool {
parse_str(str_replace(',', '&', $header), $parts);
if (abs(time() - (int) $parts['t']) > 300) return false;
$expected = hash_hmac('sha256', $parts['t'].'.'.$rawBody, $secret);
return hash_equals($expected, $parts['v1']);
}
During a signing-secret rotation, deliveries carry v1= entries for both the current and previous secret, so verification never breaks mid-rotation.
Every operation with parameters, request bodies, response schemas, and error shapes.
Machine-readable. Generate clients or diff releases.
All 13 requests, grouped and pre-authed with {{apiKey}}; POSTs carry auto-generated idempotency keys.
Base URL + key + id variables. Import both, paste your wk_… key, run Confirm a key is working.