Geliştiriciler

Planitude ile geliştirin

Bir REST API, imzalı webhook'lar ve bir MCP sunucusu: sistemlerinizi plana göre eşitli tutun, her değişikliğe tepki verin ve bir yapay zekâ asistanının projelerinizde çalışmasına izin verin.

Kod, alan adları ve teknik başvuru kaynağı, çoğu API belgesinde olduğu gibi İngilizcedir.

Temel URL: https://planitude.app

İstekler ve yanıtlar HTTPS üzerinden JSON'dur. Süreler ve gecikmeler çalışma dakikası cinsindendir (8 saatlik gün 480'dir), zaman noktaları UTC'de ISO 8601'dir, saatsiz tarihler YYYY-MM-DD biçimindedir.

İstek
curl https://planitude.app/api/auth/me \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "user": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "email": "[email protected]",
    "name": "Anna Rossi",
    "avatarUrl": null,
    "locale": "en",
    "emailVerified": true
  }
}

Hızlı başlangıç

Sıfırdan ilk webhook'unuza üç adımda. Tek ihtiyacınız bir terminal.

  1. API anahtarı oluşturun

    Profil → API anahtarları bölümünü açın, Okuma ve yazma seçeneğini seçin ve anahtarı kopyalayın: gnt_ ile başlar ve yalnızca bir kez gösterilir. Bir ortam değişkeninde saklayın.

  2. İlk çağrınızı yapın

    Görebildiğiniz projeleri listeleyin. Anahtar sizin adınıza hareket eder: aynı projeler, aynı roller.

  3. Bir webhook alın

    Herkese açık bir HTTPS uç noktasını ihtiyacınız olan olaylara abone edin, ardından hemen bir test olayı gönderin ve imzasını doğrulayın.

1Terminal
export PLANITUDE_API_KEY="gnt_…"
2
curl https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Beklenen sonuç200 OK
{
  "projects": [
    {
      "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
      "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "key": "WHX",
      "keyLocked": false,
      "name": "Warehouse expansion",
      "description": null,
      "startDate": "2026-10-05",
      "calendarId": null,
      "currency": "EUR",
      "scheduleFrom": "forward",
      "deadline": null,
      "color": null,
      "settings": {},
      "archivedAt": null,
      "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "createdAt": "2026-10-01T08:30:12.418Z",
      "updatedAt": "2026-10-01T08:30:12.418Z",
      "workspaceName": "Acme Construction",
      "role": "owner",
      "taskCount": 12,
      "finishAt": "2026-10-07T15:00:00.000Z"
    }
  ]
}
3
curl -X POST https://planitude.app/api/webhooks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com/hooks/planitude",
  "events": [
    "task.created",
    "task.completed"
  ],
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8"
}'
Örnek yükwebhook.ping
{
  "id": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
  "type": "webhook.ping",
  "apiVersion": "2026-10-01",
  "createdAt": "2026-10-01T08:30:12.418Z",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "actor": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "name": "Anna Rossi"
  },
  "data": {
    "message": "Planitude webhook test",
    "webhook": {
      "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
      "name": "Warehouse sync",
      "events": [
        "task.created",
        "task.completed"
      ]
    }
  }
}

Kimlik doğrulama

Her isteği, Authorization üst bilgisinde taşıyıcı belirteç olarak kişisel bir API anahtarıyla doğrulayın. Anahtarlar kişiseldir: sizin adınıza, her projedeki rolünüzle hareket eder, asla daha fazlasıyla değil. Bir anahtarı tek bir çalışma alanıyla sınırlayabilir, ona son kullanma tarihi verebilir ve istediğiniz zaman iptal edebilirsiniz; her çağrı anahtarın yanında günlüğe kaydedilir.

Kapsamlar

Kapsamİzin verir
readplanitude:readProjeleri, görevleri, bağımlılıkları, üyeleri, yorumları, temel planları ve webhook'ları okuma.
writeplanitude:writeOkumadaki her şey; ayrıca projeleri, görevleri, bağımlılıkları, yorumları, temel planları ve webhook'ları oluşturma ve değiştirme.

Anahtarlar ve OAuth uygulamaları projeleri veya görevleri silemez: silme işlemi, bir kişinin onayladığı web uygulamasında kalır. Yanlış kimliği hedefleyen bir betik planı silemez.

Üçüncü taraf uygulamalar için OAuth 2.1

Başkaları adına hareket eden uygulamalar OAuth 2.1 kullanır: PKCE (S256) ile yetkilendirme kodu, her kullanımda yenilenen yenileme belirteçleri, dinamik istemci kaydı (RFC 7591). https://planitude.app/api kaynağını ve planitude:read veya planitude:write kapsamını isteyin.

Uç noktalar standart keşif belgelerinde yayımlanır; bu sayede OAuth kitaplıkları kendini yapılandırır.

  • https://planitude.app/.well-known/oauth-authorization-server
  • https://planitude.app/.well-known/oauth-protected-resource

İyi uygulamalar

  • Anahtarları ortam değişkenlerinde veya bir gizli bilgi yöneticisinde saklayın; asla kodda veya bir depoda değil. Anahtarlar gnt_ ile başladığından, gizli bilgi tarayıcıları bunları tespit edebilir.
  • Yalnızca okuyorsanız salt okunur bir anahtar kullanın ve her entegrasyon için ayrı bir anahtar kullanın: diğerlerini durdurmadan birini iptal edebilirsiniz.
  • Betiklerin kullandığı anahtarlara son kullanma tarihi verin ve düzenli olarak yenileyin.
  • API'yi tarayıcıdan değil, sunucunuzdan çağırın: ön yüz kodundaki bir anahtar herkese açık bir anahtardır.
Bearercurl
curl https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
OAuth 2.1/.well-known/oauth-authorization-server
{
  "issuer": "https://planitude.app",
  "authorization_endpoint": "https://planitude.app/oauth/authorize",
  "token_endpoint": "https://planitude.app/api/oauth/token",
  "registration_endpoint": "https://planitude.app/api/oauth/register",
  "revocation_endpoint": "https://planitude.app/api/oauth/revoke",
  "scopes_supported": [
    "planitude:read",
    "planitude:write"
  ],
  "grant_types_supported": [
    "authorization_code",
    "refresh_token"
  ],
  "code_challenge_methods_supported": [
    "S256"
  ]
}

Hatalar

Planitude standart HTTP durum kodlarını kullanır. Hatalar her zaman aynı JSON yapısındadır: dallanma için kararlı bir error kodu ve gerektiğinde gerekçeyi veya düzeltilecek alanları içeren details.

DurumAnlamı
400invalid_requestİstek geçerli değil: details.fields, her alanı ve sorunu listeler.
401unauthorizedAnahtar eksik, geçersiz, iptal edilmiş veya süresi dolmuş.
403forbiddenAnahtar veya rolünüz buna izin vermiyor (details.reason); örneğin salt okunur anahtarla yazma veya silme.
404not_foundBulunamadı veya size görünür değil.
409dependency_cyclePlanla çakışma; örneğin bir döngü oluşturacak bir bağımlılık (dependency_cycle).
429rate_limitedÇok fazla istek: Retry-After içindeki saniye kadar bekleyin.
500server_errorBizim tarafımızda bir sorun oluştu: üstel geri çekilmeyle yeniden deneyin.

Error

AlanTürAçıklama
error
zorunlu
stringStable error code: invalid_request, unauthorized, forbidden, not_found, conflict, dependency_cycle, limit_exceeded, rate_limited, server_error, ...
detailsobject
Yanıt
{
  "error": "invalid_request",
  "details": {
    "fields": [
      {
        "path": "name",
        "message": "Invalid input: expected string, received undefined"
      },
      {
        "path": "durationMin",
        "message": "Too small: expected number to be >=0"
      }
    ]
  }
}

İstek sınırları

Sınırlar anahtar başına, bir dakikalık kayan pencerede uygulanır: 240 okuma isteği ve 60 yazma isteği. Sınır aşıldığında, saniye cinsinden bir Retry-After üst bilgisiyle 429 rate_limited alırsınız.

Yeniden denemeden önce Retry-After süresini bekleyin, toplu işleri zamana yayın ve çok sayıda değişikliği tek bir değişiklik kümesinde toplayın: tek istekte ve tek yeniden hesaplamada en fazla 1.000 değişiklik.

YanıtHTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json

{
  "error": "rate_limited",
  "details": {
    "retryAfterSec": 12
  }
}

Sayfalama ve arama

Görev listeleri imleçle sayfalanır. limit (1–500, varsayılan 100) değerini ve sonraki sayfa için önceki yanıttaki nextCursor değerini cursor olarak iletin. nextCursor değeri null olduğunda başka sayfa yoktur.

