Developers

API reference

The whole REST API: every endpoint, parameter and response, with ready-to-run samples in nine languages. The samples read your key from the TODIX_TOKEN environment variable.

Base URLhttps://todix.com.tr/api/v1Version 1.0.0Download OpenAPI (JSON)Developer page

Sample language

The language you pick is used in every sample on the page and remembered on this device.

Sample language

Every request carries a personal access token: Authorization: Bearer tdx_…. Create one in Todix under Integrations → API.

  • Each key belongs to one person and one workspace and works with that person’s permissions in the app. The API never shows a task you can’t see in the app.
  • Scopes limit what a key can touch; they never grant permissions. Pick only what you need.
  • A missing, malformed, expired or revoked key always gets the same answer: 401 invalid_token.
  • Keep keys out of your code, in the TODIX_TOKEN environment variable like the samples. A key can revoke itself with DELETE /api/v1/token.
  • Browsers can’t call the API from other sites (CORS is closed). Send requests from your own server.

Scopes

ScopeWhat it allows
tasks:readRead tasks · Tasks, comments, labels and members
tasks:writeWrite tasks · Create, update, complete, trash, assign, label
projects:readRead projects · Projects and their sections
projects:writeWrite projects · Create and update projects and sections
comments:writeWrite comments · Post comments in a task’s chat
webhooks:manageManage webhooks · Works for admins only
mcpAssistant connection (MCP) · For assistants like Claude and ChatGPT
hooksInstant triggers · Get notified at your URL when something happens (Zapier, Make)
GET/api/v1/me
curl https://todix.com.tr/api/v1/me \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "user": {
      "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
      "name": "Ersin Kaya",
      "email": "ersin@springstore.com.tr",
      "locale": "tr"
    },
    "workspace": {
      "id": "db3e1c31-eed8-4f7d-b0bf-531218511aee",
      "name": "SpringStore",
      "slug": "springstore",
      "timezone": "Europe/Istanbul",
      "today": "2026-10-15",
      "role": "member"
    },
    "token": {
      "id": "e1a9fcd8-973c-4f5c-b664-10a40fb0583a",
      "scopes": [
        "tasks:read",
        "tasks:write",
        "projects:read"
      ]
    }
  }
}

Your first task in three steps: create a key, put it in an environment variable, send the request.

  1. In Todix, create a key with the tasks:write scope under Integrations → API.
  2. Put it in the TODIX_TOKEN environment variable: export TODIX_TOKEN=tdx_…
  3. Send the request next to this. The response has the new task’s number and URL.
POST/api/v1/tasks
curl -X POST https://todix.com.tr/api/v1/tasks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "title": "Kargo etiketlerini yazdır",
    "priority": "high",
    "due_date": "2026-10-20",
    "assignee_ids": [
      "9dbbdf02-54b2-4454-b632-f672236bc076"
    ],
    "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a"
  }'
Response201Created
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}

Every failed request comes back the same way: { "error": { "code", "message" } }. code is for machines and never changes; message is a short hint for developers.

HTTP status codes

StatusMeaning
400Bad request: the body or query doesn’t match the schema, or a filter or cursor is invalid.
401The key is missing, malformed, expired or revoked.
403The key’s scope or your permission in the app doesn’t allow this.
404The record doesn’t exist or you can’t see it, or there is no such path.
405This path doesn’t support the method (see the Allow header).
409Conflict: a request with this Idempotency-Key is still running, or the record already exists.
413The body is larger than 64 KB.
415The body isn’t JSON: send Content-Type: application/json.
422This Idempotency-Key was used with a different body.
429Rate limit reached; wait Retry-After seconds.
5xxA temporary problem on our side; try again shortly.

Common codes

CodeMeaning
invalid_tokenMissing, malformed, expired or revoked API token.
insufficient_scopeThe token doesn’t have the scope this endpoint needs.
rate_limitedToo many requests. Wait until X-RateLimit-Reset.
not_foundNot found.
route_not_foundNo such endpoint.
method_not_allowedThis endpoint doesn’t support this method.
bad_requestThe request is malformed.
invalid_bodyThe JSON body is missing or doesn’t match the schema.
invalid_queryA query parameter is invalid.
invalid_filterThe smart filter expression couldn’t be parsed.
invalid_cursorThe cursor is invalid. Start again without it.
idempotency_key_invalidIdempotency-Key must be 1–100 characters of A–Z, a–z, 0–9 and _ . : -
idempotency_key_reusedThis Idempotency-Key was used with a different request.
idempotency_in_progressA request with this Idempotency-Key is still running.
payload_too_largeThe body is too large (64 KB at most).
unsupported_media_typeSend JSON (Content-Type: application/json).
unavailableThe service is temporarily unavailable. Try again shortly.
unknownThe request couldn’t be completed.
not_a_memberYou’re not a member of this workspace.
admin_requiredOnly workspace admins can do this.
task_not_foundTask not found, or you can’t see it.
assign_not_allowedYou can’t assign tasks to this person.
forbiddenYou can’t do this.
webhook_url_invalidWebhook URLs must be HTTPS and point at a public host name.
webhook_address_blockedThe webhook host resolves to a private or reserved address.
webhook_events_invalidUnknown webhook event.
webhook_limitA workspace can have at most 20 webhooks.
webhook_not_foundWebhook not found.
webhook_disabledThe webhook is switched off. Turn it on first.
project_not_foundProject not found, or you can’t see it.
hook_not_foundHook not found; it may already be removed.
hook_event_invalidA hook can’t be set up for this event.
hook_limitYou can have at most 100 active hooks in a workspace.
hook_needs_apiHooks are set up only with an API key or a Zapier / Make connection.
Error response
{
  "error": {
    "code": "assign_not_allowed",
    "message": "You may not assign tasks to this person."
  }
}

Lists come in pages: { "data": [...], "next_cursor": "…" }. For the next page, send next_cursor back as ?cursor=; null means you’ve reached the end.

  • limit is 1–200, 50 by default.
  • Tasks are sorted by task number, newest first; pages don’t shift when new tasks arrive in between.
  • With a smart filter a page may hold fewer than limit tasks, or none. Follow next_cursor, not the page size.
  • Cursors are opaque: don’t decode them, send them back as they are.
Next page
curl -G https://todix.com.tr/api/v1/tasks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  --data-urlencode "limit=50" \
  --data-urlencode "cursor=eyJiIjo0MX0"
