Dezvoltatori

Construiți cu Planitude

Un API REST, webhook-uri semnate și un server MCP: păstrați sistemele sincronizate cu planul, reacționați la fiecare modificare și lăsați un asistent AI să lucreze la proiectele dvs.

Codul, numele câmpurilor și referința tehnică sunt în engleză, ca în majoritatea documentațiilor API.

URL de bază: https://planitude.app

Cererile și răspunsurile sunt JSON prin HTTPS. Duratele și decalajele sunt exprimate în minute lucrătoare (o zi de 8 ore înseamnă 480), momentele sunt ISO 8601 în UTC, iar datele fără oră au formatul YYYY-MM-DD.

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

Început rapid

De la zero la primul webhook în trei pași. Aveți nevoie doar de un terminal.

  1. Creați o cheie API

    Deschideți Profil → Chei API, alegeți Citire și scriere și copiați cheia: începe cu gnt_ și este afișată o singură dată. Păstrați-o într-o variabilă de mediu.

  2. Faceți primul apel

    Listați proiectele pe care le vedeți. Cheia acționează în numele dvs.: aceleași proiecte, aceleași roluri.

  3. Primiți un webhook

    Abonați un endpoint HTTPS public la evenimentele de care aveți nevoie, apoi trimiteți imediat un eveniment de test și verificați semnătura acestuia.

1Terminal
export PLANITUDE_API_KEY="gnt_…"
2
curl https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Rezultat așteptat200 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"
}'
Exemplu de payloadwebhook.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"
      ]
    }
  }
}

Autentificare

Autentificați fiecare cerere cu o cheie API personală în antetul Authorization, ca token bearer. Cheile sunt personale: acționează în numele dvs., cu rolul dvs. pe fiecare proiect, niciodată mai mult. Puteți limita o cheie la un singur spațiu de lucru, îi puteți seta o dată de expirare și o puteți revoca oricând; fiecare apel este înregistrat alături de cheie.

Domenii (scopes)

DomeniuPermite
readplanitude:readCitirea proiectelor, sarcinilor, dependențelor, membrilor, comentariilor, liniilor de bază și webhook-urilor.
writeplanitude:writeTot ce include citirea, plus crearea și modificarea proiectelor, sarcinilor, dependențelor, comentariilor, liniilor de bază și webhook-urilor.

Cheile și aplicațiile OAuth nu pot șterge proiecte sau sarcini: ștergerea rămâne în aplicația web, unde o confirmă o persoană. Un script care vizează un id greșit nu poate șterge un plan.

OAuth 2.1 pentru aplicații terțe

Aplicațiile care acționează în numele altor persoane folosesc OAuth 2.1: cod de autorizare cu PKCE (S256), refresh token-uri rotite la fiecare utilizare, înregistrare dinamică a clienților (RFC 7591). Solicitați resursa https://planitude.app/api și domeniul planitude:read sau planitude:write.

Endpoint-urile sunt publicate în documentele standard de descoperire, astfel încât bibliotecile OAuth se configurează singure.

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

Bune practici

  • Păstrați cheile în variabile de mediu sau într-un manager de secrete, niciodată în cod sau într-un depozit. Cheile încep cu gnt_, astfel încât scanerele de secrete să le poată detecta.
  • Folosiți o cheie doar pentru citire atunci când doar citiți și câte o cheie pentru fiecare integrare: puteți revoca una fără a le opri pe celelalte.
  • Setați o dată de expirare cheilor folosite de scripturi și rotiți-le.
  • Apelați API-ul de pe serverul dvs., nu din browser: o cheie din codul front-end este o cheie publică.
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"
  ]
}

Erori

Planitude folosește coduri de stare HTTP standard. Erorile au întotdeauna aceeași structură JSON: un cod error stabil pe care să vă bazați logica și, când este util, details cu motivul sau câmpurile de corectat.