externalId (kendi kimliğinizde tam eşleşme), q (ad şunu içerir), updatedSince ve completed ile filtreleyin; sort=-number (en yeni önce) veya -updatedAt ile sıralayın. Projeler, üyeler ve bağımlılıklar gibi daha kısa listeler tek yanıtta bütün olarak gelir.

İstek
curl "https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks?limit=500" \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"

# next page: pass the nextCursor of the previous response
curl "https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks?limit=500&cursor=$NEXT_CURSOR" \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"

Sürümleme

API ve webhook yükleri tarihe göre sürümlenir. Geçerli sürüm 2026-10-01'dır: her olayın apiVersion alanı ve OpenAPI belgesinin info.version değeridir.

Bir sürüm içinde yalnızca ekleme yaparız: yeni uç noktalar, yeni isteğe bağlı alanlar, yeni olay türleri. Alanlar yeni sürüm olmadan asla kaldırılmaz veya türü değiştirilmez; bu yüzden bilmediğiniz alanları yok sayın.

İstek
curl https://planitude.app/api/webhooks/events
Yanıt200 OK
{
  "apiVersion": "2026-10-01",
  "events": [
    "project.created",
    "project.updated",
    "project.deleted",
    "task.created",
    "task.updated",
    "task.deleted",
    "task.completed",
    "task.dates_changed",
    "dependency.created",
    "dependency.deleted",
    "baseline.saved",
    "member.invited",
    "member.joined",
    "comment.created"
  ]
}

API başvurusu

Account

Who is calling, and their workspaces.

User

Öznitelikler

AlanTürAçıklama
idstring (uuid)
emailstring (email)
namestringboş olabilir
avatarUrlstringboş olabilir
localestring
emailVerifiedboolean
NesnelerUser
{
  "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "email": "[email protected]",
  "name": "Anna Rossi",
  "avatarUrl": null,
  "locale": "en",
  "emailVerified": true
}

Workspace

Öznitelikler

AlanTürAçıklama
idstring (uuid)
namestring
rolestring

Şunlardan biri: owner, admin, member

NesnelerWorkspace
{
  "id": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "name": "Acme Construction",
  "role": "owner"
}

Current user (connection test)

GET/api/auth/me

Okuma erişimli anahtar

Döndürür

200 OK The user

AlanTürAçıklama
userUser
İstek
curl https://planitude.app/api/auth/me \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "user": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "email": "[email protected]",
    "name": "Anna Rossi",
    "avatarUrl": null,
    "locale": "en",
    "emailVerified": true
  }
}

Workspaces of the user, with role

GET/api/workspaces

Okuma erişimli anahtar

Döndürür

200 OK Workspaces

AlanTürAçıklama
workspacesarray of Workspace
İstek
curl https://planitude.app/api/workspaces \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "workspaces": [
    {
      "id": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "name": "Acme Construction",
      "role": "owner"
    }
  ]
}

API başvurusu

Projects

Projects, templates and baselines.

Project

A project as returned by the write endpoints and project listings.

Öznitelikler

AlanTürAçıklama
idstring (uuid)
workspaceIdstring (uuid)
keystringProject key, e.g. CRON (task keys are CRON-12).
keyLockedboolean
namestring
descriptionstringboş olabilir
startDatestring (date)
calendarIdstring (uuid)boş olabilir
currencystring
scheduleFromstring

Şunlardan biri: forward, backward

deadlinestring (date)boş olabilir
colorstringboş olabilir
settingsobject
archivedAtstring (date-time)boş olabilir
createdBystring (uuid)boş olabilir
createdAtstring (date-time)
updatedAtstring (date-time)
NesnelerProject
{
  "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "key": "WHX",
  "keyLocked": false,
  "name": "Warehouse expansion",
  "description": null,
  "startDate": "2026-10-05",
  "calendarId": null,
  "currency": "EUR",
  "scheduleFrom": "forward",
  "deadline": null,
  "color": null,
  "settings": {},
  "archivedAt": null,
  "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "createdAt": "2026-10-01T08:30:12.418Z",
  "updatedAt": "2026-10-01T08:30:12.418Z"
}

Template

Öznitelikler

AlanTürAçıklama
idstringbuiltin:<slug> or the id of a template saved by you.
kindstring

Şunlardan biri: builtin, user

namestring
descriptionstringboş olabilir
taskCountinteger
durationDaysintegerWorking days from start to finish.
NesnelerTemplate
{
  "id": "builtin:website-launch",
  "kind": "builtin",
  "name": "Website launch",
  "description": "From discovery to go-live: design, content, development, testing and launch.",
  "taskCount": 12,
  "durationDays": 43
}

Baseline

Öznitelikler

AlanTürAçıklama
idstring (uuid)
namestring
indexintegerboş olabilirNumbered MS Project baseline (1-10); null for the main baseline and the ones you name.
capturedAtstring (date-time)
capturedBystring (uuid)boş olabilir
taskCountinteger
NesnelerBaseline
{
  "id": "b5d68d05-0640-48f9-8eeb-ed7804f4a116",
  "name": "Plan v1",
  "index": null,
  "capturedAt": "2026-10-01T08:30:12.418Z",
  "capturedBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "taskCount": 12
}

List projects

GET/api/projects

Okuma erişimli anahtar

All projects visible to the user (not paginated). ?archived=1 includes archived ones.

Sorgu parametreleri

AlanTürAçıklama
archivedstring

Şunlardan biri: 1

Döndürür

200 OK Projects

AlanTürAçıklama
projectsarray of Project
İstek
curl https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "projects": [
    {
      "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
      "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "key": "WHX",
      "keyLocked": false,
      "name": "Warehouse expansion",
      "description": null,
      "startDate": "2026-10-05",
      "calendarId": null,
      "currency": "EUR",
      "scheduleFrom": "forward",
      "deadline": null,
      "color": null,
      "settings": {},
      "archivedAt": null,
      "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "createdAt": "2026-10-01T08:30:12.418Z",
      "updatedAt": "2026-10-01T08:30:12.418Z",
      "workspaceName": "Acme Construction",
      "role": "owner",
      "taskCount": 12,
      "finishAt": "2026-10-07T15:00:00.000Z"
    }
  ]
}

Create a project

POST/api/projects

Yazma erişimli anahtar

İstek gövdesi

AlanTürAçıklama
name
zorunlu
string
workspaceIdstring (uuid)Defaults to your personal workspace.
keystring2-5 letters/digits, starts with a letter. Derived from the name if omitted.
descriptionstringboş olabilir
startDatestring (date)
deadlinestring (date)boş olabilir
currencystring
scheduleFromstring

Şunlardan biri: forward, backward

colorstringboş olabilir

Döndürür

201 Created Created

AlanTürAçıklama
projectProject
İstek
curl -X POST https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Warehouse expansion","startDate":"2026-10-05","currency":"EUR"}'
Yanıt201 Created
{
  "project": {
    "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "key": "WHX",
    "keyLocked": false,
    "name": "Warehouse expansion",
    "description": null,
    "startDate": "2026-10-05",
    "calendarId": null,
    "currency": "EUR",
    "scheduleFrom": "forward",
    "deadline": null,
    "color": null,
    "settings": {},
    "archivedAt": null,
    "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z"
  }
}

Create a project from a template

POST/api/projects/from-template

Yazma erişimli anahtar

İstek gövdesi

AlanTürAçıklama
templateId
zorunlu
stringId from GET /api/templates.
startDate
zorunlu
string (date)
namestring
keystring
localestringLanguage of the template texts (en, it, es, fr, de, pt, nl, pl, ja, zh, sv, da, no, fi, cs, ro, uk, tr, ar, he, hi, id, vi, ko).
tzstringIANA time zone of the project calendar.
workspaceIdstring (uuid)

Döndürür

201 Created Created

AlanTürAçıklama
projectProject
taskCountinteger
conflictsarray of Conflict
İstek
curl -X POST https://planitude.app/api/projects/from-template \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "templateId": "builtin:website-launch",
  "startDate": "2026-10-05",
  "name": "Website relaunch",
  "locale": "en"
}'
Yanıt201 Created
{
  "project": {
    "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "key": "WHX",
    "keyLocked": false,
    "name": "Warehouse expansion",
    "description": null,
    "startDate": "2026-10-05",
    "calendarId": null,
    "currency": "EUR",
    "scheduleFrom": "forward",
    "deadline": null,
    "color": null,
    "settings": {},
    "archivedAt": null,
    "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z"
  },
  "taskCount": 12,
  "conflicts": []
}

List project templates

GET/api/templates

Okuma erişimli anahtar

Sorgu parametreleri

AlanTürAçıklama
localestring

Döndürür

200 OK Templates