Response200OK
{
  "data": [
    {
      "id": "18962c5b-6ac7-4891-abce-179e8517f916",
      "number": 42,
      "title": "Kargo etiketlerini yazdır",
      "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
      "status": "open",
      "stage": "doing",
      "priority": "high",
      "due_date": "2026-10-20",
      "due_time": "17:00",
      "start_date": "2026-10-16",
      "deadline": "2026-10-24",
      "estimate_minutes": 45,
      "recurrence": null,
      "is_overdue": false,
      "project": {
        "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
        "name": "Kasım kampanyası",
        "color": "#1F4FEB"
      },
      "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
      "parent_id": null,
      "assignees": [
        {
          "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
          "name": "Ersin Kaya"
        }
      ],
      "labels": [
        {
          "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
          "name": "Acil",
          "color": "#E5484D"
        }
      ],
      "created_by": {
        "id": "dade1044-8acc-4384-9af3-404a04966916",
        "name": "Burak Beşli"
      },
      "assigned_by": {
        "id": "dade1044-8acc-4384-9af3-404a04966916",
        "name": "Burak Beşli"
      },
      "completed_at": null,
      "completed_by": null,
      "comment_count": 3,
      "attachment_count": 1,
      "checklist": {
        "total": 4,
        "done": 1
      },
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "updated_at": "2026-10-15T09:12:44.512+03:00",
      "url": "https://todix.com.tr/springstore/g/42"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}

120 requests a minute per key. Every response tells you what’s left.

  • X-RateLimit-Limit: requests per minute · X-RateLimit-Remaining: what’s left · X-RateLimit-Reset: unix time the window resets.
  • Over the limit you get 429 rate_limited and Retry-After (seconds); wait that long and try again.
  • Requests with invalid keys are limited to 30 a minute per IP address.
  • The MCP connection shares the same counter.
Over the limit
HTTP/1.1 429 Too Many Requests
Retry-After: 18
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1792040460

{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Wait until X-RateLimit-Reset and try again."
  }
}

Every POST accepts an Idempotency-Key header. If the network drops, send the same request with the same key again: the work is never done twice.

  • Keys are 1–100 characters of A–Z, a–z, 0–9 and _ . : -. Make a new value (a UUID, say) for every new piece of work.
  • Same key, same body: you get the first response again, with Idempotent-Replayed: true.
  • Same key, different body: 422 idempotency_key_reused. While the first request is running: 409 idempotency_in_progress.
  • Keys are kept for 24 hours. A 5xx response frees the key so you can retry.
Retry safely
curl -X POST https://todix.com.tr/api/v1/tasks/42/complete \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38"

The filter parameter of GET /tasks takes the app’s smart filter expression. Turkish or English keywords; case and accents don’t matter.

Expressions

ExpressionMeaning
p1 · p2 · p3High, medium, low priority (also !high, !yüksek)
today · tomorrow · overdueBy due date (bugün, yarın, gecikmiş)
this week · next week · this month · 7 days · no dateDate ranges
start:this week · deadline:tomorrowStart date or deadline
@ersin · @meAssignee (@ben)
assigner:@burak · creator:@meAssigned by or created by
#"Kasım kampanyası" · #noneProject, or no project
label:urgentLabel (etiket:acil)
stage:doingStage: todo, doing, waiting, done
estimate>2h · estimate<=30mTime estimate
"shipping"Text in the title or description
& | ! ( )and, or, not, grouping (a space also means “and”)

The filter combines with the other parameters with AND. An expression that can’t be parsed returns 400 invalid_filter.

My high-priority tasks due today
curl -G https://todix.com.tr/api/v1/tasks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  --data-urlencode "filter=p1 & today & @me"

Webhooks sign every request: Todix-Signature: t=<time>, v1=<signature>. The signature is the HMAC-SHA256 (hex) of “time.body” with the webhook’s signing secret.

  • Compute it over the raw body (don’t parse and re-serialize the JSON) and compare in constant time.
  • Reject requests whose time is more than 5 minutes old: that stops replays.
  • While a secret is being rotated a header may carry several v1 values; one match is enough.
  • A 2xx answer means delivered. Failures are retried after 1 min, 5 min, 30 min, 2 h and 8 h; after 15 failures in a row the webhook switches off.
  • Other headers: Todix-Event (the event type) and Todix-Delivery (the delivery id). A retried delivery sends the same body.

Events

EventMeaning
task.createdTask created
task.updatedTask updated
task.completedTask completed
task.deletedTask moved to trash
comment.createdComment posted
project.createdProject created
import { createHmac, timingSafeEqual } from 'node:crypto'

// Express: app.post('/todix', express.raw({ type: 'application/json' }), handler)
export function verifyTodix(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(
    String(header ?? '').split(',').map((p) => p.trim().split('=')),
  )
  const t = Number(parts.t)
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSeconds) return false
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest()
  const given = Buffer.from(parts.v1 ?? '', 'hex')
  return given.length === expected.length && timingSafeEqual(given, expected)
}
Example body
{
  "id": "5f0c…",
  "type": "task.completed",
  "created_at": "2026-10-15T09:12:44.512+00:00",
  "workspace": { "id": "b000…", "slug": "springstore", "name": "SpringStore" },
  "actor": { "id": "a000…", "name": "Ersin Kaya" },
  "data": {
    "task": {
      "id": "e000…", "number": 42, "title": "Kampanya görselleri",
      "status": "done", "priority": "high", "due_date": "2026-10-15",
      "assignee_ids": ["a000…"], "label_ids": [],
      "url": "https://todix.com.tr/springstore/g/42"
    }
  }
}

The Todix remote MCP server connects AI assistants such as Claude, ChatGPT, Claude Code, Cursor and VS Code to your tasks.

Server URLhttps://todix.com.tr/api/mcp

  • Claude and ChatGPT connect with OAuth: add the URL as a custom connector, pick the workspace in Todix and approve. No key to copy.
  • Cursor and VS Code connect with a key that has the mcp scope. Integrations → MCP in Todix gives you the ready configuration with your key in it.
  • Tools: workspaces, my day, search, get, create, update and complete tasks, comment, projects, members. A read-only connection doesn’t list the write tools.
  • MCP works with your permissions too and shares the REST API’s per-minute limit.
claude mcp add --transport http todix https://todix.com.tr/api/mcp

2 endpoints

Who the key belongs to and which workspace it reaches.

The key’s person, workspace and scopes.

Fields

  • userobject

    The key’s person.

    Show 4 child fields
    • iduuid

      Id (uuid).

    • namestring

      Name.

    • emailemail

      Email address.

    • localeenum

      The person’s interface language.

      tren
  • workspaceobject

    The workspace the key is bound to.

    Show 6 child fields
    • iduuid

      Id (uuid).

    • namestring

      Name.

    • slugstring

      The workspace’s short name in URLs.

    • timezonestring

      The workspace’s time zone.

    • todaydate

      Today’s date in the workspace’s time zone.

    • roleenumnullable

      Role: admin or member.

      adminmember
  • tokenobject

    The key used.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • scopesenum[]

      The key’s scopes.

      tasks:readtasks:writeprojects:readprojects:writecomments:writewebhooks:managemcphooks
The me object
{
  "user": {
    "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
    "name": "Ersin Kaya",
    "email": "ersin@springstore.com.tr",
    "locale": "tr"
  },
  "workspace": {
    "id": "db3e1c31-eed8-4f7d-b0bf-531218511aee",
    "name": "SpringStore",
    "slug": "springstore",
    "timezone": "Europe/Istanbul",
    "today": "2026-10-15",
    "role": "member"
  },
  "token": {
    "id": "e1a9fcd8-973c-4f5c-b664-10a40fb0583a",
    "scopes": [
      "tasks:read",
      "tasks:write",
      "projects:read"
    ]
  }
}

With its time zone and today’s date.

Fields

  • iduuid

    Id (uuid).

  • namestring

    Name.

  • slugstring

    The workspace’s short name in URLs.

  • timezonestring

    The workspace’s time zone.

  • todaydate

    Today’s date in the workspace’s time zone.

  • roleenumnullable

    Role: admin or member.

    adminmember
The workspace object
{
  "id": "db3e1c31-eed8-4f7d-b0bf-531218511aee",
  "name": "SpringStore",
  "slug": "springstore",
  "timezone": "Europe/Istanbul",
  "today": "2026-10-15",
  "role": "member"
}
/api/v1/me
Scope: Any key

Returns the person and workspace the key belongs to (with the time zone and today’s date) and its scopes. The easiest way to test a connection.

Responses

  • 200

    OK

    Returns: The me object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/me