StareSemnificație
400invalid_requestCererea nu este validă: details.fields listează fiecare câmp și problema.
401unauthorizedCheia lipsește, este invalidă, revocată sau expirată.
403forbiddenCheia sau rolul dvs. nu permite acest lucru (details.reason), de exemplu o scriere cu o cheie doar pentru citire sau o ștergere.
404not_foundNu a fost găsit sau nu este vizibil pentru dvs.
409dependency_cycleConflict cu planul, de exemplu o dependență care ar închide un ciclu (dependency_cycle).
429rate_limitedPrea multe cereri: așteptați numărul de secunde din Retry-After.
500server_errorA apărut o problemă din partea noastră: reîncercați cu exponential backoff.

Error

CâmpTipDescriere
error
obligatoriu
stringStable error code: invalid_request, unauthorized, forbidden, not_found, conflict, dependency_cycle, limit_exceeded, rate_limited, server_error, ...
detailsobject
Răspuns
{
  "error": "invalid_request",
  "details": {
    "fields": [
      {
        "path": "name",
        "message": "Invalid input: expected string, received undefined"
      },
      {
        "path": "durationMin",
        "message": "Too small: expected number to be >=0"
      }
    ]
  }
}

Limite de rată

Limitele se aplică per cheie, într-o fereastră glisantă de un minut: 240 cereri de citire și 60 cereri de scriere. La depășire primiți 429 rate_limited cu un antet Retry-After, în secunde.

Așteptați Retry-After înainte de a reîncerca, eșalonați în timp operațiunile în masă și grupați mai multe modificări într-un set de modificări: până la 1.000 modificări într-o singură cerere și o singură recalculare.

RăspunsHTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json

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

Paginare și căutare

Listele de sarcini sunt paginate cu un cursor. Transmiteți limit (1–500, implicit 100) și, pentru pagina următoare, nextCursor din răspunsul anterior ca cursor. Când nextCursor este null, nu mai există pagini.

Filtrați cu externalId (potrivire exactă cu propriul id), q (numele conține), updatedSince și completed; sortați cu sort=-number (cele mai noi primele) sau -updatedAt. Listele mai scurte, precum proiectele, membrii și dependențele, sunt returnate integral într-un singur răspuns.

Cerere
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"

Versionare

API-ul și payload-urile webhook sunt versionate după dată. Versiunea curentă este 2026-10-01: este câmpul apiVersion al fiecărui eveniment și info.version din documentul OpenAPI.

În cadrul unei versiuni doar adăugăm: endpoint-uri noi, câmpuri opționale noi, tipuri de evenimente noi. Câmpurile nu sunt niciodată eliminate sau retipizate fără o versiune nouă, așa că ignorați câmpurile pe care nu le cunoașteți.

Cerere
curl https://planitude.app/api/webhooks/events
Răspuns200 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"
  ]
}

Referință API

Account

Who is calling, and their workspaces.

User

Atribute

CâmpTipDescriere
idstring (uuid)
emailstring (email)
namestringnullable
avatarUrlstringnullable
localestring
emailVerifiedboolean
ObiecteUser
{
  "id": "b1666432-132a-4ea9-b1ae-76ea69e226c5",
  "email": "[email protected]",
  "name": "Anna Rossi",
  "avatarUrl": null,
  "locale": "en",
  "emailVerified": true
}

Workspace

Atribute

CâmpTipDescriere
idstring (uuid)
namestring
rolestring

Unul dintre: owner, admin, member

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

Current user (connection test)

GET/api/auth/me

Cheie cu acces de citire

Returnează

200 OK The user

CâmpTipDescriere
userUser
Cerere
curl https://planitude.app/api/auth/me \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de citire

Returnează

200 OK Workspaces

CâmpTipDescriere
workspacesarray of Workspace
Cerere
curl https://planitude.app/api/workspaces \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 OK
{
  "workspaces": [
    {
      "id": "824650d2-d0b3-4cac-8df8-5743ae9ff65a",
      "name": "Acme Construction",
      "role": "owner"
    }
  ]
}

Referință API

Projects

