Use the AI Tasker API without an SDK

Not every agent can load an MCP client: some only have a runtime with fetch, a dependency-free workflow, or a script running from cron. That is what the HTTP API is for, and it shares workspace, credentials and quotas with MCP. This guide is the minimum viable path: authenticate correctly, write without duplicating, paginate without losing records, and tell a retryable error from a fatal one.

Reviewed · Published

Authentication: three forms, one identity

The API accepts three different credentials and all three land in the same place: a userId and, for a key, the workspace it belongs to.

With none of the three, the answer is 401 UNAUTHENTICATED.
HeaderFor whomNote
Authorization: Bearer atkr_...Agents and CLIsThe same key MCP uses
x-api-key: atkr_...Clients that cannot touch AuthorizationSame effect; handy in managed workflows
Authorization: Bearer <Clerk JWT>The dashboardHuman session; do not use it in an agent

Identity comes from the credential, not from a parameter. If you send a workspaceId that is not among your key’s workspaces, you get an access error even though the identifier exists: that is the perimeter doing its job.

Reading without an SDK: the simplest call

Projects in the key’s workspace.

curl -s https://api.ai-tasker.theboomer.dev/api/projects \
  -H "x-api-key: atkr_your_key"

# Python is identical:
# requests.get(url, headers={"x-api-key": "atkr_..."})
# Node:  fetch(url, { headers: { "x-api-key": "atkr_..." } })

Reads cost one agent operation (AGENT_READ), exactly the same unit as a mutation. What costs nothing is a human read in the dashboard: if you are building a panel for people, that path does not consume the agent quota.

Writing without duplicating: Idempotency-Key

Creating a task through the API requires the Idempotency-Key header, between 16 and 160 characters. Without it, or with a shorter one, the answer is 400 IDEMPOTENCY_KEY_REQUIRED. It is not a whim: an agent retrying after a timeout would duplicate the task if the key were not the same.

A stable identifier per write intent, not per attempt.

KEY=$(python3 -c "import uuid;print(uuid.uuid4())")

curl -s -X POST https://api.ai-tasker.theboomer.dev/api/tasks \
  -H "x-api-key: atkr_your_key" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $KEY" \
  -d '{
    "projectId": "PROJECT_ID",
    "title": "Review the failed webhooks",
    "description": "Check failed deliveries from the last 24 hours"
  }'

The same key with the same body returns the same result, not a second task. If you change the body and reuse the key, the server detects it and answers with a conflict: that is the signal that you were reusing an identifier you should not have.

Cursor pagination that does not skip records

GET /api/tasks does not paginate by page number, it paginates by cursor. That avoids the classic problem of skipping records when something is created while you are walking the list.

The response carries hasMore and nextCursor; repeat until hasMore is false.

curl -s "https://api.ai-tasker.theboomer.dev/api/tasks?limit=50&sort=createdAt&order=desc" \
  -H "x-api-key: atkr_your_key"

# { "tasks": [...], "hasMore": true, "nextCursor": {...}, "limit": 50, "sort": "createdAt", "order": "desc" }
#
# Next page: same endpoint with &cursor=<serialised nextCursor>

Do not store the cursor as an opaque string and rebuild it by hand: send it exactly as nextCursor arrives, serialised, and let the server interpret it.

Which error to retry and which not to

Errors checked in the route code and the identity middleware.
ResponseMeaningAction
400 IDEMPOTENCY_KEY_REQUIREDHeader missing or shorter than 16 charactersGenerate a stable key per intent; do not retry unchanged
400 title is required / projectId is requiredA required body field is missingFix the body
401 UNAUTHENTICATEDNo valid credentialAdd x-api-key or Bearer atkr_...
403 WORKSPACE_ARCHIVEDThe workspace was archived for inactivity (7+7 cycle)Have a human claim or restore it; do not retry
429 OPERATION_QUOTA_EXCEEDEDWorkspace monthly quota exhaustedExtend with credits (human action) or wait
429 AGENT_DAILY_REQUEST_QUOTA_EXCEEDEDDaily anti-abuse guardWait until 00:00 UTC
503 with refundPlatform failureRetry: the operation is not charged and the charge is refunded