curl https://todix.com.tr/api/v1/me \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "user": {
      "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
      "name": "Ersin Kaya",
      "email": "ersin@springstore.com.tr",
      "locale": "tr"
    },
    "workspace": {
      "id": "db3e1c31-eed8-4f7d-b0bf-531218511aee",
      "name": "SpringStore",
      "slug": "springstore",
      "timezone": "Europe/Istanbul",
      "today": "2026-10-15",
      "role": "member"
    },
    "token": {
      "id": "e1a9fcd8-973c-4f5c-b664-10a40fb0583a",
      "scopes": [
        "tasks:read",
        "tasks:write",
        "projects:read"
      ]
    }
  }
}
/api/v1/workspaces
Scope: Any key

Workspaces the key can reach. A key is bound to one workspace, so the list holds one entry.

Responses

GET/api/v1/workspaces
curl https://todix.com.tr/api/v1/workspaces \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "db3e1c31-eed8-4f7d-b0bf-531218511aee",
      "name": "SpringStore",
      "slug": "springstore",
      "timezone": "Europe/Istanbul",
      "today": "2026-10-15",
      "role": "member"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}

9 endpoints

Create, read, update and complete tasks; manage assignees and labels. {ref} in a path is the task number (42) or id.

The same fields in lists and for one task; lists shorten the description.

Fields

  • iduuid

    Id (uuid).

  • numberinteger

    Task number in the workspace (#42).

  • titlestring

    The task’s title.

  • descriptionstring

    The task’s description. Lists carry the first 280 characters; a single task the full text.

  • statusenum

    open or done.

    opendone
  • stageenumnullable

    Stage: todo, doing or waiting.

    tododoingwaiting
  • priorityenum

    Priority: high, medium or low.

    highmediumlow
  • due_datedatenullable

    Due date (YYYY-MM-DD).

  • due_timestringnullable

    Due time (HH:MM), in the workspace’s time zone.

  • start_datedatenullable

    Start date.

  • deadlinedatenullable

    Deadline: the hard limit behind the due date.

  • estimate_minutesintegernullable

    Time estimate, in minutes.

  • recurrencestringnullable

    Repeat rule (null when it doesn’t repeat).

  • is_overdueboolean

    Past its due date and still open.

  • projectobjectnullable

    The task’s project.

    Show 3 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

    • colorstringnullable

      Color, #RRGGBB.

  • section_iduuidnullable

    Section inside the project.

  • parent_iduuidnullable

    Parent task (for a subtask).

  • assigneesobject[]

    Assignees; the first is the primary one.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • labelsobject[]

    Labels.

    Show 3 child fields
    • iduuid

      Id (uuid).

    • namestring

      Name.

    • colorstringnullable

      Color, #RRGGBB.

  • created_byobject

    Who created it.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • assigned_byobjectnullable

    Who assigned it.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • completed_atdate-timenullable

    When it was completed.

  • completed_byobjectnullable

    Who completed it.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • comment_countinteger

    Number of comments.

  • attachment_countinteger

    Number of files.

  • checklistobject

    Checklist summary.

    Show 2 child fields
    • totalinteger

      Number of items.

    • doneinteger

      Number of checked items.

  • created_atdate-time

    When it was created (ISO 8601).

  • updated_atdate-time

    When it last changed (ISO 8601).

  • urluri

    The task’s address in Todix.

The task object
{
  "id": "18962c5b-6ac7-4891-abce-179e8517f916",
  "number": 42,
  "title": "Kargo etiketlerini yazdır",
  "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
  "status": "open",
  "stage": "doing",
  "priority": "high",
  "due_date": "2026-10-20",
  "due_time": "17:00",
  "start_date": "2026-10-16",
  "deadline": "2026-10-24",
  "estimate_minutes": 45,
  "recurrence": null,
  "is_overdue": false,
  "project": {
    "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
    "name": "Kasım kampanyası",
    "color": "#1F4FEB"
  },
  "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
  "parent_id": null,
  "assignees": [
    {
      "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
      "name": "Ersin Kaya"
    }
  ],
  "labels": [
    {
      "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
      "name": "Acil",
      "color": "#E5484D"
    }
  ],
  "created_by": {
    "id": "dade1044-8acc-4384-9af3-404a04966916",
    "name": "Burak Beşli"
  },
  "assigned_by": {
    "id": "dade1044-8acc-4384-9af3-404a04966916",
    "name": "Burak Beşli"
  },
  "completed_at": null,
  "completed_by": null,
  "comment_count": 3,
  "attachment_count": 1,
  "checklist": {
    "total": 4,
    "done": 1
  },
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "updated_at": "2026-10-15T09:12:44.512+03:00",
  "url": "https://todix.com.tr/springstore/g/42"
}
/api/v1/tasks
Scope: tasks:read

Newest task number first. Filters combine with AND; filter takes the app’s smart filter expression. A page may hold fewer than limit tasks: keep going until next_cursor is null.

Query parameters

  • statusenum

    Which tasks: open (default), done, or any.

    opendoneany

    Default: open

  • assigneeuuid | "me"

    Assignee: a person’s id, or me for yourself.

  • projectuuid | "none"

    Project id; none for tasks without a project.

  • sectionuuid

    Section id.

  • labeluuid

    Label id.

  • priorityenum

    Priority.

    highmediumlow
  • stageenum

    Stage.

    tododoingwaiting
  • dueenum

    Due date: today, week (this week), later, none.

    todayweeklaternone
  • overdueenum

    true: overdue tasks only.

    01truefalse
  • parentuuid

    Subtasks of this task.

  • top_levelenum

    true: leave out subtasks.

    01truefalse
  • qstring

    Text in the title or description.

    1–200 characters

  • filterstring

    Smart filter expression, e.g. p1 & today & @me (see Smart filter).

    1–600 characters

  • numberinteger

    Task number in the workspace (#42).

    Between 1 and 9,999,999,999

  • sortenum

    Order: number newest task first (default), updated last changed first, completed last completed first (only done tasks unless status=any).

    numberupdatedcompleted

    Default: number

  • created_sincedate-time

    Only tasks created at or after this time (ISO 8601).

  • updated_sincedate-time

    Only tasks changed at or after this time (ISO 8601).

  • completed_sincedate-time

    Only tasks completed at or after this time (ISO 8601).

  • limitinteger

    Most records on a page.

    Default: 50 · Between 1 and 200

  • cursorstring

    next_cursor from the previous response.

    Up to 200 characters

Responses

  • 200

    OK

    Returns a page of: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/tasks
curl -G https://todix.com.tr/api/v1/tasks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  --data-urlencode "assignee=me" \
  --data-urlencode "due=week"
Response200OK
{
  "data": [
    {
      "id": "18962c5b-6ac7-4891-abce-179e8517f916",
      "number": 42,
      "title": "Kargo etiketlerini yazdır",
      "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
      "status": "open",
      "stage": "doing",
      "priority": "high",
      "due_date": "2026-10-20",
      "due_time": "17:00",
      "start_date": "2026-10-16",
      "deadline": "2026-10-24",
      "estimate_minutes": 45,
      "recurrence": null,
      "is_overdue": false,
      "project": {
        "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
        "name": "Kasım kampanyası",
        "color": "#1F4FEB"
      },
      "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
      "parent_id": null,
      "assignees": [
        {
          "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
          "name": "Ersin Kaya"
        }
      ],
      "labels": [
        {
          "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
          "name": "Acil",
          "color": "#E5484D"
        }
      ],
      "created_by": {
        "id": "dade1044-8acc-4384-9af3-404a04966916",
        "name": "Burak Beşli"
      },
      "assigned_by": {
        "id": "dade1044-8acc-4384-9af3-404a04966916",
        "name": "Burak Beşli"
      },
      "completed_at": null,
      "completed_by": null,
      "comment_count": 3,
      "attachment_count": 1,
      "checklist": {
        "total": 4,
        "done": 1
      },
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "updated_at": "2026-10-15T09:12:44.512+03:00",
      "url": "https://todix.com.tr/springstore/g/42"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/tasks
Scope: tasks:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Without assignees the task is yours. Your assign permissions apply exactly as in the app: the API can’t assign anyone you couldn’t assign there.

Request body

  • titlestringrequired

    The task’s title.

    1–500 characters

  • descriptionstring

    Description (plain text).

    Up to 20,000 characters

  • assignee_idsuuid[]

    Assignees; the first is the primary one. Empty means you.

    Up to 20 items

  • priorityenum

    Priority: high, medium or low.

    highmediumlow
  • due_datedate

    Due date (YYYY-MM-DD).

  • due_timestring

    Due time (HH:MM), in the workspace’s time zone.

  • start_datedate

    Start date.

  • deadlinedate

    Deadline: the hard limit behind the due date.

  • estimate_minutesinteger

    Time estimate, in minutes.

    Between 1 and 100,000

  • project_iduuid

    Project id; null takes the task out of its project.

  • section_iduuid

    Section inside the project.

  • label_idsuuid[]

    Label ids.

    Up to 30 items

Responses

  • 201

    Created

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/tasks
curl -X POST https://todix.com.tr/api/v1/tasks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "title": "Kargo etiketlerini yazdır",
    "priority": "high",
    "due_date": "2026-10-20",
    "assignee_ids": [
      "9dbbdf02-54b2-4454-b632-f672236bc076"
    ],
    "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a"
  }'
Response201Created
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}
Scope: tasks:read

By number (42) or id. Only this endpoint returns the full description and created_at.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/tasks/{ref}
curl https://todix.com.tr/api/v1/tasks/42 \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}
Scope: tasks:write

Send only the fields you want to change. Send null to clear a date.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Request body

  • titlestring

    The task’s title.

    1–500 characters

  • descriptionstring

    Description (plain text).

    Up to 20,000 characters

  • priorityenum

    Priority: high, medium or low.

    highmediumlow
  • stageenum

    Stage: todo, doing or waiting.

    tododoingwaiting
  • due_datedatenullable

    Due date (YYYY-MM-DD).

  • due_timestringnullable

    Due time (HH:MM), in the workspace’s time zone.

  • start_datedatenullable

    Start date.

  • deadlinedatenullable

    Deadline: the hard limit behind the due date.

  • estimate_minutesintegernullable

    Time estimate, in minutes.

    Between 1 and 100,000

  • project_iduuidnullable

    Project id; null takes the task out of its project.

  • section_iduuid

    Section inside the project.

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

PATCH/api/v1/tasks/{ref}
curl -X PATCH https://todix.com.tr/api/v1/tasks/42 \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "stage": "doing",
    "due_date": "2026-10-22"
  }'
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}
Scope: tasks:write

The task goes to the trash and can be restored in the app for 30 days.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Responses

  • 200

    OK

    The response body looks like the example.

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

DELETE/api/v1/tasks/{ref}
curl -X DELETE https://todix.com.tr/api/v1/tasks/42 \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "id": "53002ed3-1aca-4f4d-8d7a-77c294cd2dbe",
    "number": 42
  }
}
/api/v1/tasks/{ref}/complete
Scope: tasks:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Marks the task done; its people are notified as in the app.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/tasks/{ref}/complete
curl -X POST https://todix.com.tr/api/v1/tasks/42/complete \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38"
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}/reopen
Scope: tasks:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Reopens a completed task.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/tasks/{ref}/reopen
curl -X POST https://todix.com.tr/api/v1/tasks/42/reopen \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38"
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}/assignees
Scope: tasks:write