AlanTürAçıklama
templatesarray of Template
İstek
curl https://planitude.app/api/templates \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "templates": [
    {
      "id": "builtin:website-launch",
      "kind": "builtin",
      "name": "Website launch",
      "description": "From discovery to go-live: design, content, development, testing and launch.",
      "taskCount": 12,
      "durationDays": 43
    }
  ]
}

Full project (tasks tree, dependencies, resources, members, baselines)

GET/api/projects/{projectId}

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

Döndürür

200 OK Project

AlanTürAçıklama
projectProject
tasksarray of Task
dependenciesarray of Dependency
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "project": {
    "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "key": "WHX",
    "keyLocked": false,
    "name": "Warehouse expansion",
    "description": null,
    "startDate": "2026-10-05",
    "calendarId": null,
    "currency": "EUR",
    "scheduleFrom": "forward",
    "deadline": null,
    "color": null,
    "settings": {},
    "archivedAt": null,
    "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z"
  },
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ]
}

Update a project

PATCH/api/projects/{projectId}

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

İstek gövdesi

AlanTürAçıklama
namestring
descriptionstringboş olabilir
startDatestring (date)
deadlinestring (date)boş olabilir
currencystring
scheduleFromstring

Şunlardan biri: forward, backward

colorstringboş olabilir
archivedboolean

Döndürür

200 OK Updated

AlanTürAçıklama
projectProject
conflictsarray of Conflict
rescheduledbooleanThe schedule was recalculated (start date, calendar or direction changed).
İstek
curl -X PATCH https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"deadline":"2026-12-18"}'
Yanıt200 OK
{
  "project": {
    "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "key": "WHX",
    "keyLocked": false,
    "name": "Warehouse expansion",
    "description": null,
    "startDate": "2026-10-05",
    "calendarId": null,
    "currency": "EUR",
    "scheduleFrom": "forward",
    "deadline": null,
    "color": null,
    "settings": {},
    "archivedAt": null,
    "createdBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z"
  },
  "conflicts": [],
  "rescheduled": false
}

List baselines

GET/api/projects/{projectId}/baseline

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

Döndürür

200 OK Baselines

AlanTürAçıklama
baselinesarray of Baseline
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/baseline \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "baselines": [
    {
      "id": "b5d68d05-0640-48f9-8eeb-ed7804f4a116",
      "name": "Plan v1",
      "index": null,
      "capturedAt": "2026-10-01T08:30:12.418Z",
      "capturedBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "taskCount": 12
    }
  ]
}

Save a baseline

POST/api/projects/{projectId}/baseline

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

İstek gövdesi

AlanTürAçıklama
namestring

Döndürür

201 Created Saved

AlanTürAçıklama
baselineBaseline
İstek
curl -X POST https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/baseline \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Plan v1"}'
Yanıt201 Created
{
  "baseline": {
    "id": "b5d68d05-0640-48f9-8eeb-ed7804f4a116",
    "name": "Plan v1",
    "index": null,
    "capturedAt": "2026-10-01T08:30:12.418Z",
    "capturedBy": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "taskCount": 12
  }
}

API başvurusu

Tasks

Tasks, search by external id, comments.

Task

Task representation of GET /tasks and webhook payloads: the stored task (without sortKey) plus project, assignees and link.

Öznitelikler

AlanTürAçıklama
idstring (uuid)
numberintegerSequential number in the project, never reused.
keystringHuman key, e.g. CRON-12.
parentIdstring (uuid)boş olabilir
namestring
typestring

Şunlardan biri: summary, task, milestone

durationMinintegerDuration in working minutes (8h day = 480).
workMininteger
progressPctnumber
constraintKindstring

Şunlardan biri: asap, alap, start_no_earlier_than, start_no_later_than, finish_no_earlier_than, finish_no_later_than, must_start_on, must_finish_on

constraintDatestring (date-time)boş olabilir
deadlinestring (date-time)boş olabilir
calendarIdstring (uuid)boş olabilir
costFixednumber
notesstringboş olabilir
colorstringboş olabilir
wbsstringboş olabilir
externalIdstringboş olabilirYour identifier for this task in another system. Searchable with GET /tasks?externalId=.
startAtstring (date-time)boş olabilirComputed start.
finishAtstring (date-time)boş olabilirComputed finish.
isCriticalbooleanOn the critical path.
totalFloatMinintegerboş olabilirTotal float (slack) in working minutes.
earlyStartAtstring (date-time)boş olabilir
lateFinishAtstring (date-time)boş olabilir
actualStartAtstring (date-time)boş olabilir
actualFinishAtstring (date-time)boş olabilir
actualDurationMinintegerboş olabilir
remainingDurationMinintegerboş olabilir
manuallyScheduledboolean
levelingDelayMininteger
taskTypestring

Şunlardan biri: fixed_units, fixed_duration, fixed_work, fixed_duration_and_units

effortDrivenboolean
durationOptimisticMinintegerboş olabilir
durationPessimisticMinintegerboş olabilir
projectIdstring (uuid)
completedbooleanprogressPct = 100.
assigneesarray of Assignee
urlstring (uri)Page of the task in the web app.
NesnelerTask
{
  "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
  "number": 1,
  "key": "WHX-1",
  "parentId": null,
  "name": "Foundations",
  "type": "task",
  "durationMin": 1440,
  "workMin": 0,
  "progressPct": 0,
  "constraintKind": "asap",
  "constraintDate": null,
  "deadline": null,
  "calendarId": null,
  "costFixed": 0,
  "notes": null,
  "color": null,
  "wbs": null,
  "externalId": "crm-4711",
  "startAt": "2026-10-05T06:00:00.000Z",
  "finishAt": "2026-10-07T15:00:00.000Z",
  "isCritical": true,
  "totalFloatMin": 0,
  "earlyStartAt": "2026-10-05T06:00:00.000Z",
  "lateFinishAt": "2026-10-07T15:00:00.000Z",
  "actualStartAt": null,
  "actualFinishAt": null,
  "actualDurationMin": null,
  "remainingDurationMin": null,
  "manuallyScheduled": false,
  "levelingDelayMin": 0,
  "taskType": "fixed_units",
  "effortDriven": false,
  "durationOptimisticMin": null,
  "durationPessimisticMin": null,
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "completed": false,
  "assignees": [
    {
      "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
      "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi",
      "unitsPct": 100
    }
  ],
  "url": "https://planitude.app/app/t/WHX-1"
}

WriteResult

Öznitelikler

AlanTürAçıklama
tasksarray of TaskCreated/updated tasks plus the ones the recalculation moved.
deletedTaskIdsarray of string
dependenciesarray of Dependency
deletedDependencyIdsarray of string
conflictsarray of Conflict
projectStartAtstring (date-time)
projectFinishAtstring (date-time)
statsobject
stats alanlarını göster
AlanTürAçıklama
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
NesnelerWriteResult
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "deletedTaskIds": [],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ],
  "deletedDependencyIds": [],
  "conflicts": [],
  "projectStartAt": "2026-10-05T06:00:00.000Z",
  "projectFinishAt": "2026-10-07T15:00:00.000Z",
  "stats": {
    "taskCount": 12,
    "recomputedCount": 3,
    "savedCount": 2,
    "durationMs": 39
  }
}

Comment

Öznitelikler

AlanTürAçıklama
idstring (uuid)
taskIdstring (uuid)
userIdstring (uuid)
authorNamestring
authorAvatarUrlstringboş olabilir
bodystring
mentionsarray of string
createdAtstring (date-time)
editedAtstring (date-time)boş olabilir
NesnelerComment
{
  "id": "0fc2dec5-a409-47c9-9c6e-0663e8f8bcf3",
  "taskId": "4dbd104a-00cd-4035-8955-255f52ea586a",
  "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "authorName": "Anna Rossi",
  "authorAvatarUrl": null,
  "body": "Concrete delivered, we can start the walls.",
  "mentions": [],
  "createdAt": "2026-10-01T08:30:12.418Z",
  "editedAt": null
}

List or search tasks (paginated)

GET/api/projects/{projectId}/tasks

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

Sorgu parametreleri

AlanTürAçıklama
limitinteger1-500.

Varsayılan: 100

cursorstringnextCursor of the previous page.
sortstring-number = newest first (polling triggers). -updatedAt returns the first page only.

Şunlardan biri: number, -number, -updatedAt

Varsayılan: number

externalIdstringExact match on externalId.
qstringName contains (case-insensitive).
updatedSincestring (date-time)
completedstring

Şunlardan biri: true, false

Döndürür

200 OK A page of tasks

