Hoppa till innehåll

API-specifikation

Den kompletta REST-endpoint-referensen. För handledningar och exempel, se API-guiden.

Allt en projektmedlem kan göra i webbgränssnittet finns tillgängligt här — SPA:n använder samma API. Operationer som kräver ägarrollen är markerade (owner); allt annat kräver enbart projektmedlemskap (eller, för läsningar markerade (viewer), vilken åtkomstnivå som helst).

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 betjänar det identiska API:et. Alla requests och svar är JSON, förutom några fil-uppladdnings-endpoints som accepterar multipart.

Varje autentiserad request skickar en API-nyckel via något av:

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

Användarnycklar börjar med ea_user_. Agentnycklar börjar med ea_agent_. Se API-guide → Två sorters nycklar.

Oautentiserade endpoints: /openapi.json, /docs, /auth/*-endpointerna och uppslagen av referensdata (/story_types, /story_states, /effort_scales, …). /meta är autentiserad — vilken giltig nyckel som helst fungerar, men den är inte projektavgränsad (en projektbunden agentnyckel når den också).

Tre nivåer styr projektavgränsade endpoints:

NivåVem passerarTypiska operationer
viewerviewer, member, ownerläsningar (lista/hämta stories, sökning, analys)
membermember, owneralla skrivningar av arbetsposter (stories, tasks, kommentarer, …)
ownerendast ownerprojektinställningar, medlemshantering, agentnycklar, radering, import, granskningslogg

En icke-medlem får 404 unfound_resource (inte 403) på projektsökvägar, så projekt-ID:n går inte att räkna upp.

MethodPathBeskrivning
GET/openapi.jsonDen live OpenAPI 3-specifikationen. Oautentiserad.
GET/docsSwagger UI. Oautentiserad.
GET/metaAnroparens identitet (auth.kind/key_id/agent_id/project_id) + övergångsgrafen per story-typ. Autentiserad (vilken giltig nyckel som helst; inte projektavgränsad). Anropa detta först.

Dessa agerar på anroparen och kräver enbart en giltig nyckel (ingen projektroll).

MethodPathBeskrivning
POST/auth/registerRegistrera ett nytt konto
POST/auth/loginLogga in, returnerar en sessions-token
POST/auth/logoutLogga ut
POST/auth/forgot-passwordBegär ett e-postmeddelande för återställning av lösenord
POST/auth/reset-passwordAnvänd en återställnings-token för att sätta ett nytt lösenord
GET/auth/verify-emailVerifiera en e-postadress
POST/auth/accept-invite/lookupSlå upp en inbjudnings-token → e-post (oautentiserad)
POST/auth/accept-inviteAcceptera en projektinbjudan (efter autentisering)
GET/meAktuell användarprofil
PUT/meUppdatera profil
DELETE/meRadera konto
PUT/me/passwordByt lösenord
PUT/me/settingsUppdatera inställningar (tema, notisinställningar)
POST/me/avatarLadda upp avatar (multipart)
POST/me/api-token/regenerateRotera din API-token — ogiltigförklarar befintliga sessioner/nycklar
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}Hantera användar-API-nycklar (ea_user_)
GET/me/activityDin aktivitet över alla projekt
GET/me/data-exportGDPR-självexport av dina data
GET/me/consent · POST /me/consentLäs / registrera samtycke ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptVäntande clickwrap-dokument / registrera godkännande
POST/contact · POST /feedback · POST /feedback/with-screenshotKontakt + feedback i appen

Seed-uppslag som används när stories skapas/estimeras. Stabila ID:n.

MethodPathBeskrivning
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalestillgängliga estimeringsskalor
GET/effort_scales/{scale_id}/valuespoängvärdena i en skala
MethodPathBeskrivning
GET/projectsLista dina projekt
POST/projectsSkapa ett projekt
GET/projects/{id}Hämta projektdetaljer (viewer)
PUT/projects/{id}Uppdatera projektinställningar (owner)
DELETE/projects/{id}Radera ett projekt (owner)
GET/projects/{id}/audit-logProjektets aktivitetsström (owner)
GET/projects/{id}/eventsCursor-paginerad händelseström (viewer) — se Händelser
MethodPathBeskrivning
GET/projects/{id}/membershipsLista medlemmar (viewer)
POST/projects/{id}/membershipsBjud in en medlem via e-post (owner)
PUT/projects/{id}/memberships/{mid}Uppdatera roll (owner)
DELETE/projects/{id}/memberships/{mid}Ta bort en medlem (owner)
GET / POST/projects/{id}/agent_keysLista / skapa agentnycklar (owner)
DELETE/projects/{id}/agent_keys/{kid}Återkalla en agentnyckel (owner)

Alla story-skrivningar kräver member-rollen.

MethodPathBeskrivning
GET/projects/{id}/storiesLista stories (paginerade, filtrerbara) (viewer)
POST/projects/{id}/storiesSkapa en story
GET/projects/{id}/stories/{sid}Hämta en story (viewer)
PUT/projects/{id}/stories/{sid}Uppdatera en story
DELETE/projects/{id}/stories/{sid}Radera en story
POST/projects/{id}/stories/{sid}/transitionsÄndra tillstånd med validering
POST/projects/{id}/stories/bulk_transitionTransitionera många stories (1–100) på en gång
POST/projects/{id}/stories/bulk-deleteRadera många stories
POST/projects/{id}/stories/bulk-duplicateDuplicera många stories
POST/projects/{id}/stories/{sid}/duplicateDuplicera en story

Skapa (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. labels accepterar ["auth"] eller [{ "name": "auth" }]; okända etiketter skapas. Standardvärden: story_type=feature, current_state=unstarted.

Uppdatera (PUT …/stories/{sid}): samma fält, alla valfria, plus "position" (float) och "force_state_change" (bool).

Transition (POST …/transitions): { "to": "<state>", "reason"? }. Fältet är to. Returnerar { story_id, state }. Otillåten förflyttning → 422 invalid_transition med details: { from, to, allowed }.

Bulk-transition (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? }. Varje story bedöms oberoende; returnerar { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

Alla member. List/GET på de flesta är (viewer).

MethodPathBody / anmärkningar
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? } — utelämna båda för att lägga till anroparen
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-uppladdning (≤ 2 GB vardera); listning är (viewer)

member för skrivningar, (viewer) för läsningar.

MethodPathBeskrivning
GET / POST/projects/{id}/labelsLista / skapa en etikett
PUT / DELETE/projects/{id}/labels/{lid}Uppdatera / radera en etikett
POST/projects/{id}/labels/{lid}/archiveArkivera (mjukt dölja) en etikett
MethodPathBeskrivning
GET/projects/{id}/iterationsLista iterationer (member)
POST/projects/{id}/iterationsSkapa en manuell iteration (owner)
DELETE/projects/{id}/iterations/{itid}Radera en iteration (owner)

Sökning, analys, mätvärden, inställningar

Section titled “Sökning, analys, mätvärden, inställningar”
MethodPathBeskrivning
GET/projects/{id}/search?query=…Sökning med filtersyntax (viewer) — se Guiden
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}Analys (viewer). Iterations-fördjupning tar ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}Mätvärden (viewer)
GET / PUT/projects/{id}/preferencesDina board-inställningar för detta projekt (member)
MethodPathBeskrivning
GET/projects/{id}/eventsCursor-paginerad händelseström (viewer)

Query-parametrar: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. Svaret inkluderar next_cursor. Skicka det senaste event_id du sett som since för att återuppta.

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

För interaktiv fjärrstyrning av gränssnittet ({ "action": "get_state", "id": "req-1" }). Inte en datakanal — alla läsningar/skrivningar går via REST. Endast en instans; inte utfläkt över repliker.

Skriv-endpoints (POST, PUT, DELETE) accepterar en Idempotency-Key-header. Samma nyckel + samma body spelar upp det cachade svaret (24-timmarsfönster); samma nyckel + en annan body returnerar 409 idempotency_conflict. Tillämpas inte på GET/HEAD/OPTIONS, /auth/* eller /attachments-sökvägar. 5xx-svar cachas aldrig — ett omförsök når hanteraren.

List-endpoints accepterar cursor=<opaque> och limit=<n≤200>. När de är satta är svaret { "items": [...], "next_cursor": "<str|null>" }; skicka tillbaka next_cursor för att bläddra. Vissa listor returnerar också en X-Tracker-Pagination-Total-header.

List-endpoints accepterar fields= (kommaseparerad) för att returnera enbart specifika fält. story_id inkluderas alltid; ett okänt fältnamn returnerar 400 validation_failed med de felande namnen i details.fields.

GET /projects/123/stories?fields=story_id,name,current_state,owners

Varje JSON-fel har code och error; vissa lägger till details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
StatuscodeNär
400invalid_parameterfelaktig indata; meddelande i error, inga details (de flesta valideringar: blank/längd/null-byte/e-post)
400validation_failedstrukturerat indatafel; details.fields är en array av felande fältnamn
401unauthenticatedsaknad/ogiltig token
403unauthorized_operationautentiserad men otillräcklig roll
404unfound_resourcehittades inte — returneras även till icke-medlemmar
409conflictresurskonflikt (t.ex. dubblett)
409idempotency_conflictIdempotency-Key återanvänd med en annan body
422invalid_transitionotillåten tillståndsförflyttning; details bär { from, to, allowed }
500internal_errorserverfel — generiskt meddelande; säkert att försöka igen

details.fields är en JSON-array av fältnamn (t.ex. ["to"]), ibland med extra nycklar som max. Det finns ingen mappning fält→meddelande.

{ "code": "validation_failed", "error": "unknown field(s): foo", "details": { "fields": ["foo"] } }

Per nyckel (per IP för oautentiserade endpoints), GCRA token-bucket:

  • Auth/auth/*: 0.5 req/s, burst 20.
  • Public/contact, /feedback: 0.2 req/s, burst 10.
  • Sensitive — återställning av lösenord: ~0.002 req/s, burst 5.

En överskriden gräns returnerar 429 Too Many Requests med en Retry-After-header och en body i klartext (inte JSON-felkuvertet).