Replaces the whole list; the first person is the primary assignee.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Request body

  • user_idsuuid[]required

    The new assignees; the first is the primary one.

    1–20 items

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

PUT/api/v1/tasks/{ref}/assignees
curl -X PUT https://todix.com.tr/api/v1/tasks/42/assignees \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "user_ids": [
      "9dbbdf02-54b2-4454-b632-f672236bc076",
      "dade1044-8acc-4384-9af3-404a04966916"
    ]
  }'
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}
/api/v1/tasks/{ref}/labels
Scope: tasks:write

Replaces the task’s labels with the list you send. An empty list removes them all.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Request body

  • label_idsuuid[]required

    Label ids.

    Up to 30 items

Responses

  • 200

    OK

    Returns: The task object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

PUT/api/v1/tasks/{ref}/labels
curl -X PUT https://todix.com.tr/api/v1/tasks/42/labels \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "label_ids": [
      "4126c9fb-f32e-44e7-948e-fbd68d51fa16"
    ]
  }'
Response200OK
{
  "data": {
    "id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "description": "Kasım kampanyası siparişlerinin etiketlerini yazdır ve paketlere yapıştır.",
    "status": "open",
    "stage": "doing",
    "priority": "high",
    "due_date": "2026-10-20",
    "due_time": "17:00",
    "start_date": "2026-10-16",
    "deadline": "2026-10-24",
    "estimate_minutes": 45,
    "recurrence": null,
    "is_overdue": false,
    "project": {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "color": "#1F4FEB"
    },
    "section_id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "parent_id": null,
    "assignees": [
      {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      }
    ],
    "labels": [
      {
        "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
        "name": "Acil",
        "color": "#E5484D"
      }
    ],
    "created_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "assigned_by": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "completed_at": null,
    "completed_by": null,
    "comment_count": 3,
    "attachment_count": 1,
    "checklist": {
      "total": 4,
      "done": 1
    },
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00",
    "url": "https://todix.com.tr/springstore/g/42"
  }
}

3 endpoints

The task’s chat: comments are the app’s chat messages, with the same notifications.

One message in a task’s chat.

Fields

  • iduuid

    Id (uuid).

  • task_iduuid

    The comment’s task.

  • bodystring

    The message text.

  • authorobject

    Who wrote it.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • reply_touuidnullable

    The comment it replies to.

  • internalboolean

    true: an internal note — guests never see it.

  • created_atdate-time

    When it was created (ISO 8601).

  • edited_atdate-timenullable

    When it was last edited.

The comment object
{
  "id": "3bbcb474-f78e-4e64-b254-e1480063261a",
  "task_id": "18962c5b-6ac7-4891-abce-179e8517f916",
  "body": "Etiketler hazır, yarın sabah kargoya veriyoruz.",
  "author": {
    "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
    "name": "Ersin Kaya"
  },
  "reply_to": null,
  "internal": false,
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "edited_at": null
}

A comment plus the number, title and URL of the task it was written on.