AlanTürAçıklama
tasksarray of Task
nextCursorstringboş olabilir
İstek
curl "https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks?externalId=crm-4711" \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null,
      "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
      "completed": false,
      "assignees": [
        {
          "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
          "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
          "name": "Anna Rossi",
          "unitsPct": 100
        }
      ],
      "url": "https://planitude.app/app/t/WHX-1"
    }
  ],
  "nextCursor": null
}

Create a task, or apply a change set

POST/api/projects/{projectId}/tasks

Yazma erişimli anahtar

Send a TaskCreate to create one task (201), or a ChangeSet to apply several changes in one transaction (200). Dates are recalculated by the scheduling engine.

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

İstek gövdesi

TaskCreate

AlanTürAçıklama
name
zorunlu
string
parentIdstring (uuid)boş olabilirParent (summary) task; null = top level.
afterTaskIdstring (uuid)boş olabilirInsert after this sibling.
beforeTaskIdstring (uuid)boş olabilirInsert before this sibling.
typestring

Şunlardan biri: summary, task, milestone

durationMinintegerDuration in working minutes (8h day = 480).
workMininteger
progressPctnumber
constraintKindstring

Şunlardan biri: asap, alap, start_no_earlier_than, start_no_later_than, finish_no_earlier_than, finish_no_later_than, must_start_on, must_finish_on

constraintDatestring (date-time)boş olabilir
deadlinestring (date-time)boş olabilir
calendarIdstring (uuid)boş olabilir
costFixednumber
notesstringboş olabilir
colorstringboş olabilir
wbsstringboş olabilir
externalIdstringboş olabilirYour identifier for this task in another system. Searchable with GET /tasks?externalId=.

veya ChangeSet

AlanTürAçıklama
createTasksarray of TaskCreate
updateTasksarray of any
createDependenciesarray of DependencyCreate
deleteDependencyIdsarray of string
fullRescheduleboolean

Döndürür

201 Created Task created

AlanTürAçıklama
tasksarray of TaskCreated/updated tasks plus the ones the recalculation moved.
deletedTaskIdsarray of string
dependenciesarray of Dependency
deletedDependencyIdsarray of string
conflictsarray of Conflict
projectStartAtstring (date-time)
projectFinishAtstring (date-time)
statsobject
stats alanlarını göster
AlanTürAçıklama
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
İstek
curl -X POST https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Foundations","durationMin":1440,"externalId":"crm-4711"}'
Yanıt201 Created
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "deletedTaskIds": [],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ],
  "deletedDependencyIds": [],
  "conflicts": [],
  "projectStartAt": "2026-10-05T06:00:00.000Z",
  "projectFinishAt": "2026-10-07T15:00:00.000Z",
  "stats": {
    "taskCount": 12,
    "recomputedCount": 3,
    "savedCount": 2,
    "durationMs": 39
  }
}

Get a task

GET/api/projects/{projectId}/tasks/{taskId}

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
taskId
zorunlu
string (uuid)Task id.

Döndürür

200 OK The task

AlanTürAçıklama
taskTask
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "task": {
    "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
    "number": 1,
    "key": "WHX-1",
    "parentId": null,
    "name": "Foundations",
    "type": "task",
    "durationMin": 1440,
    "workMin": 0,
    "progressPct": 0,
    "constraintKind": "asap",
    "constraintDate": null,
    "deadline": null,
    "calendarId": null,
    "costFixed": 0,
    "notes": null,
    "color": null,
    "wbs": null,
    "externalId": "crm-4711",
    "startAt": "2026-10-05T06:00:00.000Z",
    "finishAt": "2026-10-07T15:00:00.000Z",
    "isCritical": true,
    "totalFloatMin": 0,
    "earlyStartAt": "2026-10-05T06:00:00.000Z",
    "lateFinishAt": "2026-10-07T15:00:00.000Z",
    "actualStartAt": null,
    "actualFinishAt": null,
    "actualDurationMin": null,
    "remainingDurationMin": null,
    "manuallyScheduled": false,
    "levelingDelayMin": 0,
    "taskType": "fixed_units",
    "effortDriven": false,
    "durationOptimisticMin": null,
    "durationPessimisticMin": null,
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "completed": false,
    "assignees": [
      {
        "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
        "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
        "name": "Anna Rossi",
        "unitsPct": 100
      }
    ],
    "url": "https://planitude.app/app/t/WHX-1"
  }
}

Update a task

PATCH/api/projects/{projectId}/tasks/{taskId}

Yazma erişimli anahtar

Only the fields you send change; null clears a field.

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
taskId
zorunlu
string (uuid)Task id.

İstek gövdesi

AlanTürAçıklama
namestring
typestring

Şunlardan biri: summary, task, milestone

durationMinintegerDuration in working minutes (8h day = 480).
workMininteger
progressPctnumber
constraintKindstring

Şunlardan biri: asap, alap, start_no_earlier_than, start_no_later_than, finish_no_earlier_than, finish_no_later_than, must_start_on, must_finish_on

constraintDatestring (date-time)boş olabilir
deadlinestring (date-time)boş olabilir
calendarIdstring (uuid)boş olabilir
costFixednumber
notesstringboş olabilir
colorstringboş olabilir
wbsstringboş olabilir
externalIdstringboş olabilirYour identifier for this task in another system. Searchable with GET /tasks?externalId=.
placementobject
placement alanlarını göster
AlanTürAçıklama
parentIdstring (uuid)boş olabilirParent (summary) task; null = top level.
afterTaskIdstring (uuid)boş olabilirInsert after this sibling.
beforeTaskIdstring (uuid)boş olabilirInsert before this sibling.

Döndürür

200 OK Updated

AlanTürAçıklama
tasksarray of TaskCreated/updated tasks plus the ones the recalculation moved.
deletedTaskIdsarray of string
dependenciesarray of Dependency
deletedDependencyIdsarray of string
conflictsarray of Conflict
projectStartAtstring (date-time)
projectFinishAtstring (date-time)
statsobject
stats alanlarını göster
AlanTürAçıklama
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
İstek
curl -X PATCH https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"progressPct":100}'
Yanıt200 OK
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "deletedTaskIds": [],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ],
  "deletedDependencyIds": [],
  "conflicts": [],
  "projectStartAt": "2026-10-05T06:00:00.000Z",
  "projectFinishAt": "2026-10-07T15:00:00.000Z",
  "stats": {
    "taskCount": 12,
    "recomputedCount": 3,
    "savedCount": 2,
    "durationMs": 39
  }
}

Comments of a task

GET/api/projects/{projectId}/tasks/{taskId}/comments

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
taskId
zorunlu
string (uuid)Task id.

Döndürür

200 OK Comments

AlanTürAçıklama
commentsarray of Comment
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a/comments \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "comments": [
    {
      "id": "0fc2dec5-a409-47c9-9c6e-0663e8f8bcf3",
      "taskId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "authorName": "Anna Rossi",
      "authorAvatarUrl": null,
      "body": "Concrete delivered, we can start the walls.",
      "mentions": [],
      "createdAt": "2026-10-01T08:30:12.418Z",
      "editedAt": null
    }
  ]
}

Comment on a task

POST/api/projects/{projectId}/tasks/{taskId}/comments

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
taskId
zorunlu
string (uuid)Task id.

İstek gövdesi

AlanTürAçıklama
body
zorunlu
stringPlain text.
mentionsarray of stringUser ids to notify.

Döndürür

201 Created Created

AlanTürAçıklama
commentComment
İstek
curl -X POST https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a/comments \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"Concrete delivered, we can start the walls."}'
Yanıt201 Created
{
  "comment": {
    "id": "0fc2dec5-a409-47c9-9c6e-0663e8f8bcf3",
    "taskId": "4dbd104a-00cd-4035-8955-255f52ea586a",
    "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "authorName": "Anna Rossi",
    "authorAvatarUrl": null,
    "body": "Concrete delivered, we can start the walls.",
    "mentions": [],
    "createdAt": "2026-10-01T08:30:12.418Z",
    "editedAt": null
  }
}

API başvurusu

Dependencies

Links between tasks (FS, SS, FF, SF, with lag).

Dependency

Öznitelikler

AlanTürAçıklama
idstring (uuid)
predecessorIdstring (uuid)
successorIdstring (uuid)
typestring

Şunlardan biri: FS, SS, FF, SF

lagMinintegerWorking minutes; negative = lead.
NesnelerDependency
{
  "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
  "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
  "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
  "type": "FS",
  "lagMin": 0
}

List dependencies

GET/api/projects/{projectId}/dependencies

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

Döndürür

200 OK Dependencies

AlanTürAçıklama
dependenciesarray of Dependency
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/dependencies \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ]
}

Create (or update) a dependency

POST/api/projects/{projectId}/dependencies

Yazma erişimli anahtar

A dependency that would close a cycle is refused with 409 dependency_cycle.

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

İstek gövdesi

DependencyCreate

