Den komplette REST-endpoint-reference. For tutorials og eksempler, se API-guiden.
Alt, hvad et projekt-member kan gøre i webgrænsefladen, er tilgængeligt her — SPA’en forbruger dette samme API. Operationer, der kræver manager-rollen, er markeret (manager); alt andet kræver kun projektmedlemskab (eller, for læsninger markeret (viewer), ethvert adgangsniveau). Tabellerne nedenfor nævner hver rutegruppe, serveren monterer; dem, der er opsummeret på én linje, er fuldt beskrevet i den live openapi.json.
https://eastagiletracker.com/api/v1https://api.eastagiletracker.com/api/v1 serverer det identiske API. Alle requests og responses er JSON, undtagen et par filupload-endpoints, der accepterer multipart.
To grupper ligger ét niveau højere, under /api i stedet for /api/v1: autentificeringsfladen (/api/auth/*) og de offentlige formularer (/api/contact, /api/feedback). Deres /api/v1/…-varianter returnerer 404.
Autentificering
Sektion kaldt “Autentificering”Hver autentificeret request sender en legitimationsoplysning via en af:
X-TrackerToken: <key>Authorization: Bearer <key>
Brugernøgler starter med ea_user_, agent-nøgler med ea_agent_ og MCP-adgangstokens med ea_mcp_. Se API-guide → Tre slags legitimationsoplysninger.
Uautentificerede endpoints: /openapi.json, /docs, /api/auth/*-endpoints og opslag af referencedata (/story_types, /story_states, /effort_scales, /priority_scales). /meta er autentificeret — enhver gyldig nøgle virker, men det er ikke projektafgrænset (en projektbundet agent-nøgle når det også).
Roller
Sektion kaldt “Roller”Fire niveauer afgrænser projektafgrænsede endpoints:
| Niveau | Hvem passerer | Typiske operationer |
|---|---|---|
| public viewer | alle, på et projekt hvis synlighed er offentlig | læsninger af boardet: stories, iterationer, søgning, story- og epic-aktivitet (med aktøroplysninger bortredigeret) |
| viewer | viewer, member, manager | læsninger (list/get stories, søgning, metrikker, listen over eksportformater) |
| member | member, manager | alle skrivninger af arbejdsenheder (stories, tasks, kommentarer, …), hændelsesstrømmen |
| manager | kun manager | projektindstillinger, medlemskabsadministration, agent-nøgler, sletning, import, eksport-downloads, backups, revisionslog |
Agenter har de samme roller som medlemmer — viewer, member eller manager — med rollen hos det medlem, der udstedte nøglen, som loft. Et ikke-medlem modtager 404 unfound_resource (ikke 403) på private projekt-paths, så projekt-ID’er ikke kan opregnes.
Selvbeskrivende endpoints
Sektion kaldt “Selvbeskrivende endpoints”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /openapi.json | Den live OpenAPI 3-specifikation, inklusive request-bodies. Uautentificeret. |
| GET | /docs | Swagger UI. Uautentificeret. |
| GET | /meta | Kalderidentitet (auth.kind/key_id/agent_id/project_id) + overgangsgrafen pr. story-type. Autentificeret (enhver gyldig nøgle; ikke projektafgrænset). Kald dette først. |
| GET | /api/health · /api/config | Liveness og deploymentets offentlige konfiguration (enkelt-organisationstilstand, hvilke valgfrie funktioner der er slået til, instansens navn). Uautentificeret, uden for /v1. |
Auth (/api/auth/*, uden for /v1)
Sektion kaldt “Auth (/api/auth/*, uden for /v1)”Session-endpoints, uautentificerede medmindre andet er angivet. SPA’en driver disse; scripts bruger normalt en API-nøgle i stedet.
| Metode | Path | Beskrivelse |
|---|---|---|
| POST | /auth/register | Registrer en ny konto — beskyttet af reCAPTCHA; kontoen skal derefter igennem SMS-udfordringen |
| POST | /auth/sms/challenge · /auth/sms/status · /auth/sms/bypass | Send / tjek sign-up-SMS-koden (bypass styres af operatøren) |
| GET | /auth/config | Hvilke login-metoder deploymentet tilbyder |
| POST | /auth/login | Log ind med e-mail + adgangskode; returnerer en session-JWT eller en TOTP-udfordring |
| POST | /auth/login/totp | Afslut et login med en kode fra en godkendelsesapp eller en gendannelseskode |
| POST | /auth/passkey/login/start · /auth/passkey/login/finish | Adgangskodefrit WebAuthn-login |
| GET | /auth/oauth/github/start · /auth/oauth/github/callback · /auth/oauth/google/start · /auth/oauth/google/callback · POST /auth/oauth/exchange | OAuth-login med GitHub eller Google |
| POST | /auth/refresh · /auth/refresh/revoke | Rotér refresh-tokenet / tilbagekald det |
| POST | /auth/logout | Log ud (tilbagekalder refresh-tokenet) |
| POST | /auth/forgot-password · /auth/reset-password | Anmod om en nulstillings-e-mail / brug nulstillings-tokenet |
| POST | /auth/accept-invite/lookup · /auth/accept-invite | Slå et invitations-token op → e-mail / accepter projektinvitationen (efter autentificering) |
Konto / identitet
Sektion kaldt “Konto / identitet”Disse handler på kalderen og kræver kun en gyldig nøgle (ingen projektrolle).
| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /me | Den aktuelle brugers profil |
| PUT | /me | Opdater profil |
| DELETE | /me | Slet konto — afvises, så længe du er eneste owner af en organisation eller af et projekt med andre medlemmer |
| GET | /me/deletion-impact | Hvad sletning af kontoen ville fjerne, og hvad der blokerer den |
| PUT | /me/password | Skift adgangskode |
| PUT | /me/settings | Opdater indstillinger (tema, notifikationspræferencer) |
| POST | /me/avatar | Upload avatar (multipart) |
| POST | /me/api-token/regenerate | Rotér dit API-token — ugyldiggør eksisterende sessioner/nøgler |
| GET | /me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id} | Administrér bruger-API-nøgler (ea_user_) |
| GET | /me/totp · POST /me/totp/setup · /me/totp/verify · /me/totp/disable | Tilmelding af totrinsgodkendelse (TOTP); verify returnerer gendannelseskoderne én gang |
| GET | /me/passkeys · POST /me/passkeys/register/start · /me/passkeys/register/finish · DELETE /me/passkeys/{credential_id} | Tilmelding og fjernelse af passkeys |
| GET | /me/oauth_grants · DELETE /me/oauth_grants/{grant_id} | Forbundne apps — de MCP-klienter og OAuth-apps, du har godkendt |
| GET | /me/activity | Din aktivitet på tværs af alle projekter |
| GET | /me/stories | Stories, du ejer, har bestilt eller følger, på tværs af alle projekter, tokenet kan nå — role=owned|requested|following, state=, cursor= / limit= (maks. 200) |
| GET | /me/mentions · POST /me/mentions/{mention_id}/ack | @-omtale-indbakken (unacked=true for at filtrere) og kvittering — indgår også i notifikationsfeedet nedenfor |
| GET | /me/data-export | GDPR-selveksport af dine data |
| GET | /me/consent · POST /me/consent | Læs / registrer samtykke ({ consent_type, granted }) |
| GET | /legal/pending · POST /legal/accept | Ventende clickwrap-dokumenter / registrer accept |
| GET / PUT | /agent/me | En agent-nøgles egen identitet og profil, som agenten kan læse og redigere (agentsidens modstykke til /me) |
| POST | /api/contact · /api/feedback · /api/feedback/with-screenshot | Kontakt + in-app-feedback. Uden for /v1; rate-limited pr. IP |
Referencedata (uautentificeret)
Sektion kaldt “Referencedata (uautentificeret)”Seed-opslag brugt ved oprettelse/estimering af stories. Stabile ID’er.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /story_types | feature, bug, chore, release (+ allow_points) |
| GET | /story_states | unstarted … accepted, rejected |
| GET | /effort_scales | tilgængelige estimeringsskalaer |
| GET | /effort_scales/{scale_id}/values | point-værdierne i en skala |
| GET | /priority_scales · /priority_scales/{scale_id}/values | prioritetsskalaerne og deres værdier (priority_id på en story slås op her) |
Organisationer
Sektion kaldt “Organisationer”Kun den hostede tjeneste — en self-hosted installation kører i enkelt-organisationstilstand og monterer ikke disse (bortset fra organisationslisten). Rollerne er organisationsroller: owner, admin, member.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET / POST | /organizations | List dine organisationer / opret en |
| GET / PUT / DELETE | /organizations/{oid} | Læs, omdøb (navn + slug; owner eller admin), slet |
| GET / POST | /organizations/{oid}/memberships · PUT / DELETE …/memberships/{member_id} | Medlemmer og invitationer; invitationer har et rolleloft (aldrig over kalderens; owner inviteres aldrig) |
| POST | /organizations/{oid}/memberships/bulk-role · …/memberships/bulk-remove | Skift rolle for eller fjern op til 200 medlemmer på én gang. Alt eller intet: en batch, der ville fjerne den sidste owner eller efterlade et projekt uden ejer, afvises helt; med reassign_confirmed bliver du i stedet ejer af de projekter |
| DELETE | /organizations/{oid}/invitations/{invitation_id} | Tilbagekald en ventende invitation |
| POST | /organizations/{oid}/transfer-ownership | Overdrag owner-rollen til et andet medlem |
| PUT | /organizations/{oid}/memberships/{member_id}/anonymization | Maskér et medlems navn / e-mail / avatar i hele organisationen |
| GET | /organization-invitations/{token} · POST …/{token}/accept | Slå op / accepter en e-mailet organisationsinvitation |
| POST | /organizations/{oid}/export · GET / POST …/export/jobs · GET …/export/jobs/{job_id} · …/export/jobs/{job_id}/download | Organisationseksport kun for owners: en zip med et SQL-dump og hver vedhæftning, kørt som et job |
Projekter
Sektion kaldt “Projekter”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects | List dine projekter (limit ≤ 200) |
| POST | /projects | Opret et projekt |
| GET | /projects/{id} | Hent projektdetaljer (viewer) |
| PUT | /projects/{id} | Opdater projektindstillinger (manager) |
| DELETE | /projects/{id} | Slet et projekt (manager) |
| POST | /projects/{id}/pin | Fastgør / frigør projektet på din projektliste |
| POST | /projects/{id}/transfer-organization | Flyt projektet til en anden organisation (manager) |
| POST | /projects/{id}/slack/test | Send en testbesked til projektets Slack-feed (manager) |
| GET / POST | /projects/{id}/showcase_claim_eligibility · /projects/{id}/showcase_claim · /projects/{id}/showcase_seed | Offentlige showcase-projekter: tjek om du kan gøre krav på et, gør krav på det, seed det |
| GET | /projects/{id}/audit-log | Audit-log-læsning — projekthistorik plus aktivitet pr. story / pr. epic via surface=; adgang varierer efter surface, se nedenfor |
| GET | /projects/{id}/events | Cursor-pagineret hændelsesstrøm (member) — se Events |
Query-parametre for audit-loggen: event_type= (én type eller kommasepareret liste), limit= (≤ 1000), before= (keyset-cursor, ISO-8601 created_at), surface= (project_history, story_activities, epic_activities), target_id= (story-/epic-id — påkrævet når surface=story_activities eller epic_activities). Adgang: den ufiltrerede log og surface=project_history er (manager); story_activities / epic_activities kan læses af ethvert projektmedlem og anonymt på offentlige projekter med aktørens PII bortredigeret.
Medlemmer, agenter og agent-nøgler
Sektion kaldt “Medlemmer, agenter og agent-nøgler”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/memberships | List medlemmer (viewer) |
| POST | /projects/{id}/memberships | Inviter et medlem via e-mail (manager) |
| PUT | /projects/{id}/memberships/{mid} | Opdater rolle (manager) |
| DELETE | /projects/{id}/memberships/{mid} | Fjern et medlem (manager) |
| GET | /projects/{id}/addable-members · POST /projects/{id}/members/add-existing | Organisationsmedlemmer, der endnu ikke er på projektet / tilføj en uden e-mail-invitation (manager) |
| POST | /projects/{id}/members/join | En owner eller admin i organisationen melder sig ind i et projekt i sin organisation som manager eller forfremmer sig selv til det (handlingen Make me owner på projektlisten) |
| PUT | /projects/{id}/members/{mid}/anonymization | Maskér et medlems navn / e-mail / avatar på dette projekt (manager) |
| GET / POST | /projects/{id}/agent_keys | List / udsted agent-nøgler — managers eller de roller, projektets creator-roles policy lukker ind |
| DELETE | /projects/{id}/agent_keys/{kid} | Tilbagekald en agent-nøgle |
| GET | /projects/{id}/agent_keys/onboarding | Onboarding-pakken: prompts og konfigurationsfiler til de gængse agentklienter |
| GET | /projects/{id}/agents · GET / PUT /projects/{id}/agents/{aid} | Projektets agenter og deres profiler (navn, initialer, beskrivelse, farve) |
| POST | /projects/{id}/agents/{aid}/rotate-key · /projects/{id}/agents/{aid}/avatar | Rotér en agents nøgle (identitet og historik bevares) / upload dens avatar |
Stories
Sektion kaldt “Stories”Alle story-skrivninger kræver member-rollen.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/stories | List stories (pagineret, filtrerbar) (viewer) |
| POST | /projects/{id}/stories | Opret en story |
| GET | /projects/{id}/stories/{sid} | Hent én story (viewer) |
| PUT | /projects/{id}/stories/{sid} | Opdater en story |
| DELETE | /projects/{id}/stories/{sid} | Slet en story |
| POST | /projects/{id}/stories/{sid}/transitions | Skift tilstand med validering |
| POST | /projects/{id}/stories/{sid}/reject · /projects/{id}/stories/{sid}/restart | Afvis en leveret story / sæt en afvist tilbage til started (rejected er en sluttilstand for /transitions) |
| POST | /projects/{id}/stories/{sid}/archive · /projects/{id}/stories/{sid}/unarchive | Arkivér / genopret én story fra arkivet |
| POST | /projects/{id}/stories/bulk_transition | Skift tilstand på mange stories (1–100) på én gang |
| POST | /projects/{id}/stories/bulk-archive · bulk-delete · bulk-duplicate · bulk-move | Arkivér, slet, dublér eller flyt (til et panel / en position) mange stories |
| POST | /projects/{id}/stories/{sid}/duplicate | Dublér én story |
| GET / POST / DELETE | /projects/{id}/stories/{sid}/epics · …/epics/{eid} | Storyens epic-medlemskab |
| GET | /short-links/{code} · /story-references | Slå et /s/<code>-kortlink op til dets story / slå op til 100 story-referencer (#id, URL’er) op til de stories, kalderen kan læse |
Query-parametre for story-lister: archived= (exclude standard / include / only — trestatus-filteret for arkiverede; afløser det udfasede include_archived=true, som nu er alias for archived=include), include_done=true (medtager Done-panelets stories fastfrosset på tidligere iterationer, udeladt som standard). Paginering (cursor= / limit= / offset=) og sparsomme feltsæt (fields=) følger Paginering og Feltprojektion.
Create (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. estimate er skalaværdiens etiket som en streng ("3", "13"); et JSON-tal afvises. labels accepterer ["auth"] eller [{ "name": "auth" }]; ukendte labels oprettes. Standardværdier: story_type=feature, current_state=unstarted.
Update (PUT …/stories/{sid}): samme felter, alle valgfri, plus "position" (float), "force_state_change" (bool) og "expected_updated_at" (RFC 3339 — en gemning af beskrivelsen afvises med 409 stale_write, hvis storyen er ændret, siden du læste den). Story-skrivninger respekterer også If-Match mod storyens ETag; et mismatch giver 412 precondition_failed.
Transition (POST …/transitions): { "to": "<state>" }. Feltet er to. Returnerer { story_id, state }. Ulovligt træk → 422 invalid_transition med details: { from, to, allowed }.
Bulk transition (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>" }. Hver story bedømmes uafhængigt; returnerer { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.
Story-underressourcer
Sektion kaldt “Story-underressourcer”Alle member. List/GET på de fleste er (viewer).
| Metode | Path | Body / noter |
|---|---|---|
| GET / POST | /projects/{id}/stories/{sid}/tasks · PUT/DELETE …/tasks/{tid} | { description (or task_desc), complete?, task_order? } |
| GET / POST | /projects/{id}/stories/{sid}/comments · PUT/DELETE …/comments/{cid} | { text (or comment_text) } eller { comment_emoji }. GET tager fields= (allowlist: comment_id, story_comment_id, story_id, comment_text, comment_emoji, member, created) samt cursor= / limit= (≤ 200) / order=asc|desc |
| GET / POST | /projects/{id}/stories/{sid}/blockers · PUT/DELETE …/blockers/{bid} | { blocker_desc, resolved? } |
| GET / POST | /projects/{id}/stories/{sid}/links · PUT/DELETE …/links/{lid} | { url, link_type?, title? } — link_type ∈ relates_to, duplicates, blocks, is_blocked_by, pull_request, branch, other; GitHub-URL’er med /pull/ og /tree/ får automatisk deres type |
| GET / POST | /projects/{id}/stories/{sid}/reviews · PUT/DELETE …/reviews/{rid} | Opret: { reviewer_id? / reviewer_agent_id?, comment? } — udelad begge for at tildele dig selv. Opdater: { status, comment? } |
| GET / POST | /projects/{id}/stories/{sid}/owners · DELETE …/owners/{mid} · DELETE …/owners/agents/{aid} | { member_id? / agent_id? } — udelad begge for at tilføje kalderen |
| GET / POST | /projects/{id}/stories/{sid}/followers · DELETE …/followers/{mid} · DELETE …/followers/agents/{aid} | { member_id? / agent_id? } |
| GET / POST | /projects/{id}/stories/{sid}/labels · DELETE …/labels/{lid} | { name } |
| GET / POST | /projects/{id}/stories/{sid}/attachments (+ /json) · DELETE …/attachments/{aid} | multipart-upload — video ≤ 200 MB, PDF / Word / Excel ≤ 25 MB, billeder / CSV / tekst ≤ 10 MB; list er (viewer) |
| GET / POST | /projects/{id}/stories/{sid}/link-attachments · DELETE …/link-attachments/{laid} | Link-vedhæftninger — en ekstern URL, der opbevares ved siden af filvedhæftningerne i stedet for som et kodelink |
| GET | /attachments/{token} · /api/avatars/{token} | Token-adresserede læsninger af en vedhæftning eller en avatar — de URL’er, API’et udleverer; ingen X-TrackerToken nødvendig |
Samme form som stories, minus tilstandsmaskinen. member for skrivninger, (viewer) for læsninger.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET / POST | /projects/{id}/epics · GET / PUT / DELETE …/epics/{eid} | Epics har et navn, en Markdown-beskrivelse og en bagvedliggende label, der samler deres stories |
| GET / POST / PUT / DELETE | …/epics/{eid}/comments · …/comments/{cid} | Epic-kommentarer |
| GET / POST / DELETE | …/epics/{eid}/owners · …/followers (+ /agents/{aid}-varianter) | Ejere og følgere, medlemmer eller agenter — en epics ejere overføres til dens stories |
| GET / POST / DELETE | …/epics/{eid}/attachments (+ /json) · …/link-attachments | Vedhæftninger, samme grænser som for stories |
| GET | /projects/{id}/analytics/epics · …/analytics/epics/{eid} | Fremdrift pr. epic: burnup, gennemstrømning, sundhed, prognose (viewer) |
Labels
Sektion kaldt “Labels”member for skrivninger, (viewer) for læsninger.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET / POST | /projects/{id}/labels | List / opret en label |
| PUT / DELETE | /projects/{id}/labels/{lid} | Opdater / slet en label |
| POST | /projects/{id}/labels/{lid}/archive | Arkivér (skjul blødt) en label |
Iterationer
Sektion kaldt “Iterationer”Læsninger er åbne for enhver projektrolle og anonyme på et offentligt projekt.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/iterations | List iterationer (≤ 500 pr. side; bærer en ETag og X-Tracker-Pagination-*-fortsættelsesheaderne, når svaret er afkortet) |
| GET | /projects/{id}/iterations/{itid} | Én iteration |
| GET | /projects/{id}/iterations/first-preview | De datoer, den første iteration ville få, vist i seed-bekræftelsen |
| POST | /projects/{id}/iterations | Opret en manuel iteration (member) |
| DELETE | /projects/{id}/iterations/{itid} | Slet en iteration (manager) |
| PUT | /projects/{id}/iterations/{itid}/velocity | Tilsidesæt én iterations velocity uden at ændre projektets strategi (manager) |
| GET | /projects/{id}/iterations/{itid}/done-stories | De accepterede stories i en lukket iteration, pagineret |
Søgning, metrikker, præferencer
Sektion kaldt “Søgning, metrikker, præferencer”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/search?q=… | Kraftfuld søgning — fuldtekst + kvalifikatorer for facetter / datointervaller / personer (GitHub-lignende DSL); returnerer { results, total, limit, offset }. query er et alias for q; limit= (standard 50, maks. 1000) / offset= paginerer; sort= sorterer efter relevance (standard), created, created_asc, state eller updated. (viewer) — se Guiden |
| GET | /projects/{id}/metrics/{velocity,burndown,story-types,contributors} | Metrics-sidens dataserier (viewer); epic-metrikker findes under /analytics/epics ovenfor |
| GET | /projects/{id}/backlog/grouping | Backlog’ens projicerede iterationsgrupper (viewer) |
| GET / PUT | /projects/{id}/preferences | Dine board-præferencer for dette projekt — enhver projektrolle, kun din egen række |
Events
Sektion kaldt “Events”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/events | Cursor-pagineret hændelsesstrøm (member) — viewers får 403 |
Query-parametre: since=<event_id>, types=story.created,story.transitioned,comment.added,…, limit= (≤ 500), cursor=. Svaret inkluderer next_cursor. Angiv det sidste event_id, du så, som since for at genoptage.
Notifikationer
Sektion kaldt “Notifikationer”Det samlede notifikationsfeed i appen: fuldgyldige notifikationsrækker (review-anmodninger, story-aktivitet, invitationer, …) flettet med @-omtale-indbakken til én strøm, nyeste først. Feed-id’er bærer et kildepræfiks (nt-… / sc-… / ec-…). Medlemssessioner og ea_user_*-nøgler læser deres medlemsrækker; ea_agent_*-nøgler deres agentrækker.
| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /me/notifications | Dit notifikationsfeed. Filtre: unread=true, since_id=, kind= (mentions / reviews / stories / invitations); paginér med cursor= / limit= |
| GET | /me/notifications/unread-count | Ulæste totaler — { unread_count, by_category: { mentions, reviews, stories, invitations } } |
| POST | /me/notifications/read-all | Markér alt som læst; returnerer de friske tællere |
| POST | /me/notifications/{id}/ack | Markér ét element som læst (idempotent) |
| POST | /me/notifications/{id}/accept | Acceptér en projekt-/organisationsinvitation fra feedet (kun medlemstokens) |
| POST | /me/notifications/{id}/decline | Afvis en projekt-/organisationsinvitation (kun medlemstokens) |
| GET | /me/notifications/resolve-invite?token=… | Slå et e-mailet invitationstoken op til dit notifikations-id — { "id": "nt-…" } eller { "id": null } |
| GET | /me/notifications/stream | Live-push — Server-Sent Events (text/event-stream); se nedenfor |
Stream-endpointet er ikke et JSON-endpoint og er derfor ikke i OpenAPI-specifikationen: det holder forbindelsen åben og udsender en frame uden payload ({"type":"notification","kind":…}), når noget nyt lander, som signal til klienten om at genindlæse feedet. Forbindelser afsluttes på serversiden efter 45 minutter — genopret forbindelsen og autentificér igen. Kun medlemssessioner og ea_user_*-nøgler; ea_agent_*-nøgler får 403.
Import (manager)
Sektion kaldt “Import (manager)”| Metode | Path | Beskrivelse |
|---|---|---|
| POST | /projects/{id}/import | Filkilder: source= ∈ pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json, eat. Multipart file=. Synkron — svarer med resultattallene. |
| POST | /projects/{id}/import/json | JSON-body; source=github kræver ingen fil — owner, repo, valgfrit token og tilvalgs-flagene include_pull_requests / include_milestones / include_releases / include_dependencies; filkilderne sender file_base64. Asynkron: returnerer 202 { import_id, status }. Serveren henter via GitHubs GraphQL-API, som afviser anonyme kaldere, så et token når altid frem til GitHub — dit eller deploymentets delte. Se Guiden. |
| GET | /projects/{id}/imports/{import_id} | Poll et job: status går pending → fetching → writing → done | failed, med progress_current / progress_total under hentningen og resultattallene ved done |
Der kører én import pr. projekt ad gangen; en ny POST, mens en er i gang, giver 409 import_already_running. dry_run: true (JSON-body eller dry_run=true multipart) forhåndsviser en hvilken som helst kilde: parser, resolver, de-duplikerer, returnerer de samme { imported, skipped, errors, unmatched }-tal og ruller derefter tilbage — intet skrives. Grænser: 10 MiB body og 5.000 historier pr. import for de filbaserede kilder (over en af dem → 400, intet skrevet). GitHub-kilden har ingen grænse — den skriver i portioner frem for i én transaktion. Genimport er idempotent pr. kilde-id — allerede-importerede rækker springes over frem for at blive duplikeret.
Eksport
Sektion kaldt “Eksport”| Metode | Path | Beskrivelse |
|---|---|---|
| GET | /projects/{id}/export/formats | Registrerede formater: { id, name, content_type, drops, includes_archived }. Enhver projektrolle. |
| GET | /projects/{id}/export/{format} | Download ét (manager). Udveksling: eat (fuld fidelitet), jira, pivotal, shortcut, trello, asana, gitlab, linear, plane, plane_json; dokumenter: pdf, docx. |
| GET | /projects/{id}/export/attachments | Hver vedhæftning som én browsbar zip (filerne beholder oprindelige navne; JSON- + CSV-manifest) (manager). |
Dokument-eksporter (pdf, docx) tager ekstra query-parametre: page_size= (letter standard / a4 / legal / folio), from= / to= (grænser for story-vinduet — RFC 3339 eller bart YYYY-MM-DD; en story er i intervallet, når dens created eller completed_at falder inden for det), include_icebox= / include_backlog= (begge standard false, så en delbar eksport kun viser planlagt / igangværende arbejde). Udvekslings-CSV-formaterne ignorerer dem.
Backups og gendannelser (manager)
Sektion kaldt “Backups og gendannelser (manager)”| Metode | Path | Beskrivelse |
|---|---|---|
| GET / POST | /projects/{id}/backups · GET …/backups/{snapshot_id} · …/backups/health | List snapshots, tag et nu, læs et, og opsummeringen af opbevaringssundheden |
| GET / POST | /projects/{id}/restores · POST …/restores/partial · GET …/restores/{restore_id} | Gendan et helt snapshot eller udvalgte tabeller fra et, og poll gendannelsen |
POST-kaldene ligger på det følsomme rate-limit-niveau (nedenfor).
MCP og OAuth-udbyder
Sektion kaldt “MCP og OAuth-udbyder”East Agile Tracker er en OAuth 2.1-udbyder for MCP-klienter. En klient finder den via /.well-known/oauth-authorization-server og /.well-known/oauth-protected-resource/mcp, sender dig til /oauth/authorize (samtykkesiden), veksler koden på /oauth/token og taler derefter MCP på /mcp med det resulterende ea_mcp_*-token. Tilladelser listes og tilbagekaldes på /me/oauth_grants. Udbyderens endpoints har deres eget rate-limit-niveau.
WebSocket
Sektion kaldt “WebSocket”wss://eastagiletracker.com/ws/control?token=<session JWT>Til interaktiv fjernstyring af UI ({ "action": "get_state", "id": "req-1" }). Tokenet er en browser-session-JWT — en API-nøgle afvises med 401 før opgraderingen. Ikke en datakanal — alle læsninger/skrivninger går gennem REST. Kun enkelt-instans; fanes ikke ud på tværs af replikaer.
Idempotens
Sektion kaldt “Idempotens”Skrive-endpoints (POST, PUT, DELETE) accepterer en Idempotency-Key-header. Samme nøgle + samme body genafspiller det cachede svar (24-timers vindue); samme nøgle + en anden body returnerer 409 idempotency_conflict. Nøglen er afgrænset til den legitimationsoplysning, der sendte den. Anvendes ikke på GET/HEAD/OPTIONS, /openapi.json og /docs, /api/auth/* eller multipart-uploads på /attachments-paths. Svar, der stoppede, før domænet nåede at svare, caches aldrig — 401, 403, 404, 429 og hvert 5xx — så et nyt forsøg efter et af dem når handleren; 400, 409, 412 og 422 er domænets svar og genafspilles som en succes.
Paginering
Sektion kaldt “Paginering”List-endpoints accepterer cursor=<opaque> og limit=<n>. Når sat, er svaret { "items": [...], "next_cursor": "<str|null>" }; angiv next_cursor tilbage for at bladre. Loftet for limit gælder pr. endpoint: 200 for stories, kommentarer og projekter; 500 for events; 1000 for søgning og revisionsloggen.
En almindelig liste (uden cursor/limit), der måtte afkorte sit svar, siger det i headers — X-Tracker-Pagination-Truncated, X-Tracker-Pagination-Limit, X-Tracker-Pagination-Offset og X-Tracker-Pagination-Next-Offset; angiv den sidste tilbage som offset= for næste side. Der er ingen header med det samlede antal.
Feltprojektion
Sektion kaldt “Feltprojektion”List-endpoints accepterer fields= (kommasepareret) for kun at returnere bestemte felter. story_id inkluderes altid; et ukendt feltnavn returnerer 400 validation_failed med de krænkende navne i details.fields.
GET /projects/123/stories?fields=story_id,name,current_state,ownersFejlformat
Sektion kaldt “Fejlformat”Hver JSON-fejl har code og error; nogle tilføjer details:
{ "code": "invalid_transition", "error": "Cannot move story from `unstarted` to `accepted`", "details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }| Status | code | Hvornår |
|---|---|---|
| 400 | invalid_parameter | dårligt input; besked i error, ingen details (de fleste valideringer: blank/længde/null-byte/e-mail) |
| 400 | validation_failed | struktureret input-fejl; details.fields er et array af krænkende feltnavne |
| 401 | unauthenticated | manglende/ugyldigt token |
| 403 | unauthorized_operation | autentificeret, men utilstrækkelig rolle |
| 404 | unfound_resource | ikke fundet — returneres også til ikke-medlemmer |
| 409 | conflict | ressourcekonflikt (f.eks. dublet) |
| 409 | idempotency_conflict | Idempotency-Key genbrugt med en anden body |
| 409 | stale_write · import_already_running | storyen er ændret siden dit expected_updated_at · en import er allerede i gang |
| 412 | precondition_failed | If-Match matchede ikke ressourcens aktuelle ETag; details bærer expected og current |
| 413 | request_too_large | bodyen overskrider rutens størrelsesgrænse |
| 422 | invalid_transition | ulovligt tilstandsskifte; details bærer { from, to, allowed } |
| 429 | rate_limited | for mange requests fra denne IP på en rate-limited rute; Retry-After-header |
| 500 | internal_error | serverfejl — generisk besked; sikker at prøve igen |
| 503 | not_configured | deploymentet mangler den integration, ruten kræver (SMS, objektlager, …) |
details.fields er et JSON-array af feltnavne (f.eks. ["to"]), nogle gange med ekstra nøgler som max. Der er ingen felt→besked-afbildning.
{ "code": "validation_failed", "error": "unknown field(s): foo", "details": { "fields": ["foo"] } }Rate limits
Sektion kaldt “Rate limits”Pr. klient-IP, på en håndfuld ruter; autentificeret API-trafik andre steder er ikke rate-limited. Standardværdier (hvert par er vedvarende rate og burst, justerbare af operatøren):
- Auth —
/api/auth/*: 0,5 req/s, burst 20. - OAuth-udbyder —
/oauth/*: 1 req/s, burst 60. - Public —
/api/contact: 0,2 req/s, burst 10. - Feedback —
/api/feedback: tre stablede niveauer — én indsendelse pr. 15 s, 10 pr. time, 36 pr. døgn. - Avatarer — den uautentificerede avatar-omdirigering: 20 req/s, burst 200.
- Sensitive — backup- og gendannelses-
POST-kaldene: ~0,002 req/s, burst 5.
En overskredet grænse returnerer 429 med en Retry-After-header og den standardiserede JSON-fejlkuvert, code: "rate_limited".