Projects, templates and baselines.

Project

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

Atribute

CâmpTipDescriere
idstring (uuid)
workspaceIdstring (uuid)
keystringProject key, e.g. CRON (task keys are CRON-12).
keyLockedboolean
namestring
descriptionstringnullable
startDatestring (date)
calendarIdstring (uuid)nullable
currencystring
scheduleFromstring

Unul dintre: forward, backward

deadlinestring (date)nullable
colorstringnullable
settingsobject
archivedAtstring (date-time)nullable
createdBystring (uuid)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
ObiecteProject
{
  "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

Atribute

CâmpTipDescriere
idstringbuiltin:<slug> or the id of a template saved by you.
kindstring

Unul dintre: builtin, user

namestring
descriptionstringnullable
taskCountinteger
durationDaysintegerWorking days from start to finish.
ObiecteTemplate
{
  "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

Atribute

CâmpTipDescriere
idstring (uuid)
namestring
indexintegernullableNumbered MS Project baseline (1-10); null for the main baseline and the ones you name.
capturedAtstring (date-time)
capturedBystring (uuid)nullable
taskCountinteger
ObiecteBaseline
{
  "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

Cheie cu acces de citire

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

Parametri de interogare

CâmpTipDescriere
archivedstring

Unul dintre: 1

Returnează

200 OK Projects

CâmpTipDescriere
projectsarray of Project
Cerere
curl https://planitude.app/api/projects \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

Corpul cererii

CâmpTipDescriere
name
obligatoriu
string
workspaceIdstring (uuid)Defaults to your personal workspace.
keystring2-5 letters/digits, starts with a letter. Derived from the name if omitted.
descriptionstringnullable
startDatestring (date)
deadlinestring (date)nullable
currencystring
scheduleFromstring

Unul dintre: forward, backward

colorstringnullable

Returnează

201 Created Created

CâmpTipDescriere
projectProject
Cerere
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"}'
Răspuns201 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

Cheie cu acces de scriere

Corpul cererii

CâmpTipDescriere
templateId
obligatoriu
stringId from GET /api/templates.
startDate
obligatoriu
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)

Returnează

201 Created Created

CâmpTipDescriere
projectProject
taskCountinteger
conflictsarray of Conflict
Cerere
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"
}'
Răspuns201 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

Cheie cu acces de citire

Parametri de interogare

CâmpTipDescriere
localestring

Returnează

200 OK Templates

CâmpTipDescriere
templatesarray of Template
Cerere
curl https://planitude.app/api/templates \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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}

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Returnează

200 OK Project

CâmpTipDescriere
projectProject
tasksarray of Task
dependenciesarray of Dependency
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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}

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Corpul cererii

CâmpTipDescriere
namestring
descriptionstringnullable
startDatestring (date)
deadlinestring (date)nullable
currencystring
scheduleFromstring

Unul dintre: forward, backward

colorstringnullable
archivedboolean

Returnează

200 OK Updated

CâmpTipDescriere
projectProject
conflictsarray of Conflict
rescheduledbooleanThe schedule was recalculated (start date, calendar or direction changed).
Cerere
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"}'
Răspuns200 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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Returnează

200 OK Baselines

CâmpTipDescriere
baselinesarray of Baseline
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/baseline \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Corpul cererii

CâmpTipDescriere
namestring

Returnează

201 Created Saved

CâmpTipDescriere
baselineBaseline
Cerere
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"}'
Răspuns201 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
  }
}

Referință API

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.

Atribute

CâmpTipDescriere
idstring (uuid)
numberintegerSequential number in the project, never reused.
keystringHuman key, e.g. CRON-12.
parentIdstring (uuid)nullable
namestring
typestring

Unul dintre: summary, task, milestone

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

