Gå til indhold

API-specifikation

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/v1

https://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.

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å).

Fire niveauer afgrænser projektafgrænsede endpoints:

NiveauHvem passererTypiske operationer
public vieweralle, på et projekt hvis synlighed er offentliglæsninger af boardet: stories, iterationer, søgning, story- og epic-aktivitet (med aktøroplysninger bortredigeret)
viewerviewer, member, managerlæsninger (list/get stories, søgning, metrikker, listen over eksportformater)
membermember, manageralle skrivninger af arbejdsenheder (stories, tasks, kommentarer, …), hændelsesstrømmen
managerkun managerprojektindstillinger, 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.

MetodePathBeskrivelse
GET/openapi.jsonDen live OpenAPI 3-specifikation, inklusive request-bodies. Uautentificeret.
GET/docsSwagger UI. Uautentificeret.
GET/metaKalderidentitet (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/configLiveness og deploymentets offentlige konfiguration (enkelt-organisationstilstand, hvilke valgfrie funktioner der er slået til, instansens navn). Uautentificeret, uden for /v1.

Session-endpoints, uautentificerede medmindre andet er angivet. SPA’en driver disse; scripts bruger normalt en API-nøgle i stedet.

MetodePathBeskrivelse
POST/auth/registerRegistrer en ny konto — beskyttet af reCAPTCHA; kontoen skal derefter igennem SMS-udfordringen
POST/auth/sms/challenge · /auth/sms/status · /auth/sms/bypassSend / tjek sign-up-SMS-koden (bypass styres af operatøren)
GET/auth/configHvilke login-metoder deploymentet tilbyder
POST/auth/loginLog ind med e-mail + adgangskode; returnerer en session-JWT eller en TOTP-udfordring
POST/auth/login/totpAfslut et login med en kode fra en godkendelsesapp eller en gendannelseskode
POST/auth/passkey/login/start · /auth/passkey/login/finishAdgangskodefrit WebAuthn-login
GET/auth/oauth/github/start · /auth/oauth/github/callback · /auth/oauth/google/start · /auth/oauth/google/callback · POST /auth/oauth/exchangeOAuth-login med GitHub eller Google
POST/auth/refresh · /auth/refresh/revokeRotér refresh-tokenet / tilbagekald det
POST/auth/logoutLog ud (tilbagekalder refresh-tokenet)
POST/auth/forgot-password · /auth/reset-passwordAnmod om en nulstillings-e-mail / brug nulstillings-tokenet
POST/auth/accept-invite/lookup · /auth/accept-inviteSlå et invitations-token op → e-mail / accepter projektinvitationen (efter autentificering)

Disse handler på kalderen og kræver kun en gyldig nøgle (ingen projektrolle).

MetodePathBeskrivelse
GET/meDen aktuelle brugers profil
PUT/meOpdater profil
DELETE/meSlet konto — afvises, så længe du er eneste owner af en organisation eller af et projekt med andre medlemmer
GET/me/deletion-impactHvad sletning af kontoen ville fjerne, og hvad der blokerer den
PUT/me/passwordSkift adgangskode
PUT/me/settingsOpdater indstillinger (tema, notifikationspræferencer)
POST/me/avatarUpload avatar (multipart)
POST/me/api-token/regenerateRoté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/disableTilmelding 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/activityDin aktivitet på tværs af alle projekter
GET/me/storiesStories, 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-exportGDPR-selveksport af dine data
GET/me/consent · POST /me/consentLæs / registrer samtykke ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptVentende clickwrap-dokumenter / registrer accept
GET / PUT/agent/meEn 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-screenshotKontakt + in-app-feedback. Uden for /v1; rate-limited pr. IP

Seed-opslag brugt ved oprettelse/estimering af stories. Stabile ID’er.

MetodePathBeskrivelse
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalestilgængelige estimeringsskalaer
GET/effort_scales/{scale_id}/valuespoint-værdierne i en skala
GET/priority_scales · /priority_scales/{scale_id}/valuesprioritetsskalaerne og deres værdier (priority_id på en story slås op her)

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.

MetodePathBeskrivelse
GET / POST/organizationsList 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-removeSkift 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-ownershipOverdrag owner-rollen til et andet medlem
PUT/organizations/{oid}/memberships/{member_id}/anonymizationMaskér et medlems navn / e-mail / avatar i hele organisationen
GET/organization-invitations/{token} · POST …/{token}/acceptSlå op / accepter en e-mailet organisationsinvitation
POST/organizations/{oid}/export · GET / POST …/export/jobs · GET …/export/jobs/{job_id} · …/export/jobs/{job_id}/downloadOrganisationseksport kun for owners: en zip med et SQL-dump og hver vedhæftning, kørt som et job
MetodePathBeskrivelse
GET/projectsList dine projekter (limit ≤ 200)
POST/projectsOpret et projekt
GET/projects/{id}Hent projektdetaljer (viewer)
PUT/projects/{id}Opdater projektindstillinger (manager)
DELETE/projects/{id}Slet et projekt (manager)
POST/projects/{id}/pinFastgør / frigør projektet på din projektliste
POST/projects/{id}/transfer-organizationFlyt projektet til en anden organisation (manager)
POST/projects/{id}/slack/testSend en testbesked til projektets Slack-feed (manager)
GET / POST/projects/{id}/showcase_claim_eligibility · /projects/{id}/showcase_claim · /projects/{id}/showcase_seedOffentlige showcase-projekter: tjek om du kan gøre krav på et, gør krav på det, seed det
GET/projects/{id}/audit-logAudit-log-læsning — projekthistorik plus aktivitet pr. story / pr. epic via surface=; adgang varierer efter surface, se nedenfor
GET/projects/{id}/eventsCursor-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.

MetodePathBeskrivelse
GET/projects/{id}/membershipsList medlemmer (viewer)
POST/projects/{id}/membershipsInviter 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-existingOrganisationsmedlemmer, der endnu ikke er på projektet / tilføj en uden e-mail-invitation (manager)
POST/projects/{id}/members/joinEn 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}/anonymizationMaskér et medlems navn / e-mail / avatar på dette projekt (manager)
GET / POST/projects/{id}/agent_keysList / 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/onboardingOnboarding-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}/avatarRotér en agents nøgle (identitet og historik bevares) / upload dens avatar