AlanTürAçıklama
predecessorId
zorunlu
string (uuid)
successorId
zorunlu
string (uuid)
typestring

Şunlardan biri: FS, SS, FF, SF

Varsayılan: FS

lagMininteger

Varsayılan: 0

veya dependencies

AlanTürAçıklama
dependencies
zorunlu
array of DependencyCreate

Döndürür

201 Created Created

AlanTürAçıklama
tasksarray of TaskCreated/updated tasks plus the ones the recalculation moved.
deletedTaskIdsarray of string
dependenciesarray of Dependency
deletedDependencyIdsarray of string
conflictsarray of Conflict
projectStartAtstring (date-time)
projectFinishAtstring (date-time)
statsobject
stats alanlarını göster
AlanTürAçıklama
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
İstek
curl -X POST https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/dependencies \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
  "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
  "type": "FS",
  "lagMin": 0
}'
Yanıt201 Created
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "deletedTaskIds": [],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ],
  "deletedDependencyIds": [],
  "conflicts": [],
  "projectStartAt": "2026-10-05T06:00:00.000Z",
  "projectFinishAt": "2026-10-07T15:00:00.000Z",
  "stats": {
    "taskCount": 12,
    "recomputedCount": 3,
    "savedCount": 2,
    "durationMs": 39
  }
}

Remove a dependency

DEL/api/projects/{projectId}/dependencies/{dependencyId}

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
dependencyId
zorunlu
string (uuid)

Döndürür

200 OK Removed

AlanTürAçıklama
tasksarray of TaskCreated/updated tasks plus the ones the recalculation moved.
deletedTaskIdsarray of string
dependenciesarray of Dependency
deletedDependencyIdsarray of string
conflictsarray of Conflict
projectStartAtstring (date-time)
projectFinishAtstring (date-time)
statsobject
stats alanlarını göster
AlanTürAçıklama
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
İstek
curl -X DELETE https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/dependencies/9ba5faf8-923d-4ecc-86f0-f245c5d179db \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "tasks": [
    {
      "id": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "number": 1,
      "key": "WHX-1",
      "parentId": null,
      "sortKey": "i",
      "name": "Foundations",
      "type": "task",
      "durationMin": 1440,
      "workMin": 0,
      "progressPct": 0,
      "constraintKind": "asap",
      "constraintDate": null,
      "deadline": null,
      "calendarId": null,
      "costFixed": 0,
      "notes": null,
      "color": null,
      "wbs": null,
      "externalId": "crm-4711",
      "startAt": "2026-10-05T06:00:00.000Z",
      "finishAt": "2026-10-07T15:00:00.000Z",
      "isCritical": true,
      "totalFloatMin": 0,
      "earlyStartAt": "2026-10-05T06:00:00.000Z",
      "lateFinishAt": "2026-10-07T15:00:00.000Z",
      "actualStartAt": null,
      "actualFinishAt": null,
      "actualDurationMin": null,
      "remainingDurationMin": null,
      "manuallyScheduled": false,
      "levelingDelayMin": 0,
      "taskType": "fixed_units",
      "effortDriven": false,
      "durationOptimisticMin": null,
      "durationPessimisticMin": null
    }
  ],
  "deletedTaskIds": [],
  "dependencies": [
    {
      "id": "9ba5faf8-923d-4ecc-86f0-f245c5d179db",
      "predecessorId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "successorId": "a22fd799-c4dc-4869-a466-0dd6e96f71ce",
      "type": "FS",
      "lagMin": 0
    }
  ],
  "deletedDependencyIds": [],
  "conflicts": [],
  "projectStartAt": "2026-10-05T06:00:00.000Z",
  "projectFinishAt": "2026-10-07T15:00:00.000Z",
  "stats": {
    "taskCount": 12,
    "recomputedCount": 3,
    "savedCount": 2,
    "durationMs": 39
  }
}

API başvurusu

People

Project members and task assignees.

Member

Öznitelikler

AlanTürAçıklama
userIdstring (uuid)
namestring
emailstring
rolestringEffective role on the project.

Şunlardan biri: owner, editor, viewer

directRolestringboş olabilirRole granted on the project itself (null = only through the workspace).

Şunlardan biri: owner, editor, viewer

inheritedbooleanAccess comes from the workspace.
resourceIdstring (uuid)boş olabilirResource used when the person is assigned to tasks.
addedAtstring (date-time)
avatarUrlstringboş olabilir
NesnelerMember
{
  "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "name": "Anna Rossi",
  "email": "[email protected]",
  "role": "owner",
  "directRole": null,
  "inherited": false,
  "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
  "addedAt": "2026-10-01T08:30:12.418Z",
  "avatarUrl": null
}

Assignee

Öznitelikler

AlanTürAçıklama
resourceIdstring (uuid)
userIdstring (uuid)boş olabilir
namestring
unitsPctinteger
NesnelerAssignee
{
  "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
  "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "name": "Anna Rossi",
  "unitsPct": 100
}

Replace the people assigned to a task

PUT/api/projects/{projectId}/tasks/{taskId}/assignees

Yazma erişimli anahtar

userIds must be members of the project (GET /members). An empty list removes everyone. Optional resourceIds replaces the people imported from a file (resources without an account) assigned to the task; omit it to leave them as they are.

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.
taskId
zorunlu
string (uuid)Task id.

İstek gövdesi

AlanTürAçıklama
userIds
zorunlu
array of string
resourceIdsarray of string

Döndürür

200 OK Assignees saved

AlanTürAçıklama
taskIdstring (uuid)
assignmentsarray of object
assignments alanlarını göster
AlanTürAçıklama
idstring (uuid)
taskIdstring (uuid)
resourceIdstring (uuid)
unitsPctinteger
workMininteger
resourcesarray of object
resources alanlarını göster
AlanTürAçıklama
idstring (uuid)
userIdstring (uuid)boş olabilir
namestring
kindstring

Şunlardan biri: work, material, cost

emailstringboş olabilir
costPerHournumber
costPerUsenumber
capacityPctinteger
calendarIdstring (uuid)boş olabilir
colorstringboş olabilir
avatarUrlstringboş olabilir
needsRescheduleboolean
conflictsarray of Conflict
İstek
curl -X PUT https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a/assignees \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userIds":["b1666432-132a-4ea9-b1ae-76ea69e226c5"]}'
Yanıt200 OK
{
  "taskId": "4dbd104a-00cd-4035-8955-255f52ea586a",
  "assignments": [
    {
      "id": "e62ac96b-e68e-40d3-842e-335e27dfd099",
      "taskId": "4dbd104a-00cd-4035-8955-255f52ea586a",
      "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
      "unitsPct": 100,
      "workMin": 0
    }
  ],
  "resources": [
    {
      "id": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
      "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi",
      "kind": "builtin",
      "email": "[email protected]",
      "costPerHour": 0,
      "costPerUse": 0,
      "capacityPct": 0,
      "calendarId": null,
      "color": null,
      "avatarUrl": null
    }
  ],
  "needsReschedule": false,
  "conflicts": []
}

People with access to the project (assignable)

GET/api/projects/{projectId}/members

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
projectId
zorunlu
string (uuid)Project id.

Döndürür

200 OK Members

AlanTürAçıklama
membersarray of Member
rolestring
İstek
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/members \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "members": [
    {
      "userId": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi",
      "email": "[email protected]",
      "role": "owner",
      "directRole": null,
      "inherited": false,
      "resourceId": "0c6a8f52-3d7e-4b19-9a4e-6f1d2c8b7e30",
      "addedAt": "2026-10-01T08:30:12.418Z",
      "avatarUrl": null
    }
  ],
  "role": "owner"
}

API başvurusu

Webhooks

Outgoing webhook subscriptions (REST hooks: subscribe/unsubscribe).

Webhook

Öznitelikler

AlanTürAçıklama
idstring (uuid)
workspaceIdstring (uuid)
workspaceNamestring
projectIdstring (uuid)boş olabilirnull = every project of the workspace.
projectNamestringboş olabilir
namestring
urlstring (uri)
eventsarray of string

Şunlardan biri: project.created, project.updated, project.deleted, task.created, task.updated, task.deleted, task.completed, task.dates_changed, dependency.created, dependency.deleted, baseline.saved, member.invited, member.joined, comment.created

secretPrefixstringFirst characters of the signing secret (not secret).
activeboolean
disabledReasonstringboş olabilir

Şunlardan biri: failures, gone, project_deleted, user