Fields

  • iduuid

    Id (uuid).

  • task_iduuid

    The comment’s task.

  • bodystring

    The message text.

  • authorobject

    Who wrote it.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • reply_touuidnullable

    The comment it replies to.

  • internalboolean

    true: an internal note — guests never see it.

  • created_atdate-time

    When it was created (ISO 8601).

  • edited_atdate-timenullable

    When it was last edited.

  • taskobject

    The task the comment was written on.

    Show 4 child fields
    • iduuid

      Id (uuid).

    • numberinteger

      Task number in the workspace (#42).

    • titlestring

      The task’s title.

    • urluri

      URL.

Comment with its task
{
  "id": "0115c0ed-f217-4e6f-af55-00f21ab6c03e",
  "task_id": "18962c5b-6ac7-4891-abce-179e8517f916",
  "body": "Etiketler hazır, yarın sabah kargoya veriyoruz.",
  "author": {
    "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
    "name": "Ersin Kaya"
  },
  "reply_to": null,
  "internal": false,
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "edited_at": null,
  "task": {
    "id": "4ae07943-b178-400b-a273-8176ef42815e",
    "number": 42,
    "title": "Kargo etiketlerini yazdır",
    "url": "https://hooks.springstore.com.tr/todix"
  }
}
/api/v1/tasks/{ref}/comments
Scope: tasks:read

The task’s chat messages, newest first.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Query parameters

  • limitinteger

    Most records on a page.

    Default: 50 · Between 1 and 200

  • cursorstring

    next_cursor from the previous response.

    Up to 200 characters

Responses

  • 200

    OK

    Returns a page of: The comment object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/tasks/{ref}/comments
curl -G https://todix.com.tr/api/v1/tasks/42/comments \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  --data-urlencode "limit=20"
Response200OK
{
  "data": [
    {
      "id": "3bbcb474-f78e-4e64-b254-e1480063261a",
      "task_id": "18962c5b-6ac7-4891-abce-179e8517f916",
      "body": "Etiketler hazır, yarın sabah kargoya veriyoruz.",
      "author": {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      },
      "reply_to": null,
      "internal": false,
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "edited_at": null
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/tasks/{ref}/comments
Scope: comments:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Posts a message to the task’s chat; its people are notified like for a chat message.

Path parameters

  • refstringrequired

    Task number (42) or task id (uuid).

Request body

  • bodystringrequired

    The message text.

    1–10,000 characters

  • reply_touuid

    The comment it replies to.

  • internalboolean

    true: an internal note — guests never see it.

Responses

  • 201

    Created

    Returns: The comment object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/tasks/{ref}/comments
curl -X POST https://todix.com.tr/api/v1/tasks/42/comments \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "body": "Etiketler hazır, yarın sabah kargoya veriyoruz."
  }'
Response201Created
{
  "data": {
    "id": "3bbcb474-f78e-4e64-b254-e1480063261a",
    "task_id": "18962c5b-6ac7-4891-abce-179e8517f916",
    "body": "Etiketler hazır, yarın sabah kargoya veriyoruz.",
    "author": {
      "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
      "name": "Ersin Kaya"
    },
    "reply_to": null,
    "internal": false,
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "edited_at": null
  }
}
/api/v1/comments
Scope: tasks:read

The latest comments you can see in the workspace, newest first, each with its task. Built for “new comment” triggers: since returns only newer ones, project and task narrow the list.

Query parameters

  • projectuuid

    Project id; none for tasks without a project.

  • taskstring

    Task number (42) or task id.

    Up to 64 characters

  • sincedate-time

    Only comments written at or after this time (ISO 8601).

  • limitinteger

    Most records on a page.

    Default: 50 · Between 1 and 200

  • cursorstring

    next_cursor from the previous response.

    Up to 200 characters

Responses

GET/api/v1/comments
curl https://todix.com.tr/api/v1/comments \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "0115c0ed-f217-4e6f-af55-00f21ab6c03e",
      "task_id": "18962c5b-6ac7-4891-abce-179e8517f916",
      "body": "Etiketler hazır, yarın sabah kargoya veriyoruz.",
      "author": {
        "id": "9dbbdf02-54b2-4454-b632-f672236bc076",
        "name": "Ersin Kaya"
      },
      "reply_to": null,
      "internal": false,
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "edited_at": null,
      "task": {
        "id": "4ae07943-b178-400b-a273-8176ef42815e",
        "number": 42,
        "title": "Kargo etiketlerini yazdır",
        "url": "https://hooks.springstore.com.tr/todix"
      }
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}

6 endpoints

Projects and their sections.

A project with its counts and progress.

Fields

  • iduuid

    Id (uuid).

  • namestring

    Name.

  • descriptionstringnullable

    Description (plain text).

  • colorstringnullable

    Color, #RRGGBB.

  • iconstringnullable

    Icon name (lowercase letters, digits, dashes).

  • statusstring

    The project’s status.

  • ownerobjectnullable

    Project owner.

    Show 2 child fields
    • iduuid

      Id (uuid).

    • namestringnullable

      Name.

  • parent_iduuidnullable

    Parent project.

  • folder_iduuidnullable

    The project’s folder.

  • start_datedatenullable

    Start date.

  • end_datedatenullable

    End date.

  • archived_atdate-timenullable

    When it was archived (null when it isn’t).

  • countsobject

    Task counts.

    Show 4 child fields
    • openinteger

      Open tasks.

    • doneinteger

      Completed tasks.

    • overdueinteger

      Overdue tasks.

    • totalinteger

      All tasks.

  • progressinteger

    Progress, percent (0–100).

  • created_atdate-time

    When it was created (ISO 8601).

  • updated_atdate-time

    When it last changed (ISO 8601).

The project object
{
  "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
  "name": "Kasım kampanyası",
  "description": "Kasım indirim haftasının hazırlıkları.",
  "color": "#1F4FEB",
  "icon": "rocket",
  "status": "active",
  "owner": {
    "id": "dade1044-8acc-4384-9af3-404a04966916",
    "name": "Burak Beşli"
  },
  "parent_id": null,
  "folder_id": null,
  "start_date": "2026-10-16",
  "end_date": "2026-11-30",
  "archived_at": null,
  "counts": {
    "open": 12,
    "done": 30,
    "overdue": 2,
    "total": 42
  },
  "progress": 71,
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "updated_at": "2026-10-15T09:12:44.512+03:00"
}

A section inside a project.

Fields

  • iduuid

    Id (uuid).

  • namestring

    Name.

  • positioninteger

    Its place in the project.

The section object
{
  "id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
  "name": "Paketleme",
  "position": 2
}
/api/v1/projects
Scope: projects:read

Archived projects only with archived=true.

Query parameters

  • archivedenum

    true: include archived projects.

    01truefalse
  • qstring

    Text in the title or description.

    1–120 characters

Responses

  • 200

    OK

    Returns a page of: The project object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/projects
curl https://todix.com.tr/api/v1/projects \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "name": "Kasım kampanyası",
      "description": "Kasım indirim haftasının hazırlıkları.",
      "color": "#1F4FEB",
      "icon": "rocket",
      "status": "active",
      "owner": {
        "id": "dade1044-8acc-4384-9af3-404a04966916",
        "name": "Burak Beşli"
      },
      "parent_id": null,
      "folder_id": null,
      "start_date": "2026-10-16",
      "end_date": "2026-11-30",
      "archived_at": null,
      "counts": {
        "open": 12,
        "done": 30,
        "overdue": 2,
        "total": 42
      },
      "progress": 71,
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "updated_at": "2026-10-15T09:12:44.512+03:00"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/projects
Scope: projects:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Opens a new project. Your permission to create projects is the same as in the app.

Request body

  • namestringrequired

    Name.

    1–120 characters

  • descriptionstring

    Description (plain text).

    Up to 5,000 characters

  • colorstring

    Color, #RRGGBB.

  • iconstring

    Icon name (lowercase letters, digits, dashes).

  • owner_iduuid

    The project owner’s id.

  • start_datedate

    Start date.

  • end_datedate

    End date.

Responses

  • 201

    Created

    Returns: The project object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/projects
curl -X POST https://todix.com.tr/api/v1/projects \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "name": "Kasım kampanyası",
    "color": "#1F4FEB",
    "start_date": "2026-11-01",
    "end_date": "2026-11-30"
  }'
Response201Created
{
  "data": {
    "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
    "name": "Kasım kampanyası",
    "description": "Kasım indirim haftasının hazırlıkları.",
    "color": "#1F4FEB",
    "icon": "rocket",
    "status": "active",
    "owner": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "parent_id": null,
    "folder_id": null,
    "start_date": "2026-10-16",
    "end_date": "2026-11-30",
    "archived_at": null,
    "counts": {
      "open": 12,
      "done": 30,
      "overdue": 2,
      "total": 42
    },
    "progress": 71,
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00"
  }
}
/api/v1/projects/{id}
Scope: projects:read

A project with its counts and progress.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

GET/api/v1/projects/{id}
curl https://todix.com.tr/api/v1/projects/38b4ef00-de3c-41ea-bfca-eb30a9b54d8a \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
    "name": "Kasım kampanyası",
    "description": "Kasım indirim haftasının hazırlıkları.",
    "color": "#1F4FEB",
    "icon": "rocket",
    "status": "active",
    "owner": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "parent_id": null,
    "folder_id": null,
    "start_date": "2026-10-16",
    "end_date": "2026-11-30",
    "archived_at": null,
    "counts": {
      "open": 12,
      "done": 30,
      "overdue": 2,
      "total": 42
    },
    "progress": 71,
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00"
  }
}
/api/v1/projects/{id}
Scope: projects:write