Unul dintre: 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)nullable
deadlinestring (date-time)nullable
calendarIdstring (uuid)nullable
costFixednumber
notesstringnullable
colorstringnullable
wbsstringnullable
externalIdstringnullableYour identifier for this task in another system. Searchable with GET /tasks?externalId=.
startAtstring (date-time)nullableComputed start.
finishAtstring (date-time)nullableComputed finish.
isCriticalbooleanOn the critical path.
totalFloatMinintegernullableTotal float (slack) in working minutes.
earlyStartAtstring (date-time)nullable
lateFinishAtstring (date-time)nullable
actualStartAtstring (date-time)nullable
actualFinishAtstring (date-time)nullable
actualDurationMinintegernullable
remainingDurationMinintegernullable
manuallyScheduledboolean
levelingDelayMininteger
taskTypestring

Unul dintre: fixed_units, fixed_duration, fixed_work, fixed_duration_and_units

effortDrivenboolean
durationOptimisticMinintegernullable
durationPessimisticMinintegernullable
projectIdstring (uuid)
completedbooleanprogressPct = 100.
assigneesarray of Assignee
urlstring (uri)Page of the task in the web app.
ObiecteTask
{
  "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

Atribute

CâmpTipDescriere
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
Afișați câmpurile pentru stats
CâmpTipDescriere
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
ObiecteWriteResult
{
  "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

Atribute

CâmpTipDescriere
idstring (uuid)
taskIdstring (uuid)
userIdstring (uuid)
authorNamestring
authorAvatarUrlstringnullable
bodystring
mentionsarray of string
createdAtstring (date-time)
editedAtstring (date-time)nullable
ObiecteComment
{
  "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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Parametri de interogare

CâmpTipDescriere
limitinteger1-500.

Implicit: 100

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

Unul dintre: number, -number, -updatedAt

Implicit: number

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

Unul dintre: true, false

Returnează

200 OK A page of tasks

CâmpTipDescriere
tasksarray of Task
nextCursorstringnullable
Cerere
curl "https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks?externalId=crm-4711" \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

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.

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Corpul cererii

TaskCreate

CâmpTipDescriere
name
obligatoriu
string
parentIdstring (uuid)nullableParent (summary) task; null = top level.
afterTaskIdstring (uuid)nullableInsert after this sibling.
beforeTaskIdstring (uuid)nullableInsert before this sibling.
typestring

Unul dintre: summary, task, milestone

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

Unul dintre: 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)nullable
deadlinestring (date-time)nullable
calendarIdstring (uuid)nullable
costFixednumber
notesstringnullable
colorstringnullable
wbsstringnullable
externalIdstringnullableYour identifier for this task in another system. Searchable with GET /tasks?externalId=.

sau ChangeSet

CâmpTipDescriere
createTasksarray of TaskCreate
updateTasksarray of any
createDependenciesarray of DependencyCreate
deleteDependencyIdsarray of string
fullRescheduleboolean

Returnează

201 Created Task created

CâmpTipDescriere
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
Afișați câmpurile pentru stats
CâmpTipDescriere
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
Cerere
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"}'
Răspuns201 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}

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
taskId
obligatoriu
string (uuid)Task id.

Returnează

200 OK The task

CâmpTipDescriere
taskTask
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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}

Cheie cu acces de scriere

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

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
taskId
obligatoriu
string (uuid)Task id.

Corpul cererii

CâmpTipDescriere
namestring
typestring

Unul dintre: summary, task, milestone

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

Unul dintre: 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)nullable
deadlinestring (date-time)nullable
calendarIdstring (uuid)nullable
costFixednumber
notesstringnullable
colorstringnullable
wbsstringnullable
externalIdstringnullableYour identifier for this task in another system. Searchable with GET /tasks?externalId=.
placementobject
Afișați câmpurile pentru placement
CâmpTipDescriere
parentIdstring (uuid)nullableParent (summary) task; null = top level.
afterTaskIdstring (uuid)nullableInsert after this sibling.
beforeTaskIdstring (uuid)nullableInsert before this sibling.

Returnează

200 OK Updated

CâmpTipDescriere
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
Afișați câmpurile pentru stats
CâmpTipDescriere
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
Cerere
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}'
Răspuns200 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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
taskId
obligatoriu
string (uuid)Task id.