disabledAtstring (date-time)boş olabilir
consecutiveFailuresinteger
viaApibooleanCreated with the API (REST hook) rather than from the profile.
createdByobjectboş olabilir
createdBy alanlarını göster
AlanTürAçıklama
idstring (uuid)
namestringboş olabilir
createdAtstring (date-time)
updatedAtstring (date-time)
lastDeliveryAtstring (date-time)boş olabilir
lastSuccessAtstring (date-time)boş olabilir
NesnelerWebhook
{
  "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "workspaceName": "Acme Construction",
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "projectName": "Warehouse expansion",
  "name": "Warehouse sync",
  "url": "https://example.com/hooks/planitude",
  "events": [
    "task.created",
    "task.completed"
  ],
  "secretPrefix": "whsec_Fdwl",
  "active": true,
  "disabledReason": null,
  "disabledAt": null,
  "consecutiveFailures": 0,
  "viaApi": true,
  "createdBy": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "name": "Anna Rossi"
  },
  "createdAt": "2026-10-01T08:30:12.418Z",
  "updatedAt": "2026-10-01T08:30:12.418Z",
  "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
  "lastSuccessAt": "2026-10-01T08:30:12.418Z"
}

Delivery

Öznitelikler

AlanTürAçıklama
idstring (uuid)
eventIdstring (uuid)
eventTypestring
statusstring

Şunlardan biri: pending, success, failed, cancelled

attemptsinteger
nextAttemptAtstring (date-time)boş olabilir
lastAttemptAtstring (date-time)boş olabilir
responseStatusintegerboş olabilir
responseExcerptstringboş olabilir
errorstringboş olabilir
durationMsintegerboş olabilir
manualboolean
createdAtstring (date-time)
NesnelerDelivery
{
  "id": "4b207161-80f9-40bb-bc3f-d8f70315be00",
  "eventId": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
  "eventType": "task.completed",
  "status": "success",
  "attempts": 1,
  "nextAttemptAt": null,
  "lastAttemptAt": "2026-10-01T08:30:12.418Z",
  "responseStatus": 200,
  "responseExcerpt": "{\"ok\":true}",
  "error": null,
  "durationMs": 39,
  "manual": false,
  "createdAt": "2026-10-01T08:30:12.418Z"
}

Event

Öznitelikler

AlanTürAçıklama
id
zorunlu
string (uuid)Event id, also in the Planitude-Event-Id header: use it to deduplicate.
type
zorunlu
string

Şunlardan biri: project.created, project.updated, project.deleted, task.created, task.updated, task.deleted, task.completed, task.dates_changed, dependency.created, dependency.deleted, baseline.saved, member.invited, member.joined, comment.created, webhook.ping

apiVersion
zorunlu
string

Şunlardan biri: 2026-10-01

createdAt
zorunlu
string (date-time)
workspaceId
zorunlu
string (uuid)
projectIdstring (uuid)boş olabilir
actorobjectboş olabilirWho made the change (null for system changes).
actor alanlarını göster
AlanTürAçıklama
idstring (uuid)
namestringboş olabilir
data
zorunlu
object
NesnelerEvent
{
  "id": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
  "type": "project.created",
  "apiVersion": "2026-10-01",
  "createdAt": "2026-10-01T08:30:12.418Z",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "actor": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "name": "Anna Rossi"
  },
  "data": {}
}

Project (event payload)

Compact project representation used in webhook payloads.

Öznitelikler

AlanTürAçıklama
idstring (uuid)
workspaceIdstring (uuid)
keystring
namestring
descriptionstringboş olabilir
startDatestring (date)
deadlinestring (date)boş olabilir
currencystring
scheduleFromstring

Şunlardan biri: forward, backward

colorstringboş olabilir
archivedboolean
createdAtstring (date-time)
updatedAtstring (date-time)
urlstring (uri)
NesnelerProject (event payload)
{
  "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "key": "WHX",
  "name": "Warehouse expansion",
  "description": null,
  "startDate": "2026-10-05",
  "deadline": null,
  "currency": "EUR",
  "scheduleFrom": "forward",
  "color": null,
  "archived": false,
  "createdAt": "2026-10-01T08:30:12.418Z",
  "updatedAt": "2026-10-01T08:30:12.418Z",
  "url": "https://planitude.app/app/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8"
}

List webhook subscriptions

GET/api/webhooks

Okuma erişimli anahtar

Sorgu parametreleri

AlanTürAçıklama
workspaceIdstring (uuid)
projectIdstring (uuid)

Döndürür

200 OK Subscriptions

AlanTürAçıklama
webhooksarray of Webhook
İstek
curl https://planitude.app/api/webhooks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "webhooks": [
    {
      "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
      "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "workspaceName": "Acme Construction",
      "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
      "projectName": "Warehouse expansion",
      "name": "Warehouse sync",
      "url": "https://example.com/hooks/planitude",
      "events": [
        "task.created",
        "task.completed"
      ],
      "secretPrefix": "whsec_Fdwl",
      "active": true,
      "disabledReason": null,
      "disabledAt": null,
      "consecutiveFailures": 0,
      "viaApi": true,
      "createdBy": {
        "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
        "name": "Anna Rossi"
      },
      "createdAt": "2026-10-01T08:30:12.418Z",
      "updatedAt": "2026-10-01T08:30:12.418Z",
      "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
      "lastSuccessAt": "2026-10-01T08:30:12.418Z"
    }
  ]
}

Subscribe (REST hook)

POST/api/webhooks

Yazma erişimli anahtar

Creates a subscription. The response contains the signing secret: it is shown only once. Aliases accepted for automation platforms: targetUrl for url, event for a single event.

İstek gövdesi

AlanTürAçıklama
url
zorunlu
string (uri)HTTPS endpoint that receives the events. Public addresses only.
events
zorunlu
array of string* = all events.

Şunlardan biri: project.created, project.updated, project.deleted, task.created, task.updated, task.deleted, task.completed, task.dates_changed, dependency.created, dependency.deleted, baseline.saved, member.invited, member.joined, comment.created, *

namestring
projectIdstring (uuid)Limit to one project (editor role needed). Omit for the whole workspace (owner/admin).
workspaceIdstring (uuid)

Döndürür

201 Created Created

AlanTürAçıklama
webhookWebhook
secretstringwhsec_...
İstek
curl -X POST https://planitude.app/api/webhooks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com/hooks/planitude",
  "events": [
    "task.created",
    "task.completed"
  ],
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8"
}'
Yanıt201 Created
{
  "webhook": {
    "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "workspaceName": "Acme Construction",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "projectName": "Warehouse expansion",
    "name": "Warehouse sync",
    "url": "https://example.com/hooks/planitude",
    "events": [
      "task.created",
      "task.completed"
    ],
    "secretPrefix": "whsec_Fdwl",
    "active": true,
    "disabledReason": null,
    "disabledAt": null,
    "consecutiveFailures": 0,
    "viaApi": true,
    "createdBy": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z",
    "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
    "lastSuccessAt": "2026-10-01T08:30:12.418Z"
  },
  "secret": "whsec_3dvU0T1oaYlW4kH6m2Vb8nqXcR9eZpLsYw1QhGk"
}

Event catalog (public)

GET/api/webhooks/events

Herkese açık, anahtarsız

Döndürür

200 OK Events

AlanTürAçıklama
apiVersionstring
eventsarray of string
İstek
curl https://planitude.app/api/webhooks/events
Yanıt200 OK
{
  "apiVersion": "2026-10-01",
  "events": [
    "project.created",
    "project.updated",
    "project.deleted",
    "task.created",
    "task.updated",
    "task.deleted",
    "task.completed",
    "task.dates_changed",
    "dependency.created",
    "dependency.deleted",
    "baseline.saved",
    "member.invited",
    "member.joined",
    "comment.created"
  ]
}

Get a subscription

GET/api/webhooks/{webhookId}

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

Döndürür

200 OK Subscription

AlanTürAçıklama
webhookWebhook
İstek
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "webhook": {
    "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "workspaceName": "Acme Construction",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "projectName": "Warehouse expansion",
    "name": "Warehouse sync",
    "url": "https://example.com/hooks/planitude",
    "events": [
      "task.created",
      "task.completed"
    ],
    "secretPrefix": "whsec_Fdwl",
    "active": true,
    "disabledReason": null,
    "disabledAt": null,
    "consecutiveFailures": 0,
    "viaApi": true,
    "createdBy": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z",
    "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
    "lastSuccessAt": "2026-10-01T08:30:12.418Z"
  }
}

Update, pause or resume a subscription

PATCH/api/webhooks/{webhookId}

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

İstek gövdesi

AlanTürAçıklama
namestring
urlstring (uri)
eventsarray of string
activebooleanfalse = pause; true = resume (also resets the failure counter).

Döndürür

200 OK Updated