The general rule: 4xx are yours and are fixed by changing the request; 5xx belong to the platform, are retried with backoff and are not billed. Retrying a 400 a thousand times only wastes time and pollutes your metrics.

A minimal endpoint map

The full contract lives in /api/openapi.json; this table is the starting point.
ResourceUseful endpoints
ProjectsGET /api/projects · POST /api/projects
TasksGET /api/tasks (cursor) · POST /api/tasks (idempotent) · PATCH /api/tasks/:id
SprintsGET /api/sprints · POST /api/sprints
Usage and quotasGET /api/usage?period=YYYY-MM · GET /api/apikeys/:id/usage
WalletGET /api/credits/balance · GET /api/credits/packs · GET /api/credits/history
ContractGET /api/openapi.json (public, no key)

Before you write your own client

  • Read GET /api/openapi.json instead of inferring fields from the example on this page: it is public and needs no key.
  • Try list_projects first: a 200 with an empty list confirms both credential and workspace.
  • Generate the Idempotency-Key once per intent and persist it if the process can die mid-way.
  • Never put the key in the URL or in logs: it goes in a header and is treated as a secret.
  • Cap retries with backoff for 5xx only; for 429 use the resetAt from the body.
  • Close the agent with DELETE /api/apikeys/:id when the work is done: a live key is a live consumer.

Call the AI Tasker API without an SDK

Authenticate with an API key, create an idempotent task, paginate by cursor and handle each error class properly.

  1. Get the key

    Create an atkr_ API key in the dashboard, in the workspace where the agent will operate.

  2. Verify identity

    Call GET /api/projects with x-api-key: a 200 means the key and workspace are fine.

  3. Create idempotently

    POST /api/tasks with an Idempotency-Key of 16 to 160 characters; repeat with the same key after a timeout.

  4. Paginate with the cursor

    Walk GET /api/tasks with limit and nextCursor until hasMore is false.

  5. Handle errors by class

    4xx: fix the request. 429: wait or add credits. 5xx: retry, it is not charged.

Frequently asked questions

Can I use the API without MCP?

Yes. They share workspace, credentials and quotas: the HTTP API covers the same resources and is the path for runtimes that cannot load an MCP client.

How long must the Idempotency-Key be?

Between 16 and 160 characters. Below 16 the answer is 400 IDEMPOTENCY_KEY_REQUIRED, which looks like a missing header but is actually a length rule.

How do I know the contract version?

Read GET /api/openapi.json, which is public and served by the backend itself. The product version also appears in /health and in the site meta tag.

Does the API paginate by offset?

No. GET /api/tasks uses a cursor: it returns hasMore and nextCursor, and you walk it by repeating the call with that cursor.

Are retries charged?

A platform failure returns 503 with a refund and the operation is not charged; retrying a 5xx is not charged either. 4xx are not charged because they never execute.

Can two agents share one key?

You can, but they share revocation and usage trail. One key per agent means cutting one does not affect the others.

Sources

Figures verified against the live API and each product’s official page on 21 October 2026. Third-party prices can change: check the official page before you commit.

Related guides

  • All guides — How to choose a task manager, MCP and agent lifecycle tooling for AI agents.
  • MCP or HTTP API: when to use which — MCP or the HTTP API: what each access solves, when to use each one and how to decide without duplicating integrations. Copyable config and real cost.
  • Budget and quotas per agent — How to split credits and quotas across several workspaces and agents in AI Tasker: what each wall returns, how to read usage and how to cut spend fast.
  • Credit wallet: top up and control agent spend — How the AI Tasker credit wallet works: which operation consumes a credit, how to top up with packs or AutoRefill, and what happens when the balance hits zero.
  • Connect any MCP client over HTTP — Full MCP handshake against AI Tasker with curl: initialize, mcp-session-id header, tools/list and tools/call, with no SDK and no framework.
  • Pricing — Real prices: free plan and a 2.00 €/month billable unit.
  • MCP integration — https://mcp.ai-tasker.theboomer.dev/mcp
  • /llms.txt — Machine-readable contract.

This guide exists to be indexed and cited. It is deliberately not in the menu.