Skip to content

Espesipikasyon ng API

Ang kumpletong sanggunian ng REST endpoint. Para sa mga tutorial at halimbawa, tingnan ang Gabay sa API.

Lahat ng kayang gawin ng isang miyembro ng proyekto sa web UI ay magagamit dito — ang SPA ay kumukonsumo ng parehong API na ito. Ang mga operasyong nangangailangan ng tungkuling owner ay minamarkahang (owner); lahat ng iba ay nangangailangan lamang ng membership sa proyekto (o, para sa mga read na minarkahang (viewer), anumang antas ng akses).

https://eastagiletracker.com/api/v1

Naghahatid ang https://api.eastagiletracker.com/api/v1 ng magkaparehong API. Lahat ng request at response ay JSON, maliban sa ilang file-upload endpoint na tumatanggap ng multipart.

Bawat na-authenticate na request ay nagpapadala ng API key sa pamamagitan ng isa sa:

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

Nagsisimula ang mga user key sa ea_user_. Nagsisimula ang mga agent key sa ea_agent_. Tingnan ang Gabay sa API → Dalawang uri ng key.

Mga endpoint na walang authentication: /openapi.json, /docs, ang mga endpoint na /auth/*, at ang mga reference-data na lookup (/story_types, /story_states, /effort_scales, …). Ang /meta ay authenticated — gumagana ang anumang wastong key, ngunit hindi ito scoped-sa-proyekto (naaabot din ito ng project-bound na agent key).

Tatlong antas ang nagkokontrol sa mga endpoint na scoped-sa-proyekto:

AntasSino ang pumapasaKaraniwang mga operasyon
viewerviewer, member, ownermga read (list/get stories, search, analytics)
membermember, ownerlahat ng write ng work-item (stories, tasks, comments, …)
ownerowner lamangmga setting ng proyekto, pamamahala ng membership, agent keys, delete, import, audit log

Ang isang hindi-miyembro ay tumatanggap ng 404 unfound_resource (hindi 403) sa mga path ng proyekto, kaya hindi maaabakada ang mga project ID.

MethodPathPaglalarawan
GET/openapi.jsonAng buháy na OpenAPI 3 spec. Walang authentication.
GET/docsSwagger UI. Walang authentication.
GET/metaIdentidad ng caller (auth.kind/key_id/agent_id/project_id) + ang story-type transition graph. Authenticated (anumang wastong key; hindi scoped-sa-proyekto). Tawagin ito muna.

Ang mga ito ay kumikilos sa caller at nangangailangan lamang ng wastong key (walang tungkulin sa proyekto).

MethodPathPaglalarawan
POST/auth/registerMagrehistro ng bagong account
POST/auth/loginMag-sign in, nagbabalik ng session token
POST/auth/logoutMag-sign out
POST/auth/forgot-passwordHumiling ng password-reset na email
POST/auth/reset-passwordGumamit ng reset token upang magtakda ng bagong password
GET/auth/verify-emailI-verify ang isang email address
POST/auth/accept-invite/lookupLutasin ang invitation token → email (walang authentication)
POST/auth/accept-inviteTanggapin ang imbitasyon sa proyekto (pagkatapos mag-authenticate)
GET/meProfile ng kasalukuyang user
PUT/meI-update ang profile
DELETE/meI-delete ang account
PUT/me/passwordBaguhin ang password
PUT/me/settingsI-update ang mga setting (theme, mga kagustuhan sa abiso)
POST/me/avatarMag-upload ng avatar (multipart)
POST/me/api-token/regenerateIikutin ang iyong API token — pinapawalang-bisa ang umiiral na mga session/key
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}Pamahalaan ang user (ea_user_) na mga API key
GET/me/activityAng iyong aktibidad sa lahat ng proyekto
GET/me/data-exportGDPR na self-export ng iyong datos
GET/me/consent · POST /me/consentBasahin / itala ang consent ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptMga nakabinbing clickwrap na dokumento / itala ang pagtanggap
POST/contact · POST /feedback · POST /feedback/with-screenshotContact + in-app na feedback

Mga seed na lookup na ginagamit kapag lumilikha/nagtatantiya ng mga story. Mga stable na ID.

MethodPathPaglalarawan
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalesmga magagamit na estimate scale
GET/effort_scales/{scale_id}/valuesang mga point value sa isang scale
MethodPathPaglalarawan
GET/projectsIlista ang iyong mga proyekto
POST/projectsGumawa ng proyekto
GET/projects/{id}Kunin ang mga detalye ng proyekto (viewer)
PUT/projects/{id}I-update ang mga setting ng proyekto (owner)
DELETE/projects/{id}Mag-delete ng proyekto (owner)
GET/projects/{id}/audit-logStream ng aktibidad ng proyekto (owner)
GET/projects/{id}/eventsCursor-paginated na event stream (viewer) — tingnan ang Events
MethodPathPaglalarawan
GET/projects/{id}/membershipsIlista ang mga miyembro (viewer)
POST/projects/{id}/membershipsMag-imbita ng miyembro sa pamamagitan ng email (owner)
PUT/projects/{id}/memberships/{mid}I-update ang tungkulin (owner)
DELETE/projects/{id}/memberships/{mid}Mag-alis ng miyembro (owner)
GET / POST/projects/{id}/agent_keysIlista / mag-mint ng mga agent key (owner)
DELETE/projects/{id}/agent_keys/{kid}Magbawi ng agent key (owner)

Lahat ng story write ay nangangailangan ng tungkuling member.

MethodPathPaglalarawan
GET/projects/{id}/storiesIlista ang mga story (paginated, mafi-filter) (viewer)
POST/projects/{id}/storiesGumawa ng story
GET/projects/{id}/stories/{sid}Kunin ang isang story (viewer)
PUT/projects/{id}/stories/{sid}I-update ang isang story
DELETE/projects/{id}/stories/{sid}Mag-delete ng story
POST/projects/{id}/stories/{sid}/transitionsBaguhin ang estado nang may validation
POST/projects/{id}/stories/bulk_transitionI-transition ang maraming story (1–100) nang sabay-sabay
POST/projects/{id}/stories/bulk-deleteMag-delete ng maraming story
POST/projects/{id}/stories/bulk-duplicateI-duplicate ang maraming story
POST/projects/{id}/stories/{sid}/duplicateI-duplicate ang isang story

Create (POST …/stories): { "name" (kinakailangan), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. Tinatanggap ng labels ang ["auth"] o [{ "name": "auth" }]; nililikha ang hindi kilalang mga label. Mga default: story_type=feature, current_state=unstarted.

Update (PUT …/stories/{sid}): parehong mga field, lahat opsyonal, kasama ang "position" (float) at "force_state_change" (bool).

Transition (POST …/transitions): { "to": "<state>", "reason"? }. Ang field ay to. Nagbabalik ng { story_id, state }. Ilegal na galaw → 422 invalid_transition na may details: { from, to, allowed }.

Bulk transition (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? }. Bawat story ay hinuhusgahan nang nag-iisa; nagbabalik ng { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

Lahat ay member. Ang List/GET sa karamihan ay (viewer).

MethodPathBody / mga tala
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) } o { 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? } — alisin pareho upang idagdag ang caller
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 bawat isa); ang list ay (viewer)

member para sa mga write, (viewer) para sa mga read.

MethodPathPaglalarawan
GET / POST/projects/{id}/labelsIlista / lumikha ng label
PUT / DELETE/projects/{id}/labels/{lid}I-update / i-delete ang label
POST/projects/{id}/labels/{lid}/archiveI-archive (soft-hide) ang label
MethodPathPaglalarawan
GET/projects/{id}/iterationsIlista ang mga iteration (member)
POST/projects/{id}/iterationsGumawa ng manu-manong iteration (owner)
DELETE/projects/{id}/iterations/{itid}Mag-delete ng iteration (owner)
MethodPathPaglalarawan
GET/projects/{id}/search?query=…Paghahanap sa filter syntax (viewer) — tingnan ang Gabay
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}Analytics (viewer). Kinukuha ng iteration drilldown ang ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}Metrics (viewer)
GET / PUT/projects/{id}/preferencesAng iyong mga kagustuhan sa board para sa proyektong ito (member)
MethodPathPaglalarawan
GET/projects/{id}/eventsCursor-paginated na event stream (viewer)

Mga query parameter: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. Kasama sa tugon ang next_cursor. Ipasa ang huling event_id na nakita mo bilang since upang magpatuloy.

MethodPathPaglalarawan
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>

Para sa interaktibong UI remote-control ({ "action": "get_state", "id": "req-1" }). Hindi isang data channel — lahat ng read/write ay dumadaan sa REST. Single-instance lamang; hindi naka-fan-out sa mga replica.

Tinatanggap ng mga write endpoint (POST, PUT, DELETE) ang header na Idempotency-Key. Parehong key + parehong body ay nag-rereplay ng naka-cache na tugon (24-oras na window); parehong key + isang kaibang body ay nagbabalik ng 409 idempotency_conflict. Hindi inilalapat sa GET/HEAD/OPTIONS, /auth/*, o /attachments na mga path. Hindi kailanman naka-cache ang mga 5xx na tugon — naaabot ng retry ang handler.

Tinatanggap ng mga list endpoint ang cursor=<opaque> at limit=<n≤200>. Kapag itinakda, ang tugon ay { "items": [...], "next_cursor": "<str|null>" }; ipasa pabalik ang next_cursor upang mag-page. Ang ilang listahan ay nagbabalik din ng header na X-Tracker-Pagination-Total.

Tinatanggap ng mga list endpoint ang fields= (comma-separated) upang magbalik lamang ng mga tiyak na field. Palaging kasama ang story_id; ang hindi kilalang pangalan ng field ay nagbabalik ng 400 validation_failed na may mga nagkakasalang pangalan sa details.fields.

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

Bawat JSON na error ay may code at error; ang ilan ay nagdaragdag ng details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
StatuscodeKailan
400invalid_parametermasamang input; mensahe sa error, walang details (karamihan sa validation: blank/length/null-byte/email)
400validation_failedstructured na input error; ang details.fields ay isang array ng mga nagkakasalang pangalan ng field
401unauthenticatednawawala/imbalidong token
403unauthorized_operationna-authenticate ngunit hindi sapat na tungkulin
404unfound_resourcehindi nahanap — ibinabalik din sa mga hindi-miyembro
409conflictsalungatan sa rekurso (hal. duplicate)
409idempotency_conflictIdempotency-Key na muling ginamit na may kaibang body
422invalid_transitionilegal na galaw ng estado; dala ng details ang { from, to, allowed }
500internal_errorpagkakamali ng server — generic na mensahe; ligtas ulitin

Ang details.fields ay isang JSON na array ng mga pangalan ng field (hal. ["to"]), kung minsan ay may dagdag na mga key tulad ng max. Walang field→message na mapa.

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

Per-key (per-IP para sa mga endpoint na walang authentication), GCRA token bucket:

  • Auth/auth/*: 0.5 req/s, burst 20.
  • Public/contact, /feedback: 0.2 req/s, burst 10.
  • Sensitive — password-reset: ~0.002 req/s, burst 5.

Ang isang lumampas na limit ay nagbabalik ng 429 Too Many Requests na may header na Retry-After at isang plain-text na body (hindi ang JSON na error envelope).