Send only the fields you want to change; null clears the description, the owner or a date.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Request body

  • namestring

    Name.

    1–120 characters

  • descriptionstringnullable

    Description (plain text).

    Up to 5,000 characters

  • colorstring

    Color, #RRGGBB.

  • iconstring

    Icon name (lowercase letters, digits, dashes).

  • owner_iduuidnullable

    The project owner’s id.

  • start_datedatenullable

    Start date.

  • end_datedatenullable

    End date.

Responses

PATCH/api/v1/projects/{id}
curl -X PATCH https://todix.com.tr/api/v1/projects/38b4ef00-de3c-41ea-bfca-eb30a9b54d8a \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "end_date": "2026-12-05"
  }'
Response200OK
{
  "data": {
    "id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
    "name": "Kasım kampanyası",
    "description": "Kasım indirim haftasının hazırlıkları.",
    "color": "#1F4FEB",
    "icon": "rocket",
    "status": "active",
    "owner": {
      "id": "dade1044-8acc-4384-9af3-404a04966916",
      "name": "Burak Beşli"
    },
    "parent_id": null,
    "folder_id": null,
    "start_date": "2026-10-16",
    "end_date": "2026-11-30",
    "archived_at": null,
    "counts": {
      "open": 12,
      "done": 30,
      "overdue": 2,
      "total": 42
    },
    "progress": 71,
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "updated_at": "2026-10-15T09:12:44.512+03:00"
  }
}
/api/v1/projects/{id}/sections
Scope: projects:read

The project’s sections, in order.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 200

    OK

    Returns a page of: The section object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/projects/{id}/sections
curl https://todix.com.tr/api/v1/projects/38b4ef00-de3c-41ea-bfca-eb30a9b54d8a/sections \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
      "name": "Paketleme",
      "position": 2
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/projects/{id}/sections
Scope: projects:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Adds a new section at the end of the project.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Request body

  • namestringrequired

    Name.

    1–80 characters

Responses

  • 201

    Created

    Returns: The section object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/projects/{id}/sections
curl -X POST https://todix.com.tr/api/v1/projects/38b4ef00-de3c-41ea-bfca-eb30a9b54d8a/sections \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "name": "Paketleme"
  }'
Response201Created
{
  "data": {
    "id": "c42e1c20-99a3-40da-8817-0c38c4f506da",
    "name": "Paketleme",
    "position": 2
  }
}

2 endpoints

The workspace’s labels.

A label with its name and color.

Fields

  • iduuid

    Id (uuid).

  • namestring

    Name.

  • colorstringnullable

    Color, #RRGGBB.

The label object
{
  "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
  "name": "Acil",
  "color": "#E5484D"
}
/api/v1/labels
Scope: tasks:read

The workspace’s labels.

Responses

  • 200

    OK

    Returns a page of: The label object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/labels
curl https://todix.com.tr/api/v1/labels \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
      "name": "Acil",
      "color": "#E5484D"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/labels
Scope: tasks:writeIdempotency-KeyRetry this request safely with an Idempotency-Key.

Adds a new label to the workspace.

Request body

  • namestringrequired

    Name.

    1–40 characters

  • colorstring

    Color, #RRGGBB.

Responses

  • 201

    Created

    Returns: The label object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/labels
curl -X POST https://todix.com.tr/api/v1/labels \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "name": "Acil",
    "color": "#E5484D"
  }'
Response201Created
{
  "data": {
    "id": "4126c9fb-f32e-44e7-948e-fbd68d51fa16",
    "name": "Acil",
    "color": "#E5484D"
  }
}

1 endpoint

The people in the workspace, and whether you can assign them.

A person in the workspace.

Fields

  • user_iduuid

    The person’s id.

  • namestring

    Name.

  • emailemail

    Email address.

  • titlestringnullable

    The person’s job title.

  • roleenum

    Role: admin or member.

    adminmember
  • statusenum

    active or disabled.

    activedisabled
  • can_assignboolean

    Whether you can assign tasks to this person.

The member object
{
  "user_id": "9dbbdf02-54b2-4454-b632-f672236bc076",
  "name": "Ersin Kaya",
  "email": "ersin@springstore.com.tr",
  "title": "Operasyon sorumlusu",
  "role": "member",
  "status": "active",
  "can_assign": true
}
/api/v1/members
Scope: tasks:read

The workspace’s members. can_assign tells you whether you can assign them tasks.

Query parameters

  • emailemail

    Email address.

    Up to 200 characters

  • qstring

    Text in the title or description.

    1–120 characters

Responses

  • 200

    OK

    Returns a page of: The member object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/members
curl https://todix.com.tr/api/v1/members \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "user_id": "9dbbdf02-54b2-4454-b632-f672236bc076",
      "name": "Ersin Kaya",
      "email": "ersin@springstore.com.tr",
      "title": "Operasyon sorumlusu",
      "role": "member",
      "status": "active",
      "can_assign": true
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}

8 endpoints

Signed requests to your URL when something happens in the workspace. Admins only; the key needs the webhooks:manage scope.

Its URL, events and latest delivery status.

Fields

  • iduuid

    Id (uuid).

  • urluri

    The HTTPS URL requests go to.

  • descriptionstringnullable

    Description (plain text).

  • eventsenum[]

    The events it listens to.

    task.createdtask.updatedtask.completedtask.deletedcomment.createdproject.created
  • enabledboolean

    Whether it’s on; true resets the failure counter.

  • failure_countinteger

    Failed deliveries in a row.

  • disabled_reason"failing"nullable

    failing: switched off after failures in a row.

  • last_delivery_atdate-timenullable

    Latest delivery attempt.

  • last_success_atdate-timenullable

    Latest successful delivery.

  • secret_hintstring

    Last 4 characters of the signing secret.

  • created_atdate-time

    When it was created (ISO 8601).