Returnează

200 OK Comments

CâmpTipDescriere
commentsarray of Comment
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/tasks/4dbd104a-00cd-4035-8955-255f52ea586a/comments \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
taskId
obligatoriu
string (uuid)Task id.

Corpul cererii

CâmpTipDescriere
body
obligatoriu
stringPlain text.
mentionsarray of stringUser ids to notify.

Returnează

201 Created Created

CâmpTipDescriere
commentComment
Cerere
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."}'
Răspuns201 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
  }
}

Referință API

Dependencies

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

Dependency

Atribute

CâmpTipDescriere
idstring (uuid)
predecessorIdstring (uuid)
successorIdstring (uuid)
typestring

Unul dintre: FS, SS, FF, SF

lagMinintegerWorking minutes; negative = lead.
ObiecteDependency
{
  "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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Returnează

200 OK Dependencies

CâmpTipDescriere
dependenciesarray of Dependency
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/dependencies \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

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

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Corpul cererii

DependencyCreate

CâmpTipDescriere
predecessorId
obligatoriu
string (uuid)
successorId
obligatoriu
string (uuid)
typestring

Unul dintre: FS, SS, FF, SF

Implicit: FS

lagMininteger

Implicit: 0

sau dependencies

CâmpTipDescriere
dependencies
obligatoriu
array of DependencyCreate

Returnează

201 Created Created

CâmpTipDescriere
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
Afișați câmpurile pentru stats
CâmpTipDescriere
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
Cerere
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
}'
Răspuns201 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}

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
dependencyId
obligatoriu
string (uuid)

Returnează

200 OK Removed

CâmpTipDescriere
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
Afișați câmpurile pentru stats
CâmpTipDescriere
taskCountinteger
recomputedCountintegerTasks the scheduling engine recalculated.
savedCountintegerTasks whose stored values changed.
durationMsinteger
Cerere
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"
Răspuns200 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
  }
}

Referință API

People

Project members and task assignees.

Member

Atribute

CâmpTipDescriere
userIdstring (uuid)
namestring
emailstring
rolestringEffective role on the project.

Unul dintre: owner, editor, viewer

directRolestringnullableRole granted on the project itself (null = only through the workspace).

Unul dintre: owner, editor, viewer