AlanTürAçıklama
webhookWebhook
İstek
curl -X PATCH https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"active":false}'
Yanıt200 OK
{
  "webhook": {
    "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "workspaceName": "Acme Construction",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "projectName": "Warehouse expansion",
    "name": "Warehouse sync",
    "url": "https://example.com/hooks/planitude",
    "events": [
      "task.created",
      "task.completed"
    ],
    "secretPrefix": "whsec_Fdwl",
    "active": true,
    "disabledReason": null,
    "disabledAt": null,
    "consecutiveFailures": 0,
    "viaApi": true,
    "createdBy": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z",
    "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
    "lastSuccessAt": "2026-10-01T08:30:12.418Z"
  }
}

Unsubscribe (REST hook)

DEL/api/webhooks/{webhookId}

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

Döndürür

204 No Content Deleted

İstek
curl -X DELETE https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"

Delivery log (newest first, kept 30 days)

GET/api/webhooks/{webhookId}/deliveries

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

Sorgu parametreleri

AlanTürAçıklama
limitinteger1-100.

Varsayılan: 50

beforestring (date-time)nextCursor of the previous page.

Döndürür

200 OK Deliveries

AlanTürAçıklama
deliveriesarray of Delivery
nextCursorstringboş olabilir
İstek
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/deliveries \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "deliveries": [
    {
      "id": "4b207161-80f9-40bb-bc3f-d8f70315be00",
      "eventId": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
      "eventType": "task.completed",
      "status": "success",
      "attempts": 1,
      "nextAttemptAt": null,
      "lastAttemptAt": "2026-10-01T08:30:12.418Z",
      "responseStatus": 200,
      "responseExcerpt": "{\"ok\":true}",
      "error": null,
      "durationMs": 39,
      "manual": false,
      "createdAt": "2026-10-01T08:30:12.418Z"
    }
  ],
  "nextCursor": null
}

Body sent with a delivery

GET/api/webhooks/{webhookId}/deliveries/{deliveryId}

Okuma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.
deliveryId
zorunlu
string (uuid)

Döndürür

200 OK Payload

AlanTürAçıklama
payloadEvent
İstek
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/deliveries/4b207161-80f9-40bb-bc3f-d8f70315be00 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "payload": {
    "id": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
    "type": "project.created",
    "apiVersion": "2026-10-01",
    "createdAt": "2026-10-01T08:30:12.418Z",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "actor": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "data": {}
  }
}

Send the same event again

POST/api/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.
deliveryId
zorunlu
string (uuid)

Döndürür

202 Accepted Queued

AlanTürAçıklama
deliveryDelivery
İstek
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/deliveries/4b207161-80f9-40bb-bc3f-d8f70315be00/redeliver \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt202 Accepted
{
  "delivery": {
    "id": "4b207161-80f9-40bb-bc3f-d8f70315be00",
    "eventId": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
    "eventType": "task.completed",
    "status": "success",
    "attempts": 1,
    "nextAttemptAt": null,
    "lastAttemptAt": "2026-10-01T08:30:12.418Z",
    "responseStatus": 200,
    "responseExcerpt": "{\"ok\":true}",
    "error": null,
    "durationMs": 39,
    "manual": false,
    "createdAt": "2026-10-01T08:30:12.418Z"
  }
}

Send a webhook.ping test event

POST/api/webhooks/{webhookId}/test

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

Döndürür

202 Accepted Queued

AlanTürAçıklama
deliveryDelivery
İstek
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/test \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt202 Accepted
{
  "delivery": {
    "id": "4b207161-80f9-40bb-bc3f-d8f70315be00",
    "eventId": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
    "eventType": "task.completed",
    "status": "success",
    "attempts": 1,
    "nextAttemptAt": null,
    "lastAttemptAt": "2026-10-01T08:30:12.418Z",
    "responseStatus": 200,
    "responseExcerpt": "{\"ok\":true}",
    "error": null,
    "durationMs": 39,
    "manual": false,
    "createdAt": "2026-10-01T08:30:12.418Z"
  }
}

Generate a new signing secret

POST/api/webhooks/{webhookId}/rotate-secret

Yazma erişimli anahtar

Yol parametreleri

AlanTürAçıklama
webhookId
zorunlu
string (uuid)Webhook id.

Döndürür

200 OK New secret (shown once)

AlanTürAçıklama
webhookWebhook
secretstring
İstek
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/rotate-secret \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt200 OK
{
  "webhook": {
    "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "workspaceName": "Acme Construction",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "projectName": "Warehouse expansion",
    "name": "Warehouse sync",
    "url": "https://example.com/hooks/planitude",
    "events": [
      "task.created",
      "task.completed"
    ],
    "secretPrefix": "whsec_Fdwl",
    "active": true,
    "disabledReason": null,
    "disabledAt": null,
    "consecutiveFailures": 0,
    "viaApi": true,
    "createdBy": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z",
    "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
    "lastSuccessAt": "2026-10-01T08:30:12.418Z"
  },
  "secret": "whsec_3dvU0T1oaYlW4kH6m2Vb8nqXcR9eZpLsYw1QhGk"
}

Webhook'lar

Webhook'lar

Webhook'lar, değişiklik web uygulamasından, API'den, MCP sunucusundan veya bir içe aktarmadan gelsin, bir şey değiştiği anda uç noktanıza JSON gövdeli bir HTTPS POST gönderir. Bir webhook tek bir projeyi veya bir çalışma alanının tüm projelerini (sahipler ve yöneticiler) kapsar.

Bunları Profil → Webhook'lar bölümünde veya REST hook'ları olarak API ile oluşturun: POST /api/webhooks ile abone olun, DELETE ile abonelikten çıkın. İmzalama gizli anahtarı yalnızca bir kez gösterilir.

Her istek şu üst bilgileri taşır:

Üst bilgiAçıklama
Planitude-Signaturet=<unix seconds>,v1=<hex HMAC-SHA256>: see Verify signatures.
Planitude-EventEvent type, e.g. task.completed.
Planitude-Event-IdEvent id, the same in every retry: use it to deduplicate.
Planitude-DeliveryId of this delivery (changes with a manual resend).
User-AgentPlanitude-Webhooks/1.0 (+https://planitude.app/developers)
Content-Typeapplication/json
İstek
curl -X POST https://planitude.app/api/webhooks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.com/hooks/planitude",
  "events": [
    "task.created",
    "task.completed"
  ],
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8"
}'
Yanıt201 Created
{
  "webhook": {
    "id": "1747ee7f-a395-4d3c-94b0-54b513d71d88",
    "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
    "workspaceName": "Acme Construction",
    "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
    "projectName": "Warehouse expansion",
    "name": "Warehouse sync",
    "url": "https://example.com/hooks/planitude",
    "events": [
      "task.created",
      "task.completed"
    ],
    "secretPrefix": "whsec_Fdwl",
    "active": true,
    "disabledReason": null,
    "disabledAt": null,
    "consecutiveFailures": 0,
    "viaApi": true,
    "createdBy": {
      "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
      "name": "Anna Rossi"
    },
    "createdAt": "2026-10-01T08:30:12.418Z",
    "updatedAt": "2026-10-01T08:30:12.418Z",
    "lastDeliveryAt": "2026-10-01T08:30:12.418Z",
    "lastSuccessAt": "2026-10-01T08:30:12.418Z"
  },
  "secret": "whsec_3dvU0T1oaYlW4kH6m2Vb8nqXcR9eZpLsYw1QhGk"
}

Olay türleri

Tek tek olaylara veya hepsi için * değerine abone olun. Her olay aynı zarfa sahiptir; data türe göre değişir.

OlayAçıklama
project.createdA project was created (blank, from a template, duplicated or imported from MS Project).
project.updatedProject fields changed (name, dates, deadline, archive...), or a saved version was restored.
project.deletedA project was deleted.
task.createdA task was created.
task.updatedTask fields or assignees changed. changes lists only the fields that changed.
task.deletedA task was deleted (one event per task of a deleted branch).
task.completedTask progress reached 100%.
task.dates_changedStart or finish moved, because of an edit (cause: edit) or because the schedule was recalculated (cause: reschedule).
dependency.createdA dependency was created or changed.
dependency.deletedA dependency was removed.
baseline.savedA baseline was saved.
member.invitedAn invite link was created for the project.
member.joinedA person joined the project.
comment.createdA comment was added to a task.
Örnek yük
{
  "id": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
  "type": "project.created",
  "apiVersion": "2026-10-01",
  "createdAt": "2026-10-01T08:30:12.418Z",
  "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
  "projectId": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
  "actor": {
    "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
    "name": "Anna Rossi"
  },
  "data": {
    "project": {
      "id": "40be00e0-7e34-4f7a-864b-5cc986f575b8",
      "workspaceId": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "key": "WHX",
      "name": "Warehouse expansion",
      "description": null,
      "startDate": "2026-10-05",
      "deadline": null,
      "currency": "EUR",
      "scheduleFrom": "forward",
      "color": null,
      "archived": false,
      "createdAt": "2026-10-01T08:30:12.418Z",
      "updatedAt": "2026-10-01T08:30:12.418Z",
      "url": "https://planitude.app/app/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8"
    },
    "source": "blank"
  }
}

