Siirry sisältöön

API-määrittely

Täydellinen REST-päätepisteviittaus. Tutoriaaleja ja esimerkkejä varten katso API-opas.

Kaikki minkä projektin jäsen voi tehdä verkkokäyttöliittymässä on saatavilla täällä — SPA käyttää tätä samaa APIa. Operaatiot, jotka vaativat omistajan roolin, on merkitty (owner); kaikki muu vaatii vain projektin jäsenyyttä (tai, lukuoperaatioille jotka on merkitty (viewer), minkä tahansa käyttöoikeustason).

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 tarjoaa identtisen APIn. Kaikki pyynnöt ja vastaukset ovat JSON-muotoa, lukuun ottamatta muutamia tiedostonlatauspäätepisteitä, jotka hyväksyvät multipartin.

Jokainen tunnistautunut pyyntö lähettää API-avaimen yhdellä seuraavista:

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

Käyttäjäavaimet alkavat ea_user_. Agenttiavaimet alkavat ea_agent_. Katso API-opas → Kaksi avaintyyppiä.

Tunnistautumattomat päätepisteet: /openapi.json, /docs, /auth/*-päätepisteet ja viitedatahaut (/story_types, /story_states, /effort_scales, …). /meta on tunnistautunut — mikä tahansa kelvollinen avain toimii, mutta se ei ole projektirajattu (projektiin sidottu agenttiavain tavoittaa sen myös).

Kolme tasoa portittaa projektirajattuja päätepisteitä:

TasoKuka pääseeTyypilliset operaatiot
viewerviewer, member, ownerluvut (listaa/hae tarinoita, haku, analytiikka)
membermember, ownerkaikki työkohteiden kirjoitukset (tarinat, tehtävät, kommentit, …)
ownervain ownerprojektin asetukset, jäsenyyden hallinta, agenttiavaimet, poisto, tuonti, auditointiloki

Ei-jäsen saa 404 unfound_resource (ei 403) projektipoluilla, joten projektien ID:t eivät ole lueteltavissa.

MetodiPolkuKuvaus
GET/openapi.jsonLive OpenAPI 3 -spesifikaatio. Tunnistautumaton.
GET/docsSwagger UI. Tunnistautumaton.
GET/metaKutsujan identiteetti (auth.kind/key_id/agent_id/project_id) + tarinatyypin siirtymägraafi. Tunnistautunut (mikä tahansa kelvollinen avain; ei projektirajattu). Kutsu tätä ensin.

Nämä vaikuttavat kutsujaan ja tarvitsevat vain kelvollisen avaimen (ei projektiroolia).

MetodiPolkuKuvaus
POST/auth/registerRekisteröi uusi tili
POST/auth/loginKirjaudu sisään, palauttaa istuntotunnuksen
POST/auth/logoutKirjaudu ulos
POST/auth/forgot-passwordPyydä salasanan palautussähköposti
POST/auth/reset-passwordKäytä palautustunnusta uuden salasanan asettamiseen
GET/auth/verify-emailVahvista sähköpostiosoite
POST/auth/accept-invite/lookupSelvitä kutsutunnus → sähköposti (tunnistautumaton)
POST/auth/accept-inviteHyväksy projektikutsu (tunnistautumisen jälkeen)
GET/meNykyisen käyttäjän profiili
PUT/mePäivitä profiili
DELETE/mePoista tili
PUT/me/passwordVaihda salasana
PUT/me/settingsPäivitä asetukset (teema, ilmoitusasetukset)
POST/me/avatarLataa avatar (multipart)
POST/me/api-token/regenerateKierrätä API-tunnuksesi — mitätöi olemassa olevat istunnot/avaimet
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}Hallitse käyttäjän (ea_user_) API-avaimia
GET/me/activityToimintasi kaikkien projektien yli
GET/me/data-exportGDPR-itsevienti tiedoistasi
GET/me/consent · POST /me/consentLue / tallenna suostumus ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptOdottavat clickwrap-asiakirjat / tallenna hyväksyntä
POST/contact · POST /feedback · POST /feedback/with-screenshotYhteydenotto + sovelluksen sisäinen palaute

Siemenhaut, joita käytetään tarinoita luotaessa/arvioitaessa. Vakaat ID:t.

MetodiPolkuKuvaus
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scaleskäytettävissä olevat arviointiasteikot
GET/effort_scales/{scale_id}/valuesasteikon pistearvot
MetodiPolkuKuvaus
GET/projectsListaa projektisi
POST/projectsLuo projekti
GET/projects/{id}Hae projektin tiedot (viewer)
PUT/projects/{id}Päivitä projektin asetukset (owner)
DELETE/projects/{id}Poista projekti (owner)
GET/projects/{id}/audit-logProjektin toimintavirta (owner)
GET/projects/{id}/eventsKursorisivutettu tapahtumavirta (viewer) — katso Tapahtumat
MetodiPolkuKuvaus
GET/projects/{id}/membershipsListaa jäsenet (viewer)
POST/projects/{id}/membershipsKutsu jäsen sähköpostitse (owner)
PUT/projects/{id}/memberships/{mid}Päivitä rooli (owner)
DELETE/projects/{id}/memberships/{mid}Poista jäsen (owner)
GET / POST/projects/{id}/agent_keysListaa / luo agenttiavaimia (owner)
DELETE/projects/{id}/agent_keys/{kid}Peruuta agenttiavain (owner)

Kaikki tarinakirjoitukset vaativat member-roolin.

MetodiPolkuKuvaus
GET/projects/{id}/storiesListaa tarinat (sivutettu, suodatettavissa) (viewer)
POST/projects/{id}/storiesLuo tarina
GET/projects/{id}/stories/{sid}Hae yksi tarina (viewer)
PUT/projects/{id}/stories/{sid}Päivitä tarina
DELETE/projects/{id}/stories/{sid}Poista tarina
POST/projects/{id}/stories/{sid}/transitionsVaihda tilaa validoinnilla
POST/projects/{id}/stories/bulk_transitionSiirrä useita tarinoita (1–100) kerralla
POST/projects/{id}/stories/bulk-deletePoista useita tarinoita
POST/projects/{id}/stories/bulk-duplicateMonista useita tarinoita
POST/projects/{id}/stories/{sid}/duplicateMonista yksi tarina

Luo (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. labels hyväksyy ["auth"] tai [{ "name": "auth" }]; tuntemattomat tunnisteet luodaan. Oletukset: story_type=feature, current_state=unstarted.

Päivitä (PUT …/stories/{sid}): samat kentät, kaikki valinnaisia, lisäksi "position" (float) ja "force_state_change" (bool).

Siirtymä (POST …/transitions): { "to": "<state>", "reason"? }. Kenttä on to. Palauttaa { story_id, state }. Laiton siirto → 422 invalid_transition, jossa details: { from, to, allowed }.

Massasiirtymä (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? }. Jokainen tarina arvioidaan itsenäisesti; palauttaa { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

Kaikki member. Useimpien listaus/GET on (viewer).

MetodiPolkuRunko / huomiot
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? } — jätä molemmat pois lisätäksesi kutsujan
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-lataus (≤ 2 GB kukin); listaus on (viewer)

member kirjoituksille, (viewer) luvuille.

MetodiPolkuKuvaus
GET / POST/projects/{id}/labelsListaa / luo tunniste
PUT / DELETE/projects/{id}/labels/{lid}Päivitä / poista tunniste
POST/projects/{id}/labels/{lid}/archiveArkistoi (piilota pehmeästi) tunniste
MetodiPolkuKuvaus
GET/projects/{id}/iterationsListaa iteraatiot (member)
POST/projects/{id}/iterationsLuo manuaalinen iteraatio (owner)
DELETE/projects/{id}/iterations/{itid}Poista iteraatio (owner)
MetodiPolkuKuvaus
GET/projects/{id}/search?query=…Suodatinsyntaksihaku (viewer) — katso opas
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}Analytiikka (viewer). Iteraation poraus ottaa ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}Mittarit (viewer)
GET / PUT/projects/{id}/preferencesLautasi asetukset tälle projektille (member)
MetodiPolkuKuvaus
GET/projects/{id}/eventsKursorisivutettu tapahtumavirta (viewer)

Kyselyparametrit: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. Vastaus sisältää next_cursor. Välitä viimeisin näkemäsi event_id arvona since jatkaaksesi.

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

Interaktiiviseen käyttöliittymän etäohjaukseen ({ "action": "get_state", "id": "req-1" }). Ei datakanava — kaikki luvut/kirjoitukset kulkevat RESTin kautta. Vain yksi instanssi; ei jaeta replikoiden kesken.

Kirjoituspäätepisteet (POST, PUT, DELETE) hyväksyvät Idempotency-Key-otsakkeen. Sama avain + sama runko toistaa välimuistitetun vastauksen (24 tunnin ikkuna); sama avain + eri runko palauttaa 409 idempotency_conflict. Ei sovelleta metodeihin GET/HEAD/OPTIONS, polkuihin /auth/* tai /attachments. 5xx-vastauksia ei koskaan välimuistiteta — uudelleenyritys tavoittaa käsittelijän.

Listapäätepisteet hyväksyvät cursor=<opaque> ja limit=<n≤200>. Kun asetettu, vastaus on { "items": [...], "next_cursor": "<str|null>" }; välitä next_cursor takaisin sivuttaaksesi. Jotkin listat palauttavat myös X-Tracker-Pagination-Total-otsakkeen.

Listapäätepisteet hyväksyvät fields= (pilkuin erotettu) palauttaakseen vain tietyt kentät. story_id sisältyy aina; tuntematon kentän nimi palauttaa 400 validation_failed, jossa virheelliset nimet ovat kohdassa details.fields.

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

Jokaisella JSON-virheellä on code ja error; jotkin lisäävät details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
StatuscodeMilloin
400invalid_parametervirheellinen syöte; viesti kohdassa error, ei details (useimmat validoinnit: tyhjä/pituus/null-tavu/sähköposti)
400validation_failedjäsennelty syötevirhe; details.fields on taulukko virheellisten kenttien nimistä
401unauthenticatedpuuttuva/virheellinen tunnus
403unauthorized_operationtunnistautunut mutta riittämätön rooli
404unfound_resourceei löytynyt — palautetaan myös ei-jäsenille
409conflictresurssikonflikti (esim. duplikaatti)
409idempotency_conflictIdempotency-Key uudelleenkäytetty eri rungolla
422invalid_transitionlaiton tilasiirto; details kantaa { from, to, allowed }
500internal_errorpalvelinvika — yleinen viesti; turvallista yrittää uudelleen

details.fields on JSON-taulukko kenttien nimistä (esim. ["to"]), joskus lisäavaimin kuten max. Kenttä→viesti-karttaa ei ole.

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

Avainkohtainen (IP-kohtainen tunnistautumattomille päätepisteille), GCRA-token bucket:

  • Auth/auth/*: 0,5 pyyntöä/s, purske 20.
  • Julkinen/contact, /feedback: 0,2 pyyntöä/s, purske 10.
  • Arkaluonteinen — salasanan palautus: ~0,002 pyyntöä/s, purske 5.

Ylitetty raja palauttaa 429 Too Many Requests, jossa on Retry-After-otsake ja pelkkätekstinen runko (ei JSON-virhekuori).