The webhook object
{
  "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
  "url": "https://hooks.springstore.com.tr/todix",
  "description": "Zapier – yeni görevler",
  "events": [
    "task.created",
    "task.completed"
  ],
  "enabled": true,
  "failure_count": 0,
  "disabled_reason": null,
  "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
  "last_success_at": "2026-10-15T09:12:44.512+03:00",
  "secret_hint": "9f2c",
  "created_at": "2026-10-15T09:12:44.512+03:00"
}

Returned when you create a webhook or rotate its secret: only these responses carry secret.

Fields

  • iduuid

    Id (uuid).

  • urluri

    The HTTPS URL requests go to.

  • descriptionstringnullable

    Description (plain text).

  • eventsenum[]

    The events it listens to.

    task.createdtask.updatedtask.completedtask.deletedcomment.createdproject.created
  • enabledboolean

    Whether it’s on; true resets the failure counter.

  • failure_countinteger

    Failed deliveries in a row.

  • disabled_reason"failing"nullable

    failing: switched off after failures in a row.

  • last_delivery_atdate-timenullable

    Latest delivery attempt.

  • last_success_atdate-timenullable

    Latest successful delivery.

  • secret_hintstring

    Last 4 characters of the signing secret.

  • created_atdate-time

    When it was created (ISO 8601).

  • secretstring

    The signing secret (whsec_…); only in this response, once.

Webhook with its secret
{
  "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
  "url": "https://hooks.springstore.com.tr/todix",
  "description": "Zapier – yeni görevler",
  "events": [
    "task.created",
    "task.completed"
  ],
  "enabled": true,
  "failure_count": 0,
  "disabled_reason": null,
  "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
  "last_success_at": "2026-10-15T09:12:44.512+03:00",
  "secret_hint": "9f2c",
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "secret": "whsec_Q2hhbmdlTWVJbkEgc2VjcmV0IHBsYWNlLjlmMmM"
}

One webhook request and its outcome.

Fields

  • iduuid

    Id (uuid).

  • eventstring

    Event type.

  • statusenum

    pending, sending, delivered, failed or canceled.

    pendingsendingdeliveredfailedcanceled
  • attemptsinteger

    Number of attempts.

  • response_statusintegernullable

    The receiver’s HTTP status code.

  • errorstringnullable

    Why it failed (null on success).

  • duration_msintegernullable

    Duration, in milliseconds.

  • created_atdate-time

    When it was created (ISO 8601).

  • last_attempt_atdate-timenullable

    Latest attempt.

  • delivered_atdate-timenullable

    When it was delivered.

  • next_attempt_atdate-timenullable

    Next attempt.

The delivery object
{
  "id": "b21e4eaf-cd82-4fdb-9ed7-f71e0627144e",
  "event": "task.completed",
  "status": "delivered",
  "attempts": 1,
  "response_status": 200,
  "error": null,
  "duration_ms": 184,
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "last_attempt_at": "2026-10-15T09:12:44.512+03:00",
  "delivered_at": "2026-10-15T09:12:44.512+03:00",
  "next_attempt_at": null
}
/api/v1/webhooks
Scope: webhooks:manage

The workspace’s webhooks. Admins only.

Responses

  • 200

    OK

    Returns a page of: The webhook object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/webhooks
curl https://todix.com.tr/api/v1/webhooks \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
      "url": "https://hooks.springstore.com.tr/todix",
      "description": "Zapier – yeni görevler",
      "events": [
        "task.created",
        "task.completed"
      ],
      "enabled": true,
      "failure_count": 0,
      "disabled_reason": null,
      "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
      "last_success_at": "2026-10-15T09:12:44.512+03:00",
      "secret_hint": "9f2c",
      "created_at": "2026-10-15T09:12:44.512+03:00"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/webhooks
Scope: webhooks:manageIdempotency-KeyRetry this request safely with an Idempotency-Key.

The signing secret is returned once, in this response only; save it right away. The URL must be a public HTTPS address.

Request body

  • urlurirequired

    The public HTTPS URL to send requests to.

    Up to 500 characters

  • eventsenum[]required

    The events it listens to.

    task.createdtask.updatedtask.completedtask.deletedcomment.createdproject.created

    1–6 items

  • descriptionstring

    Description (plain text).

    Up to 200 characters

Responses

POST/api/v1/webhooks
curl -X POST https://todix.com.tr/api/v1/webhooks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "url": "https://hooks.springstore.com.tr/todix",
    "events": [
      "task.created",
      "task.completed"
    ],
    "description": "Zapier – yeni görevler"
  }'
Response201Created
{
  "data": {
    "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
    "url": "https://hooks.springstore.com.tr/todix",
    "description": "Zapier – yeni görevler",
    "events": [
      "task.created",
      "task.completed"
    ],
    "enabled": true,
    "failure_count": 0,
    "disabled_reason": null,
    "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
    "last_success_at": "2026-10-15T09:12:44.512+03:00",
    "secret_hint": "9f2c",
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "secret": "whsec_Q2hhbmdlTWVJbkEgc2VjcmV0IHBsYWNlLjlmMmM"
  }
}
/api/v1/webhooks/{id}
Scope: webhooks:manage

The webhook’s settings and latest delivery status.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

GET/api/v1/webhooks/{id}
curl https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": {
    "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
    "url": "https://hooks.springstore.com.tr/todix",
    "description": "Zapier – yeni görevler",
    "events": [
      "task.created",
      "task.completed"
    ],
    "enabled": true,
    "failure_count": 0,
    "disabled_reason": null,
    "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
    "last_success_at": "2026-10-15T09:12:44.512+03:00",
    "secret_hint": "9f2c",
    "created_at": "2026-10-15T09:12:44.512+03:00"
  }
}
/api/v1/webhooks/{id}
Scope: webhooks:manage

enabled: true resets the failure counter and turns a switched-off webhook back on.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Request body

  • urluri

    The new HTTPS URL.

    Up to 500 characters

  • eventsenum[]

    The events it listens to.

    task.createdtask.updatedtask.completedtask.deletedcomment.createdproject.created

    1–6 items

  • descriptionstringnullable

    Description (plain text).

    Up to 200 characters

  • enabledboolean

    Whether it’s on; true resets the failure counter.

Responses

PATCH/api/v1/webhooks/{id}
curl -X PATCH https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true
  }'
Response200OK
{
  "data": {
    "id": "d164961a-2c53-4224-9866-5df6c010f6fe",
    "url": "https://hooks.springstore.com.tr/todix",
    "description": "Zapier – yeni görevler",
    "events": [
      "task.created",
      "task.completed"
    ],
    "enabled": true,
    "failure_count": 0,
    "disabled_reason": null,
    "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
    "last_success_at": "2026-10-15T09:12:44.512+03:00",
    "secret_hint": "9f2c",
    "created_at": "2026-10-15T09:12:44.512+03:00"
  }
}
/api/v1/webhooks/{id}
Scope: webhooks:manage

Deletes the webhook and its delivery history. Returns 204 with no body.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 204

    No content

    No body on success.

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

DELETE/api/v1/webhooks/{id}
curl -X DELETE https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response204No content
/api/v1/webhooks/{id}/test
Scope: webhooks:manageIdempotency-KeyRetry this request safely with an Idempotency-Key.

Queues a ping delivery right away (202). Test deliveries aren’t retried.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 202

    Accepted

    The response body looks like the example.

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/webhooks/{id}/test
curl -X POST https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe/test \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38"
Response202Accepted
{
  "data": {
    "id": "53002ed3-1aca-4f4d-8d7a-77c294cd2dbe"
  }
}
/api/v1/webhooks/{id}/rotate-secret
Scope: webhooks:manageIdempotency-KeyRetry this request safely with an Idempotency-Key.