inheritedbooleanAccess comes from the workspace.
resourceIdstring (uuid)nullableResource used when the person is assigned to tasks.
addedAtstring (date-time)
avatarUrlstringnullable
ObiecteMember
{
  "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

Atribute

CâmpTipDescriere
resourceIdstring (uuid)
userIdstring (uuid)nullable
namestring
unitsPctinteger
ObiecteAssignee
{
  "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

Cheie cu acces de scriere

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.

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.
taskId
obligatoriu
string (uuid)Task id.

Corpul cererii

CâmpTipDescriere
userIds
obligatoriu
array of string
resourceIdsarray of string

Returnează

200 OK Assignees saved

CâmpTipDescriere
taskIdstring (uuid)
assignmentsarray of object
Afișați câmpurile pentru assignments
CâmpTipDescriere
idstring (uuid)
taskIdstring (uuid)
resourceIdstring (uuid)
unitsPctinteger
workMininteger
resourcesarray of object
Afișați câmpurile pentru resources
CâmpTipDescriere
idstring (uuid)
userIdstring (uuid)nullable
namestring
kindstring

Unul dintre: work, material, cost

emailstringnullable
costPerHournumber
costPerUsenumber
capacityPctinteger
calendarIdstring (uuid)nullable
colorstringnullable
avatarUrlstringnullable
needsRescheduleboolean
conflictsarray of Conflict
Cerere
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"]}'
Răspuns200 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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
projectId
obligatoriu
string (uuid)Project id.

Returnează

200 OK Members

CâmpTipDescriere
membersarray of Member
rolestring
Cerere
curl https://planitude.app/api/projects/40be00e0-7e34-4f7a-864b-5cc986f575b8/members \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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"
}

Referință API

Webhooks

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

Webhook

Atribute

CâmpTipDescriere
idstring (uuid)
workspaceIdstring (uuid)
workspaceNamestring
projectIdstring (uuid)nullablenull = every project of the workspace.
projectNamestringnullable
namestring
urlstring (uri)
eventsarray of string

Unul dintre: 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
disabledReasonstringnullable

Unul dintre: failures, gone, project_deleted, user

disabledAtstring (date-time)nullable
consecutiveFailuresinteger
viaApibooleanCreated with the API (REST hook) rather than from the profile.
createdByobjectnullable
Afișați câmpurile pentru createdBy
CâmpTipDescriere
idstring (uuid)
namestringnullable
createdAtstring (date-time)
updatedAtstring (date-time)
lastDeliveryAtstring (date-time)nullable
lastSuccessAtstring (date-time)nullable
ObiecteWebhook
{
  "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

Atribute

CâmpTipDescriere
idstring (uuid)
eventIdstring (uuid)
eventTypestring
statusstring

Unul dintre: pending, success, failed, cancelled

attemptsinteger
nextAttemptAtstring (date-time)nullable
lastAttemptAtstring (date-time)nullable
responseStatusintegernullable
responseExcerptstringnullable
errorstringnullable
durationMsintegernullable
manualboolean
createdAtstring (date-time)
ObiecteDelivery
{
  "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

Atribute

CâmpTipDescriere
id
obligatoriu
string (uuid)Event id, also in the Planitude-Event-Id header: use it to deduplicate.
type
obligatoriu
string

Unul dintre: 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
obligatoriu
string

Unul dintre: 2026-10-01

createdAt
obligatoriu
string (date-time)
workspaceId
obligatoriu
string (uuid)
projectIdstring (uuid)nullable
actorobjectnullableWho made the change (null for system changes).
Afișați câmpurile pentru actor
CâmpTipDescriere
idstring (uuid)
namestringnullable
data
obligatoriu
object
ObiecteEvent
{
  "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.

Atribute

CâmpTipDescriere
idstring (uuid)
workspaceIdstring (uuid)
keystring
namestring
descriptionstringnullable
startDatestring (date)
deadlinestring (date)nullable
currencystring
scheduleFromstring

Unul dintre: forward, backward

colorstringnullable
archivedboolean
createdAtstring (date-time)
updatedAtstring (date-time)
urlstring (uri)
ObiecteProject (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

Cheie cu acces de citire

Parametri de interogare

CâmpTipDescriere
workspaceIdstring (uuid)
projectIdstring (uuid)

Returnează

200 OK Subscriptions

CâmpTipDescriere
webhooksarray of Webhook
Cerere
curl https://planitude.app/api/webhooks \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

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.

Corpul cererii

CâmpTipDescriere
url
obligatoriu
string (uri)HTTPS endpoint that receives the events. Public addresses only.
events
obligatoriu
array of string* = all events.

Unul dintre: 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)

Returnează

201 Created Created

CâmpTipDescriere
webhookWebhook
secretstringwhsec_...
Cerere
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"
}'
Răspuns201 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

Public, fără cheie

Returnează

200 OK Events

CâmpTipDescriere
apiVersionstring
eventsarray of string
Cerere
curl https://planitude.app/api/webhooks/events
Răspuns200 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}

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Returnează

200 OK Subscription

CâmpTipDescriere
webhookWebhook
Cerere
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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}

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Corpul cererii

CâmpTipDescriere
namestring
urlstring (uri)
eventsarray of string
activebooleanfalse = pause; true = resume (also resets the failure counter).

Returnează

200 OK Updated

CâmpTipDescriere
webhookWebhook
Cerere
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}'
Răspuns200 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}

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Returnează

204 No Content Deleted

Cerere
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

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Parametri de interogare

CâmpTipDescriere
limitinteger1-100.

Implicit: 50

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

Returnează

