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 owner-rollen, er markeret (owner); alt andet kræver kun projektmedlemskab (eller, for læsninger markeret (viewer), ethvert adgangsniveau).

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.

Hver autentificeret request sender en API-nøgle via en af:

  • X-TrackerToken: <key>
  • Authorization: Bearer <key>

Brugernøgler starter med ea_user_. Agent-nøgler starter med ea_agent_. Se API-guide → To slags nøgler.

Uautentificerede endpoints: /openapi.json, /docs, /auth/*-endpoints og opslag af referencedata (/story_types, /story_states, /effort_scales, …). /meta er autentificeret — enhver gyldig nøgle virker, men det er ikke projektafgrænset (en projektbundet agent-nøgle når det også).

Tre niveauer afgrænser projektafgrænsede endpoints:

NiveauHvem passererTypiske operationer
viewerviewer, member, ownerlæsninger (list/get stories, søgning, analyser)
membermember, owneralle skrivninger af arbejdsenheder (stories, tasks, kommentarer, …)
ownerkun ownerprojektindstillinger, medlemskabsadministration, agent-nøgler, sletning, import, revisionslog

Et ikke-medlem modtager 404 unfound_resource (ikke 403) på projekt-paths, så projekt-ID’er ikke kan opregnes.

MetodePathBeskrivelse
GET/openapi.jsonDen live OpenAPI 3-specifikation. 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.

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

MetodePathBeskrivelse
POST/auth/registerRegistrer en ny konto
POST/auth/loginLog ind, returnerer et session-token
POST/auth/logoutLog ud
POST/auth/forgot-passwordAnmod om en e-mail til nulstilling af adgangskode
POST/auth/reset-passwordBrug et nulstillings-token til at sætte en ny adgangskode
GET/auth/verify-emailBekræft en e-mailadresse
POST/auth/accept-invite/lookupSlå et invitations-token op → e-mail (uautentificeret)
POST/auth/accept-inviteAccepter en projektinvitation (efter autentificering)
GET/meDen aktuelle brugers profil
PUT/meOpdater profil
DELETE/meSlet konto
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/activityDin aktivitet på tværs af alle projekter
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
POST/contact · POST /feedback · POST /feedback/with-screenshotKontakt + in-app-feedback

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
MetodePathBeskrivelse
GET/projectsList dine projekter
POST/projectsOpret et projekt
GET/projects/{id}Hent projektdetaljer (viewer)
PUT/projects/{id}Opdater projektindstillinger (owner)
DELETE/projects/{id}Slet et projekt (owner)
GET/projects/{id}/audit-logProjektaktivitetsstrøm (owner)
GET/projects/{id}/eventsCursor-pagineret hændelsesstrøm (viewer) — se Events
MetodePathBeskrivelse
GET/projects/{id}/membershipsList medlemmer (viewer)
POST/projects/{id}/membershipsInviter et medlem via e-mail (owner)
PUT/projects/{id}/memberships/{mid}Opdater rolle (owner)
DELETE/projects/{id}/memberships/{mid}Fjern et medlem (owner)
GET / POST/projects/{id}/agent_keysList / udsted agent-nøgler (owner)
DELETE/projects/{id}/agent_keys/{kid}Tilbagekald en agent-nøgle (owner)

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/bulk_transitionSkift tilstand på mange stories (1–100) på én gang
POST/projects/{id}/stories/bulk-deleteSlet mange stories
POST/projects/{id}/stories/bulk-duplicateDublér mange stories
POST/projects/{id}/stories/{sid}/duplicateDublér én story

Create (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. 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) og "force_state_change" (bool).

Transition (POST …/transitions): { "to": "<state>", "reason"? }. 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>", "reason"? }. 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) } or { comment_emoji }
GET / POST/projects/{id}/stories/{sid}/blockers · PUT/DELETE …/blockers/{bid}{ blocker_desc, resolved? }
GET / POST/projects/{id}/stories/{sid}/links · DELETE …/links/{lid}{ url, link_type?, title? }
GET / POST/projects/{id}/stories/{sid}/reviews · PUT/DELETE …/reviews/{rid}{ reviewer_id? / reviewer_agent_id?, 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 (≤ 2 GB hver); list er (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
MetodePathBeskrivelse
GET/projects/{id}/iterationsList iterationer (member)
POST/projects/{id}/iterationsOpret en manuel iteration (owner)
DELETE/projects/{id}/iterations/{itid}Slet en iteration (owner)

Søgning, analyser, metrikker, præferencer

Sektion kaldt “Søgning, analyser, metrikker, præferencer”
MetodePathBeskrivelse
GET/projects/{id}/search?query=…Søgning med filtersyntaks (viewer) — se Guide
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}Analyser (viewer). Iterationsdetaljer tager ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}Metrikker (viewer)
GET / PUT/projects/{id}/preferencesDine board-præferencer for dette projekt (member)
MetodePathBeskrivelse
GET/projects/{id}/eventsCursor-pagineret hændelsesstrøm (viewer)

Query-parametre: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. Svaret inkluderer next_cursor. Angiv det sidste event_id, du så, som since for at genoptage.

MetodePathBeskrivelse
POST/projects/{id}/import (+ /json)Multipart-upload. source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json.
wss://eastagiletracker.com/ws/control?token=<key>

Til interaktiv fjernstyring af UI ({ "action": "get_state", "id": "req-1" }). 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. Anvendes ikke på GET/HEAD/OPTIONS, /auth/* eller /attachments-paths. 5xx-svar caches aldrig — et nyt forsøg når handleren.

List-endpoints accepterer cursor=<opaque> og limit=<n≤200>. Når sat, er svaret { "items": [...], "next_cursor": "<str|null>" }; angiv next_cursor tilbage for at bladre. Nogle lister returnerer også en X-Tracker-Pagination-Total-header.

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
422invalid_transitionulovligt tilstandsskifte; details bærer { from, to, allowed }
500internal_errorserverfejl — generisk besked; sikker at prøve igen

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. nøgle (pr. IP for uautentificerede endpoints), GCRA token bucket:

  • Auth/auth/*: 0,5 req/s, burst 20.
  • Public/contact, /feedback: 0,2 req/s, burst 10.
  • Sensitive — nulstilling af adgangskode: ~0,002 req/s, burst 5.

En overskredet grænse returnerer 429 Too Many Requests med en Retry-After-header og en ren tekst-body (ikke JSON-fejlomslaget).