The new secret is returned once; the old one stops working at once.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 200

    OK

    The response body looks like the example.

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

POST/api/v1/webhooks/{id}/rotate-secret
curl -X POST https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe/rotate-secret \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38"
Response200OK
{
  "data": {
    "secret": "whsec_Q2hhbmdlTWVJbkEgc2VjcmV0IHBsYWNlLjlmMmM"
  }
}
/api/v1/webhooks/{id}/deliveries
Scope: webhooks:manage

The webhook’s last 50 deliveries, with status and timing.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 200

    OK

    Returns a page of: The delivery object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/webhooks/{id}/deliveries
curl https://todix.com.tr/api/v1/webhooks/d164961a-2c53-4224-9866-5df6c010f6fe/deliveries \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "b21e4eaf-cd82-4fdb-9ed7-f71e0627144e",
      "event": "task.completed",
      "status": "delivered",
      "attempts": 1,
      "response_status": 200,
      "error": null,
      "duration_ms": 184,
      "created_at": "2026-10-15T09:12:44.512+03:00",
      "last_attempt_at": "2026-10-15T09:12:44.512+03:00",
      "delivered_at": "2026-10-15T09:12:44.512+03:00",
      "next_attempt_at": null
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}

3 endpoints

Signed event notifications to your own URL the moment something happens; Zapier and Make use them. Any member can set one up and only receives what they can see. The key needs the hooks scope.

A subscription with its event, target URL, filters and last delivery.

Fields

  • iduuid

    Id (uuid).

  • eventenum

    Event type.

    task.createdtask.updatedtask.completedtask.assignedcomment.createdproject.created
  • target_urluri

    The HTTPS URL events are sent to.

  • project_iduuidnullable

    Only tasks and comments of this project.

  • assigned_to_meboolean

    true: only tasks assigned to you (task.assigned always is).

  • enabledboolean

    Whether it’s on; true resets the failure counter.

  • failure_countinteger

    Failed deliveries in a row.

  • disabled_reason"failing"nullable

    failing: switched off after failures in a row.

  • last_delivery_atdate-timenullable

    Latest delivery attempt.

  • last_success_atdate-timenullable

    Latest successful delivery.

  • created_atdate-time

    When it was created (ISO 8601).

The hook object
{
  "id": "4b8bb322-c648-47c0-a12a-df2417965de2",
  "event": "task.completed",
  "target_url": "https://todix.com.tr/springstore",
  "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
  "assigned_to_me": false,
  "enabled": true,
  "failure_count": 0,
  "disabled_reason": null,
  "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
  "last_success_at": "2026-10-15T09:12:44.512+03:00",
  "created_at": "2026-10-15T09:12:44.512+03:00"
}

The hook returned when you create it: the secret appears only in this response.

Fields

  • iduuid

    Id (uuid).

  • eventenum

    Event type.

    task.createdtask.updatedtask.completedtask.assignedcomment.createdproject.created
  • target_urluri

    The HTTPS URL events are sent to.

  • project_iduuidnullable

    Project id; null takes the task out of its project.

  • assigned_to_meboolean

    true: only tasks assigned to you (task.assigned always is).

  • enabledboolean

    Whether it’s on; true resets the failure counter.

  • failure_countinteger

    Failed deliveries in a row.

  • disabled_reason"failing"nullable

    failing: switched off after failures in a row.

  • last_delivery_atdate-timenullable

    Latest delivery attempt.

  • last_success_atdate-timenullable

    Latest successful delivery.

  • created_atdate-time

    When it was created (ISO 8601).

  • secretstring

    The signing secret (whsec_…); only in this response, once.

Hook with signing secret
{
  "id": "ec84049e-de73-4b24-9d69-63687bee00aa",
  "event": "task.completed",
  "target_url": "https://todix.com.tr/springstore",
  "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
  "assigned_to_me": false,
  "enabled": true,
  "failure_count": 0,
  "disabled_reason": null,
  "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
  "last_success_at": "2026-10-15T09:12:44.512+03:00",
  "created_at": "2026-10-15T09:12:44.512+03:00",
  "secret": "whsec_Q2hhbmdlTWVJbkEgc2VjcmV0IHBsYWNlLjlmMmM"
}
/api/v1/hooks
Scope: hooks

The hooks this key or connection has set up.

Responses

  • 200

    OK

    Returns a page of: The hook object

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

GET/api/v1/hooks
curl https://todix.com.tr/api/v1/hooks \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response200OK
{
  "data": [
    {
      "id": "4b8bb322-c648-47c0-a12a-df2417965de2",
      "event": "task.completed",
      "target_url": "https://todix.com.tr/springstore",
      "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
      "assigned_to_me": false,
      "enabled": true,
      "failure_count": 0,
      "disabled_reason": null,
      "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
      "last_success_at": "2026-10-15T09:12:44.512+03:00",
      "created_at": "2026-10-15T09:12:44.512+03:00"
    }
  ],
  "next_cursor": "eyJiIjo0MX0"
}
/api/v1/hooks
Scope: hooksIdempotency-KeyRetry this request safely with an Idempotency-Key.

Subscribes a URL to an event; the signing secret is returned once, in this response only. You only receive what you can see in the app. task.* and comment.created need tasks:read, project.created needs projects:read. At most 100 hooks per person and workspace; a 410 Gone answer deletes the hook.

Request body

  • eventenumrequired

    Event type.

    task.createdtask.updatedtask.completedtask.assignedcomment.createdproject.created
  • target_urlurirequired

    The HTTPS URL events are sent to.

    Up to 500 characters

  • project_iduuid

    Only tasks and comments of this project.

  • assigned_to_meboolean

    true: only tasks assigned to you (task.assigned always is).

Responses

POST/api/v1/hooks
curl -X POST https://todix.com.tr/api/v1/hooks \
  -H "Authorization: Bearer $TODIX_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f1c2a9e-7b3d-4e8f-a0c6-2d9b4e7f1a38" \
  -d '{
    "event": "task.completed",
    "target_url": "https://todix.com.tr/springstore"
  }'
Response201Created
{
  "data": {
    "id": "ec84049e-de73-4b24-9d69-63687bee00aa",
    "event": "task.completed",
    "target_url": "https://todix.com.tr/springstore",
    "project_id": "38b4ef00-de3c-41ea-bfca-eb30a9b54d8a",
    "assigned_to_me": false,
    "enabled": true,
    "failure_count": 0,
    "disabled_reason": null,
    "last_delivery_at": "2026-10-15T09:12:44.512+03:00",
    "last_success_at": "2026-10-15T09:12:44.512+03:00",
    "created_at": "2026-10-15T09:12:44.512+03:00",
    "secret": "whsec_Q2hhbmdlTWVJbkEgc2VjcmV0IHBsYWNlLjlmMmM"
  }
}
/api/v1/hooks/{id}
Scope: hooks

Removes the subscription; no more requests from now on.

Path parameters

  • iduuidrequired

    The record’s id (uuid).

Responses

  • 204

    No content

    No body on success.

  • 4xx

    Failed requests return the one error object. Errors

    400 · 401 · 403 · 404 · 429

DELETE/api/v1/hooks/{id}
curl -X DELETE https://todix.com.tr/api/v1/hooks/79412475-96f7-4e47-b579-46723801a22e \
  -H "Authorization: Bearer $TODIX_TOKEN"
Response204No content