200 OK Deliveries

CâmpTipDescriere
deliveriesarray of Delivery
nextCursorstringnullable
Cerere
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/deliveries \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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}

Cheie cu acces de citire

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.
deliveryId
obligatoriu
string (uuid)

Returnează

200 OK Payload

CâmpTipDescriere
payloadEvent
Cerere
curl https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/deliveries/4b207161-80f9-40bb-bc3f-d8f70315be00 \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.
deliveryId
obligatoriu
string (uuid)

Returnează

202 Accepted Queued

CâmpTipDescriere
deliveryDelivery
Cerere
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"
Răspuns202 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

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Returnează

202 Accepted Queued

CâmpTipDescriere
deliveryDelivery
Cerere
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/test \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns202 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

Cheie cu acces de scriere

Parametri de cale

CâmpTipDescriere
webhookId
obligatoriu
string (uuid)Webhook id.

Returnează

200 OK New secret (shown once)

CâmpTipDescriere
webhookWebhook
secretstring
Cerere
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/rotate-secret \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns200 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-uri

Webhook-uri

Webhook-urile trimit un POST HTTPS cu un corp JSON către endpoint-ul dvs. imediat ce se schimbă ceva, indiferent dacă modificarea provine din aplicația web, din API, de la serverul MCP sau dintr-un import. Un webhook acoperă un proiect sau toate proiectele unui spațiu de lucru (proprietari și administratori).

Creați-le în Profil → Webhook-uri sau prin API, ca REST hooks: abonați-vă cu POST /api/webhooks, dezabonați-vă cu DELETE. Secretul de semnare este afișat o singură dată.

Fiecare cerere conține aceste antete:

AntetDescriere
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
Cerere
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"
}'
Răspuns201 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"
}

Tipuri de evenimente

Abonați-vă la evenimente individuale sau la * pentru toate. Fiecare eveniment are aceeași structură; data se schimbă în funcție de tip.

EvenimentDescriere
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.
Exemplu de 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": {
    "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"
  }
}

Verificarea semnăturilor

Fiecare cerere este semnată cu HMAC-SHA256 și secretul webhook-ului dvs. Antetul Planitude-Signature conține un timestamp t și semnătura v1, calculată pe t, un punct și corpul brut.

  1. Folosiți corpul brut, înainte de orice parsare JSON: un corp re-serializat are o altă semnătură.
  2. Calculați HMAC-ul și comparați-l în timp constant.
  3. Respingeți cererile al căror timestamp diferă cu mai mult de 5 minute de ceasul dvs.: o cerere interceptată nu poate fi reluată.
  4. Rotiți secretul oricând doriți: cel vechi încetează să funcționeze imediat.
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
// });

Reîncercări și livrare

Răspundeți cu orice cod 2xx în 10 secunde și efectuați munca propriu-zisă ulterior, într-o coadă. Redirecționările nu sunt urmate. În caz de erori și depășiri de timp, Planitude încearcă de maximum 6 ori în total: imediat, apoi după 1 min, 5 min, 30 min, 2 h, 12 h.

Livrarea este cel puțin o dată și fără ordine garantată. Stocați id-ul evenimentului (Planitude-Event-Id, la fel ca id din corp) și săriți peste cele deja procesate; ordonați după createdAt.

După ce 5 evenimente consecutive eșuează la toate încercările, webhook-ul este dezactivat, iar proprietarul său primește un e-mail. Un răspuns 410 Gone îl dezactivează imediat. Reactivați-l din profil sau cu PATCH și active: true.

Jurnalul livrărilor (stare, cod HTTP, fragment de răspuns, payload, retrimitere manuală) este păstrat 30 zile. Ca destinații sunt acceptate doar adrese publice.

Program de reîncercare6 × POST
Încercare 1   imediat
Încercare 2   + 1 min
Încercare 3   + 5 min
Încercare 4   + 30 min
Încercare 5   + 2 h
Încercare 6   + 12 h