İmzaları doğrulama

Her istek, HMAC-SHA256 ve webhook'unuzun gizli anahtarıyla imzalanır. Planitude-Signature üst bilgisi bir t zaman damgası ve t, bir nokta ve ham gövde üzerinde hesaplanan v1 imzasını içerir.

  1. Ham gövdeyi, herhangi bir JSON ayrıştırmasından önce kullanın: yeniden serileştirilmiş bir gövdenin imzası farklıdır.
  2. HMAC'i hesaplayın ve sabit zamanlı karşılaştırın.
  3. Zaman damgası saatinizden 5 dakikadan fazla sapan istekleri reddedin: yakalanan bir istek yeniden oynatılamaz.
  4. Gizli anahtarı istediğiniz zaman yenileyin: eskisi anında çalışmaz hale gelir.
Verify
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body as a string, before JSON.parse
export function verifyPlanitude(rawBody, header, secret, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false; // replay
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(parts.v1 ?? "", "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}

// Express: app.post("/hooks/planitude", express.raw({ type: "application/json" }), (req, res) => {
//   if (!verifyPlanitude(req.body.toString("utf8"), req.get("Planitude-Signature"), process.env.PLANITUDE_WEBHOOK_SECRET)) return res.sendStatus(400);
//   res.sendStatus(200); // then process the event in a queue
// });

Yeniden denemeler ve teslimat

10 saniye içinde herhangi bir 2xx ile yanıt verin ve asıl işi sonra, bir kuyrukta yapın. Yönlendirmeler izlenmez. Hata ve zaman aşımlarında Planitude toplam 6 kez dener: hemen, ardından 1 min, 5 min, 30 min, 2 h, 12 h sonra.

Teslimat en az bir kez yapılır ve sıralı değildir. Olay kimliğini (Planitude-Event-Id, gövdede id) saklayın ve zaten işlediklerinizi atlayın; createdAt ile sıralayın.

Art arda 5 olay tüm denemelerde başarısız olursa webhook devre dışı bırakılır ve sahibi bir e-posta alır. 410 Gone yanıtı onu hemen devre dışı bırakır. Profilden veya PATCH ile active: true göndererek yeniden açın.

Teslimat günlüğü (durum, HTTP kodu, yanıt özeti, yük, elle yeniden gönderme) 30 gün saklanır. Hedef olarak yalnızca herkese açık adresler kabul edilir.

Yeniden deneme çizelgesi6 × POST
Deneme 1   hemen
Deneme 2   + 1 min
Deneme 3   + 5 min
Deneme 4   + 30 min
Deneme 5   + 2 h
Deneme 6   + 12 h

Uç noktanızı test edin

  1. Test uç noktasıyla veya profildeki Test düğmesiyle bir webhook.ping olayı gönderin.
  2. Olayları bilgisayarınızda almak için yerel sunucunuzu bir tünelle (örneğin ngrok veya Cloudflare Tunnel) dışarı açın ve herkese açık HTTPS adresini abone edin.
  3. Durumu, HTTP kodunu ve yanıtı görmek için teslimat günlüğünü açın; uç noktanız düzeldikten sonra bir teslimatı yeniden gönderin.
İstek
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/test \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Yanıt202 Accepted
{
  "delivery": {
    "id": "4b207161-80f9-40bb-bc3f-d8f70315be00",
    "eventId": "6f1c1d1e-2f4b-4d0a-9a77-2a3c5b1e9f10",
    "eventType": "task.completed",
    "status": "success",
    "attempts": 1,
    "nextAttemptAt": null,
    "lastAttemptAt": "2026-10-01T08:30:12.418Z",
    "responseStatus": 200,
    "responseExcerpt": "{\"ok\":true}",
    "error": null,
    "durationMs": 39,
    "manual": false,
    "createdAt": "2026-10-01T08:30:12.418Z"
  }
}

Yapay zekâ ve MCP

MCP sunucusu

Planitude bir MCP (Model Context Protocol) sunucusudur: yapay zekâ asistanları ve kod düzenleyicileri, izinlerinizle projeleri okur, kritik yolu ve iş yükünü analiz eder, görevler oluşturur veya değiştirir. Web uygulamaları OAuth ile bağlanır (oturum açar ve erişime izin verirsiniz); komut satırı araçları ve düzenleyiciler bir API anahtarı kullanır.

Sunucu URL'si

https://planitude.app/mcp

  • ChatGPTOAuth

    ChatGPT'de Ayarlar › Güvenlik ve oturum açma bölümünü açın ve Geliştirici modunu etkinleştirin. Sunucu URL'si ve OAuth kimlik doğrulamasıyla bir uygulama oluşturun, ardından Planitude'da oturum açıp erişime izin verin.

    Resmî belgeler ↗
  • ClaudeOAuth

    Özelleştir › Bağlayıcılar › Özel bağlayıcı ekle bölümünü açın, sunucu URL'sini yapıştırın ve Bağlan'ı seçin: Planitude açılır, oturum açar ve erişime izin verirsiniz. claude.ai'de, Claude Desktop'ta ve mobil uygulamada çalışır.

    Resmî belgeler ↗
  • GeminiOAuth

    gemini.google.com'da Ayarlar › Bağlı uygulamalar bölümünü açın, Özel uygulama ekle'yi seçin ve sunucu URL'sini yapıştırın; ardından Planitude'da oturum açıp erişime izin verin.

    Resmî belgeler ↗
  • Claude CodeAPI anahtarı

    Komutu anahtarınızı bir ortam değişkeninde vererek çalıştırın. Her projede kullanmak için --scope user ekleyin ve claude mcp list ile kontrol edin.

    Resmî belgeler ↗
  • CodexAPI anahtarı

    Anahtarı PLANITUDE_API_KEY içine koyun ve bloğu ~/.codex/config.toml dosyasına ekleyin: CLI, uygulama ve IDE eklentisi için geçerlidir.

    Resmî belgeler ↗
  • CursorAPI anahtarı

    Bloğu ~/.cursor/mcp.json (tüm projeler) veya .cursor/mcp.json (tek proje) dosyasına ekleyin; Cursor anahtarı ortamdan okur.

    Resmî belgeler ↗
  • Visual Studio CodeAPI anahtarı

    Çalışma alanına .vscode/mcp.json ekleyin: VS Code anahtarı bir kez ister ve dosyanın dışında güvenli biçimde saklar.

    Resmî belgeler ↗
  • Gemini CLIAPI anahtarı

    Komutu anahtarınızı bir ortam değişkeninde vererek çalıştırın veya bloğu ~/.gemini/settings.json dosyasına ekleyin.

    Resmî belgeler ↗

Araçlar

Sunucu, okuma ve analizden güvenli değişikliklere kadar 29 araç sunar. Hiçbiri proje veya görev silmez.

read

  • planitude_list_projects
  • planitude_portfolio_overview
  • planitude_get_project
  • planitude_critical_path
  • planitude_delay_impact
  • planitude_monte_carlo
  • planitude_workload
  • planitude_list_baselines
  • planitude_list_versions
  • planitude_list_templates
  • planitude_list_comments
  • planitude_preview_import

write

  • planitude_create_project
  • planitude_create_project_from_template
  • planitude_create_project_from_plan
  • planitude_import_file
  • planitude_edit_project
  • planitude_add_task
  • planitude_update_task
  • planitude_set_progress
  • planitude_indent_task
  • planitude_outdent_task
  • planitude_link_tasks
  • planitude_unlink_tasks
  • planitude_reschedule
  • planitude_configure_simulation
  • planitude_add_comment
  • planitude_save_baseline
  • planitude_save_version
MCP

Server URL

https://planitude.app/mcp

Değişiklik günlüğü

  1. OpenAPI belgesinden üretilen yeni geliştirici belgeleri. OpenAPI belgesi artık üyeler, yorumlar, temel planlar, şablonlar ve atananlar için döndürülen her alanı tanımlıyor.

  2. API sürümü 2026-10-01: imzalı giden webhook'lar, belgelenmiş herkese açık REST API (OpenAPI 3.1), imleç sayfalama ve externalId ile arama.

  3. MCP sunucusu ve API için OAuth 2.1: ChatGPT, Claude ve Gemini, anahtar kopyalamadan bağlanır.

  4. MCP sunucusu ve okuma veya okuma + yazma erişimli kişisel API anahtarları.

Reklamlar Planitude'u ücretsiz tutar