Alle story-skrivninger kræver member-rollen.

MetodePathBeskrivelse
GET/projects/{id}/storiesList stories (pagineret, filtrerbar) (viewer)
POST/projects/{id}/storiesOpret 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}/transitionsSkift tilstand med validering
POST/projects/{id}/stories/{sid}/reject · /projects/{id}/stories/{sid}/restartAfvis 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}/unarchiveArkivér / genopret én story fra arkivet
POST/projects/{id}/stories/bulk_transitionSkift tilstand på mange stories (1–100) på én gang
POST/projects/{id}/stories/bulk-archive · bulk-delete · bulk-duplicate · bulk-moveArkivér, slet, dublér eller flyt (til et panel / en position) mange stories
POST/projects/{id}/stories/{sid}/duplicateDublér én story
GET / POST / DELETE/projects/{id}/stories/{sid}/epics · …/epics/{eid}Storyens epic-medlemskab
GET/short-links/{code} · /story-referencesSlå 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 } ] }.

Alle member. List/GET på de fleste er (viewer).

MetodePathBody / 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_typerelates_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.

MetodePathBeskrivelse
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-attachmentsVedhæftninger, samme grænser som for stories
GET/projects/{id}/analytics/epics · …/analytics/epics/{eid}Fremdrift pr. epic: burnup, gennemstrømning, sundhed, prognose (viewer)

member for skrivninger, (viewer) for læsninger.

MetodePathBeskrivelse
GET / POST/projects/{id}/labelsList / opret en label
PUT / DELETE/projects/{id}/labels/{lid}Opdater / slet en label
POST/projects/{id}/labels/{lid}/archiveArkivér (skjul blødt) en label

Læsninger er åbne for enhver projektrolle og anonyme på et offentligt projekt.

MetodePathBeskrivelse
GET/projects/{id}/iterationsList 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-previewDe datoer, den første iteration ville få, vist i seed-bekræftelsen
POST/projects/{id}/iterationsOpret en manuel iteration (member)
DELETE/projects/{id}/iterations/{itid}Slet en iteration (manager)
PUT/projects/{id}/iterations/{itid}/velocityTilsidesæt én iterations velocity uden at ændre projektets strategi (manager)
GET/projects/{id}/iterations/{itid}/done-storiesDe accepterede stories i en lukket iteration, pagineret
MetodePathBeskrivelse
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/groupingBacklog’ens projicerede iterationsgrupper (viewer)
GET / PUT/projects/{id}/preferencesDine board-præferencer for dette projekt — enhver projektrolle, kun din egen række
MetodePathBeskrivelse
GET/projects/{id}/eventsCursor-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.

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.

MetodePathBeskrivelse
GET/me/notificationsDit notifikationsfeed. Filtre: unread=true, since_id=, kind= (mentions / reviews / stories / invitations); paginér med cursor= / limit=
GET/me/notifications/unread-countUlæste totaler — { unread_count, by_category: { mentions, reviews, stories, invitations } }
POST/me/notifications/read-allMarkér alt som læst; returnerer de friske tællere
POST/me/notifications/{id}/ackMarkér ét element som læst (idempotent)
POST/me/notifications/{id}/acceptAcceptér en projekt-/organisationsinvitation fra feedet (kun medlemstokens)
POST/me/notifications/{id}/declineAfvis 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/streamLive-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.

MetodePathBeskrivelse
POST/projects/{id}/importFilkilder: source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json, eat. Multipart file=. Synkron — svarer med resultattallene.
POST/projects/{id}/import/jsonJSON-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.

MetodePathBeskrivelse
GET/projects/{id}/export/formatsRegistrerede 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/attachmentsHver 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.

MetodePathBeskrivelse
GET / POST/projects/{id}/backups · GET …/backups/{snapshot_id} · …/backups/healthList 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).

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.

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.

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.

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.

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,owners

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"] } }
StatuscodeHvornår
400invalid_parameterdårligt input; besked i error, ingen details (de fleste valideringer: blank/længde/null-byte/e-mail)
400validation_failedstruktureret input-fejl; details.fields er et array af krænkende feltnavne
401unauthenticatedmanglende/ugyldigt token
403unauthorized_operationautentificeret, men utilstrækkelig rolle
404unfound_resourceikke fundet — returneres også til ikke-medlemmer
409conflictressourcekonflikt (f.eks. dublet)
409idempotency_conflictIdempotency-Key genbrugt med en anden body
409stale_write · import_already_runningstoryen er ændret siden dit expected_updated_at · en import er allerede i gang
412precondition_failedIf-Match matchede ikke ressourcens aktuelle ETag; details bærer expected og current
413request_too_largebodyen overskrider rutens størrelsesgrænse
422invalid_transitionulovligt tilstandsskifte; details bærer { from, to, allowed }
429rate_limitedfor mange requests fra denne IP på en rate-limited rute; Retry-After-header
500internal_errorserverfejl — generisk besked; sikker at prøve igen
503not_configureddeploymentet 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"] } }

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