Testați endpoint-ul

  1. Trimiteți un eveniment webhook.ping cu endpoint-ul de test sau cu butonul Testare din profil.
  2. Pentru a primi evenimente pe computerul dvs., expuneți serverul local printr-un tunel (de exemplu ngrok sau Cloudflare Tunnel) și abonați adresa lui HTTPS publică.
  3. Deschideți jurnalul livrărilor pentru a vedea starea, codul HTTP și răspunsul și retrimiteți o livrare după ce endpoint-ul dvs. a fost reparat.
Cerere
curl -X POST https://planitude.app/api/webhooks/1747ee7f-a395-4d3c-94b0-54b513d71d88/test \
  -H "Authorization: Bearer $PLANITUDE_API_KEY"
Răspuns202 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"
  }
}

AI și MCP

Server MCP

Planitude este un server MCP (Model Context Protocol): asistenții AI și editoarele de cod citesc proiecte, analizează calea critică și încărcarea, și creează sau modifică sarcini, cu permisiunile dvs. Aplicațiile web se conectează prin OAuth (vă autentificați și permiteți accesul); instrumentele din linia de comandă și editoarele folosesc o cheie API.

URL server

https://planitude.app/mcp

  • ChatGPTOAuth

    În ChatGPT deschideți Setări › Securitate și autentificare și activați Developer mode. Creați o aplicație cu URL-ul serverului și autentificare OAuth, apoi autentificați-vă în Planitude și permiteți accesul.

    Documentație oficială ↗
  • ClaudeOAuth

    Deschideți Personalizare › Conectori › Adăugare conector personalizat, lipiți URL-ul serverului și alegeți Conectare: se deschide Planitude, vă autentificați și permiteți accesul. Funcționează în claude.ai, Claude Desktop și în aplicația mobilă.

    Documentație oficială ↗
  • GeminiOAuth

    Pe gemini.google.com deschideți Setări › Aplicații conectate, alegeți Adăugare aplicație personalizată și lipiți URL-ul serverului; apoi autentificați-vă în Planitude și permiteți accesul.

    Documentație oficială ↗
  • Claude CodeCheie API

    Rulați comanda cu cheia dvs. într-o variabilă de mediu. Adăugați --scope user pentru a o folosi în fiecare proiect și verificați cu claude mcp list.

    Documentație oficială ↗
  • CodexCheie API

    Puneți cheia în PLANITUDE_API_KEY și adăugați blocul în ~/.codex/config.toml: se aplică CLI-ului, aplicației și extensiei IDE.

    Documentație oficială ↗
  • CursorCheie API

    Adăugați blocul în ~/.cursor/mcp.json (toate proiectele) sau în .cursor/mcp.json (un singur proiect); Cursor citește cheia din mediu.

    Documentație oficială ↗
  • Adăugați .vscode/mcp.json în spațiul de lucru: VS Code solicită cheia o singură dată și o stochează în siguranță, în afara fișierului.

    Documentație oficială ↗
  • Gemini CLICheie API

    Rulați comanda cu cheia dvs. într-o variabilă de mediu sau adăugați blocul în ~/.gemini/settings.json.

    Documentație oficială ↗

Instrumente

Serverul expune 29 instrumente, de la citire și analiză până la modificări sigure. Niciunul nu șterge proiecte sau sarcini.

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

Jurnal de modificări

  1. Documentație nouă pentru dezvoltatori, generată din documentul OpenAPI. Documentul OpenAPI descrie acum fiecare câmp returnat pentru membri, comentarii, linii de bază, șabloane și persoane desemnate.

  2. Versiunea API 2026-10-01: webhook-uri semnate de ieșire, API REST public documentat (OpenAPI 3.1), paginare cu cursor și căutare după externalId.

  3. OAuth 2.1 pentru serverul MCP și API: ChatGPT, Claude și Gemini se conectează fără a copia o cheie.

  4. Server MCP și chei API personale cu acces de citire sau citire + scriere.

Publicitatea menține Planitude gratuit