Skip to content

Spesifikasi API

Rujukan endpoint REST yang lengkap. Untuk tutorial dan contoh, lihat Panduan API.

Segala yang ahli projek boleh lakukan dalam UI web tersedia di sini — SPA menggunakan API yang sama ini. Operasi yang memerlukan peranan manager ditandakan (manager); segala yang lain hanya memerlukan keahlian projek (atau, untuk bacaan yang ditandakan (viewer), mana-mana tahap akses). Jadual di bawah menamakan setiap kumpulan laluan yang dipasang oleh pelayan; kumpulan yang diringkaskan dalam satu baris diterangkan sepenuhnya dalam openapi.json langsung.

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 menghidangkan API yang serupa. Semua permintaan dan respons adalah JSON, kecuali beberapa endpoint muat-naik-fail yang menerima multipart.

Dua kumpulan berada satu tahap di atas, di bawah /api dan bukannya /api/v1: permukaan pengesahan (/api/auth/*) dan borang awam (/api/contact, /api/feedback). Ejaan /api/v1/… bagi kumpulan ini memulangkan 404.

Setiap permintaan yang disahkan menghantar bukti kelayakan melalui salah satu daripada:

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

Kunci pengguna bermula dengan ea_user_, kunci ejen dengan ea_agent_, dan token akses MCP dengan ea_mcp_. Lihat Panduan API → Tiga jenis bukti kelayakan.

Endpoint tidak disahkan: /openapi.json, /docs, endpoint /api/auth/*, dan carian rujukan-data (/story_types, /story_states, /effort_scales, /priority_scales). /meta adalah disahkan — mana-mana kunci yang sah berfungsi, tetapi ia tidak berskop-projek (kunci ejen terikat-projek juga mencapainya).

Empat tahap mengawal endpoint berskop-projek:

TahapSiapa yang lulusOperasi tipikal
public viewersesiapa sahaja, pada projek yang keterlihatannya awambacaan papan: story, iterasi, carian, aktiviti story dan epik (dengan butiran pelaku disunting keluar)
viewerviewer, member, managerbacaan (senarai/dapat story, carian, metrik, senarai format eksport)
membermember, managersemua penulisan item-kerja (story, tugas, ulasan, …), aliran peristiwa
managermanager sahajatetapan projek, pengurusan keahlian, kunci ejen, padam, import, muat turun eksport, sandaran, log audit

Ejen memegang peranan yang sama seperti ahli — viewer, member, atau manager — dihadkan pada peranan ahli yang mencetak kunci itu. Bukan ahli menerima 404 unfound_resource (bukan 403) pada laluan projek persendirian, jadi ID projek tidak boleh dibilang.

KaedahLaluanPenerangan
GET/openapi.jsonSpesifikasi OpenAPI 3 langsung, termasuk badan permintaan. Tidak disahkan.
GET/docsSwagger UI. Tidak disahkan.
GET/metaIdentiti pemanggil (auth.kind/key_id/agent_id/project_id) + graf peralihan jenis-story. Disahkan (mana-mana kunci yang sah; bukan berskop-projek). Panggil ini dahulu.
GET/api/health · /api/configKeaktifan, dan konfigurasi awam deployment (mod organisasi tunggal, ciri pilihan yang dihidupkan, nama instans). Tidak disahkan, di luar /v1.

Endpoint sesi, tidak disahkan melainkan dinyatakan. SPA memacu endpoint ini; skrip biasanya menggunakan kunci API sebaliknya.

KaedahLaluanPenerangan
POST/auth/registerDaftar akaun baharu — dilindungi reCAPTCHA; akaun kemudian melalui cabaran SMS
POST/auth/sms/challenge · /auth/sms/status · /auth/sms/bypassHantar / semak kod SMS pendaftaran (bypass dikawal oleh pengendali)
GET/auth/configKaedah daftar masuk yang ditawarkan oleh deployment
POST/auth/loginDaftar masuk dengan e-mel + kata laluan; memulangkan JWT sesi, atau cabaran TOTP
POST/auth/login/totpSelesaikan daftar masuk dengan kod pengesah atau kod pemulihan
POST/auth/passkey/login/start · /auth/passkey/login/finishDaftar masuk WebAuthn tanpa kata laluan
GET/auth/oauth/github/start · /auth/oauth/github/callback · /auth/oauth/google/start · /auth/oauth/google/callback · POST /auth/oauth/exchangeDaftar masuk OAuth dengan GitHub atau Google
POST/auth/refresh · /auth/refresh/revokePutar refresh token / batalkannya
POST/auth/logoutDaftar keluar (membatalkan refresh token)
POST/auth/forgot-password · /auth/reset-passwordMinta e-mel tetapan semula / gunakan token tetapan semula
POST/auth/accept-invite/lookup · /auth/accept-inviteSelesaikan token jemputan → e-mel / terima jemputan projek (selepas pengesahan)

Ini bertindak pada pemanggil dan hanya memerlukan kunci yang sah (tiada peranan projek).

KaedahLaluanPenerangan
GET/meProfil pengguna semasa
PUT/meKemas kini profil
DELETE/mePadam akaun — ditolak selagi anda satu-satunya pemilik organisasi atau projek yang mempunyai ahli lain
GET/me/deletion-impactApa yang akan dikeluarkan oleh pemadaman akaun dan apa yang menghalangnya
PUT/me/passwordTukar kata laluan
PUT/me/settingsKemas kini tetapan (tema, keutamaan pemberitahuan)
POST/me/avatarMuat naik avatar (multipart)
POST/me/api-token/regeneratePutar token API anda — membatalkan sesi/kunci sedia ada
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}Urus kunci API pengguna (ea_user_)
GET/me/totp · POST /me/totp/setup · /me/totp/verify · /me/totp/disablePendaftaran dua faktor (TOTP); verify memulangkan kod pemulihan sekali sahaja
GET/me/passkeys · POST /me/passkeys/register/start · /me/passkeys/register/finish · DELETE /me/passkeys/{credential_id}Pendaftaran dan pembuangan passkey
GET/me/oauth_grants · DELETE /me/oauth_grants/{grant_id}Aplikasi bersambung — klien MCP dan aplikasi OAuth yang telah anda benarkan
GET/me/activityAktiviti anda merentasi semua projek
GET/me/storiesStory yang anda miliki, minta, atau ikuti merentasi setiap projek yang boleh dicapai oleh token — role=owned|requested|following, state=, cursor= / limit= (maksimum 200)
GET/me/mentions · POST /me/mentions/{mention_id}/ackPeti masuk @-sebutan (unacked=true untuk menapis) dan pengakuan — juga digabungkan ke dalam suapan pemberitahuan di bawah
GET/me/data-exportEksport-sendiri GDPR data anda
GET/me/consent · POST /me/consentBaca / rekod persetujuan ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptDokumen clickwrap tertangguh / rekod penerimaan
GET / PUT/agent/meIdentiti dan profil kunci ejen itu sendiri, boleh dibaca dan disunting oleh ejen (rakan pihak-ejen bagi /me)
POST/api/contact · /api/feedback · /api/feedback/with-screenshotHubungi + maklum balas dalam-aplikasi. Di luar /v1; had kadar setiap IP

Carian benih digunakan semasa mencipta/menganggar story. ID stabil.

KaedahLaluanPenerangan
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalesskala anggaran yang tersedia
GET/effort_scales/{scale_id}/valuesnilai mata dalam skala
GET/priority_scales · /priority_scales/{scale_id}/valuesskala keutamaan dan nilainya (priority_id pada story diselesaikan di sini)

Perkhidmatan yang dihos sahaja — pemasangan hos sendiri berjalan dalam mod organisasi tunggal dan tidak memasang laluan ini (kecuali senarai organisasi). Peranan ialah peranan organisasi: owner, admin, member.

KaedahLaluanPenerangan
GET / POST/organizationsSenaraikan organisasi anda / cipta satu
GET / PUT / DELETE/organizations/{oid}Baca, namakan semula (nama + slug; pemilik atau admin), padam
GET / POST/organizations/{oid}/memberships · PUT / DELETE …/memberships/{member_id}Ahli dan jemputan; jemputan membawa siling peranan (tidak pernah melebihi peranan pemanggil; owner tidak pernah dijemput)
POST/organizations/{oid}/memberships/bulk-role · …/memberships/bulk-removeTukar peranan atau alih keluar sehingga 200 ahli sekali gus. Semua atau tiada: kelompok yang akan mengalih keluar owner terakhir atau meninggalkan projek tanpa pemilik ditolak sepenuhnya; dengan reassign_confirmed anda menjadi pemilik projek tersebut
DELETE/organizations/{oid}/invitations/{invitation_id}Batalkan jemputan tertangguh
POST/organizations/{oid}/transfer-ownershipSerahkan peranan pemilik kepada ahli lain
PUT/organizations/{oid}/memberships/{member_id}/anonymizationSembunyikan nama / e-mel / avatar ahli di seluruh organisasi
GET/organization-invitations/{token} · POST …/{token}/acceptSelesaikan / terima jemputan organisasi yang dihantar melalui e-mel
POST/organizations/{oid}/export · GET / POST …/export/jobs · GET …/export/jobs/{job_id} · …/export/jobs/{job_id}/downloadEksport organisasi untuk pemilik sahaja: zip dengan longgokan SQL dan setiap lampiran, dijalankan sebagai kerja
KaedahLaluanPenerangan
GET/projectsSenaraikan projek anda (limit ≤ 200)
POST/projectsCipta projek
GET/projects/{id}Dapatkan butiran projek (viewer)
PUT/projects/{id}Kemas kini tetapan projek (manager)
DELETE/projects/{id}Padam projek (manager)
POST/projects/{id}/pinSemat / nyahsemat projek pada senarai projek anda
POST/projects/{id}/transfer-organizationPindahkan projek ke organisasi lain (manager)
POST/projects/{id}/slack/testHantar mesej ujian ke suapan Slack projek (manager)
GET / POST/projects/{id}/showcase_claim_eligibility · /projects/{id}/showcase_claim · /projects/{id}/showcase_seedProjek pameran awam: semak sama ada anda boleh menuntutnya, tuntutnya, benihkannya
GET/projects/{id}/audit-logBacaan log audit — sejarah projek serta aktiviti setiap-story / setiap-epik melalui surface=; akses berbeza mengikut surface, lihat di bawah
GET/projects/{id}/eventsAliran peristiwa berhalaman-kursor (member) — lihat Peristiwa

Parameter pertanyaan log audit: event_type= (satu jenis atau senarai dipisah koma), limit= (≤ 1000), before= (kursor keyset, created_at ISO-8601), surface= (project_history, story_activities, epic_activities), target_id= (id story/epik — wajib apabila surface=story_activities atau epic_activities). Akses: log tanpa tapisan dan surface=project_history ialah (manager); story_activities / epic_activities boleh dibaca oleh mana-mana ahli projek, dan secara tanpa nama pada projek awam dengan PII pelaku disunting keluar.

KaedahLaluanPenerangan
GET/projects/{id}/membershipsSenaraikan ahli (viewer)
POST/projects/{id}/membershipsJemput ahli melalui e-mel (manager)
PUT/projects/{id}/memberships/{mid}Kemas kini peranan (manager)
DELETE/projects/{id}/memberships/{mid}Keluarkan ahli (manager)
GET/projects/{id}/addable-members · POST /projects/{id}/members/add-existingAhli organisasi yang belum berada dalam projek / tambah seorang tanpa jemputan e-mel (manager)
POST/projects/{id}/members/joinPemilik atau admin organisasi menyertai projek dalam organisasinya sebagai manager, atau menaikkan diri sendiri menjadi manager (tindakan Make me owner pada senarai projek)
PUT/projects/{id}/members/{mid}/anonymizationSembunyikan nama / e-mel / avatar ahli pada projek ini (manager)
GET / POST/projects/{id}/agent_keysSenaraikan / cetak kunci ejen — pengurus, atau peranan yang dibenarkan oleh dasar peranan pencipta projek
DELETE/projects/{id}/agent_keys/{kid}Batalkan kunci ejen
GET/projects/{id}/agent_keys/onboardingPakej orientasi: gesaan dan fail konfigurasi untuk klien ejen yang biasa
GET/projects/{id}/agents · GET / PUT /projects/{id}/agents/{aid}Ejen projek dan profil mereka (nama, inisial, penerangan, warna)
POST/projects/{id}/agents/{aid}/rotate-key · /projects/{id}/agents/{aid}/avatarPutar kunci ejen (identiti dan sejarah dikekalkan) / muat naik avatarnya

Semua penulisan story memerlukan peranan member.

KaedahLaluanPenerangan
GET/projects/{id}/storiesSenaraikan story (berhalaman, boleh ditapis) (viewer)
POST/projects/{id}/storiesCipta story
GET/projects/{id}/stories/{sid}Dapatkan satu story (viewer)
PUT/projects/{id}/stories/{sid}Kemas kini story
DELETE/projects/{id}/stories/{sid}Padam story
POST/projects/{id}/stories/{sid}/transitionsTukar keadaan dengan pengesahan
POST/projects/{id}/stories/{sid}/reject · /projects/{id}/stories/{sid}/restartTolak story yang delivered / kembalikan story yang ditolak ke started (rejected adalah terminal bagi /transitions)
POST/projects/{id}/stories/{sid}/archive · /projects/{id}/stories/{sid}/unarchiveArkib / nyaharkib satu story
POST/projects/{id}/stories/bulk_transitionUbah banyak story (1–100) sekaligus
POST/projects/{id}/stories/bulk-archive · bulk-delete · bulk-duplicate · bulk-moveArkib, padam, pendua, atau pindah (ke panel / kedudukan) banyak story
POST/projects/{id}/stories/{sid}/duplicatePendua satu story
GET / POST / DELETE/projects/{id}/stories/{sid}/epics · …/epics/{eid}Keahlian epik story
GET/short-links/{code} · /story-referencesSelesaikan pautan pendek /s/<code> kepada story-nya / selesaikan sehingga 100 rujukan story (#id, URL) kepada story yang boleh dibaca pemanggil

Parameter pertanyaan senarai story: archived= (exclude lalai / include / only — penapis arkib tiga-keadaan; menggantikan include_archived=true yang telah lapuk, kini alias untuk archived=include), include_done=true (memasukkan story panel Done yang dibekukan pada iterasi lepas, dikecualikan secara lalai). Penghalamanan (cursor= / limit= / offset=) dan set medan jarang (fields=) mengikut Penghalamanan dan Unjuran medan.

Cipta (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. estimate ialah label nilai skala sebagai rentetan ("3", "13"); nombor JSON ditolak. labels menerima ["auth"] atau [{ "name": "auth" }]; label tidak diketahui dicipta. Lalai: story_type=feature, current_state=unstarted.

Kemas kini (PUT …/stories/{sid}): medan yang sama, semua pilihan, ditambah "position" (float), "force_state_change" (bool), dan "expected_updated_at" (RFC 3339 — simpanan penerangan ditolak dengan 409 stale_write jika story telah berubah sejak anda membacanya). Penulisan story juga mematuhi If-Match terhadap ETag story; ketidakpadanan ialah 412 precondition_failed.

Peralihan (POST …/transitions): { "to": "<state>" }. Medan ialah to. Memulangkan { story_id, state }. Gerakan tidak sah → 422 invalid_transition dengan details: { from, to, allowed }.

Peralihan pukal (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>" }. Setiap story dihakimi secara bebas; memulangkan { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

Semua member. Senarai/GET pada kebanyakannya ialah (viewer).

KaedahLaluanBadan / nota
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) } atau { comment_emoji }. GET mengambil fields= (senarai dibenarkan: comment_id, story_comment_id, story_id, comment_text, comment_emoji, member, created) serta 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; URL GitHub /pull/ dan /tree/ diberi jenis secara automatik
GET / POST/projects/{id}/stories/{sid}/reviews · PUT/DELETE …/reviews/{rid}Cipta: { reviewer_id? / reviewer_agent_id?, comment? } — tinggalkan kedua-duanya untuk menugaskan diri anda. Kemas kini: { status, comment? }
GET / POST/projects/{id}/stories/{sid}/owners · DELETE …/owners/{mid} · DELETE …/owners/agents/{aid}{ member_id? / agent_id? } — tinggalkan kedua-duanya untuk menambah pemanggil
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}muat naik multipart — video ≤ 200 MB, PDF / Word / Excel ≤ 25 MB, imej / CSV / teks ≤ 10 MB; senarai ialah (viewer)
GET / POST/projects/{id}/stories/{sid}/link-attachments · DELETE …/link-attachments/{laid}Lampiran pautan — URL luar yang disimpan bersama lampiran fail dan bukannya sebagai pautan kod
GET/attachments/{token} · /api/avatars/{token}Bacaan beralamat-token bagi lampiran atau avatar — URL yang diberikan oleh API; tiada X-TrackerToken diperlukan

Bentuk yang sama seperti story, tanpa mesin keadaan. member untuk penulisan, (viewer) untuk bacaan.

KaedahLaluanPenerangan
GET / POST/projects/{id}/epics · GET / PUT / DELETE …/epics/{eid}Epik membawa nama, penerangan Markdown, dan label sandaran yang menghimpunkan story-nya
GET / POST / PUT / DELETE…/epics/{eid}/comments · …/comments/{cid}Ulasan epik
GET / POST / DELETE…/epics/{eid}/owners · …/followers (+ varian /agents/{aid})Pemilik dan pengikut, ahli atau ejen — pemilik epik diwarisi oleh story-nya
GET / POST / DELETE…/epics/{eid}/attachments (+ /json) · …/link-attachmentsLampiran, had yang sama seperti story
GET/projects/{id}/analytics/epics · …/analytics/epics/{eid}Kemajuan setiap epik: burnup, daya pemprosesan, kesihatan, ramalan (viewer)

member untuk penulisan, (viewer) untuk bacaan.

KaedahLaluanPenerangan
GET / POST/projects/{id}/labelsSenaraikan / cipta label
PUT / DELETE/projects/{id}/labels/{lid}Kemas kini / padam label
POST/projects/{id}/labels/{lid}/archiveArkib (sembunyi-lembut) label

Bacaan terbuka kepada mana-mana peranan projek, dan tanpa nama pada projek awam.

KaedahLaluanPenerangan
GET/projects/{id}/iterationsSenaraikan iterasi (≤ 500 setiap halaman; membawa ETag dan pengepala sambungan X-Tracker-Pagination-* apabila dipotong)
GET/projects/{id}/iterations/{itid}Satu iterasi
GET/projects/{id}/iterations/first-previewTarikh yang akan diberikan kepada iterasi pertama, ditunjukkan dalam pengesahan pembenihan
POST/projects/{id}/iterationsCipta iterasi manual (member)
DELETE/projects/{id}/iterations/{itid}Padam iterasi (manager)
PUT/projects/{id}/iterations/{itid}/velocityAtasi velocity satu iterasi tanpa menukar strategi projek (manager)
GET/projects/{id}/iterations/{itid}/done-storiesStory yang diterima bagi iterasi yang ditutup, berhalaman
KaedahLaluanPenerangan
GET/projects/{id}/search?q=…Carian berkuasa — teks penuh + kelayakan faset / julat tarikh / orang (DSL gaya GitHub); memulangkan { results, total, limit, offset }. query ialah alias bagi q; limit= (lalai 50, maksimum 1000) / offset= untuk penghalamanan; sort= menyusun mengikut relevance (lalai), created, created_asc, state, atau updated. (viewer) — lihat Panduan
GET/projects/{id}/metrics/{velocity,burndown,story-types,contributors}Siri data halaman Metrics (viewer); metrik epik berada di bawah /analytics/epics di atas
GET/projects/{id}/backlog/groupingKumpulan iterasi yang diunjurkan oleh Backlog (viewer)
GET / PUT/projects/{id}/preferencesKeutamaan papan anda untuk projek ini — mana-mana peranan projek, baris anda sendiri sahaja
KaedahLaluanPenerangan
GET/projects/{id}/eventsAliran peristiwa berhalaman-kursor (member) — viewer mendapat 403

Parameter pertanyaan: since=<event_id>, types=story.created,story.transitioned,comment.added,…, limit= (≤ 500), cursor=. Respons termasuk next_cursor. Hantar event_id terakhir yang anda lihat sebagai since untuk menyambung.

Suapan pemberitahuan bersepadu dalam aplikasi: baris pemberitahuan kelas pertama (permintaan semakan, aktiviti story, jemputan, …) digabungkan dengan peti masuk @-sebutan menjadi satu aliran, terbaharu dahulu. Id suapan berawalan sumber (nt-… / sc-… / ec-…). Sesi ahli dan kunci ea_user_* membaca baris pihak-ahli mereka; kunci ea_agent_* baris pihak-ejennya.

KaedahLaluanPenerangan
GET/me/notificationsSuapan pemberitahuan anda. Penapis: unread=true, since_id=, kind= (mentions / reviews / stories / invitations); halaman melalui cursor= / limit=
GET/me/notifications/unread-countJumlah belum dibaca — { unread_count, by_category: { mentions, reviews, stories, invitations } }
POST/me/notifications/read-allTandakan semua sebagai dibaca; memulangkan kiraan terkini
POST/me/notifications/{id}/ackTandakan satu item sebagai dibaca (idempoten)
POST/me/notifications/{id}/acceptTerima jemputan projek / organisasi terus daripada suapan (token ahli sahaja)
POST/me/notifications/{id}/declineTolak jemputan projek / organisasi (token ahli sahaja)
GET/me/notifications/resolve-invite?token=…Padankan token jemputan yang dihantar melalui e-mel dengan id pemberitahuan anda — { "id": "nt-…" } atau { "id": null }
GET/me/notifications/streamPush langsung — Server-Sent Events (text/event-stream); lihat di bawah

Endpoint stream bukan endpoint JSON dan oleh itu tiada dalam spesifikasi OpenAPI: ia mengekalkan sambungan terbuka dan memancarkan bingkai tanpa payload ({"type":"notification","kind":…}) setiap kali sesuatu yang baharu tiba, memberitahu klien supaya mengambil semula suapan. Sambungan ditamatkan di pihak pelayan selepas 45 minit — sambung semula dan sahkan semula. Sesi ahli dan kunci ea_user_* sahaja; kunci ea_agent_* menerima 403.

KaedahLaluanPenerangan
POST/projects/{id}/importSumber fail: source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json, eat. Multipart file=. Segerak — menjawab dengan kiraan hasil.
POST/projects/{id}/import/jsonBadan JSON; source=github tidak memerlukan fail — owner, repo, token pilihan, dan bendera pilih-masuk include_pull_requests / include_milestones / include_releases / include_dependencies; sumber fail menghantar file_base64. Tak segerak: memulangkan 202 { import_id, status }. Pelayan mengambil melalui API GraphQL GitHub, yang menolak pemanggil tanpa nama, jadi sebuah token sentiasa sampai ke GitHub — milik anda, atau token kongsi deployment. Lihat Panduan.
GET/projects/{id}/imports/{import_id}Tinjau kerja: status bergerak pending → fetching → writing → done | failed, dengan progress_current / progress_total semasa pengambilan dan kiraan hasil pada done

Satu import berjalan bagi setiap projek pada satu masa; POST kedua semasa satu sedang berjalan ialah 409 import_already_running. dry_run: true (badan JSON atau multipart dry_run=true) mempratonton mana-mana sumber: menghurai, menyelesaikan, menyahduplikasi, menghasilkan kiraan { imported, skipped, errors, unmatched } yang sama, kemudian mengundur — tiada apa yang ditulis. Had: badan 10 MiB dan 5,000 story setiap import bagi sumber berasaskan fail (melebihi salah satu → 400, tiada apa ditulis). Sumber GitHub tiada siling — ia menulis secara berkelompok dan bukan dalam satu transaksi. Import semula adalah idempoten mengikut id sumber — baris yang telah diimport dilangkau, bukan diduplikasi.

KaedahLaluanPenerangan
GET/projects/{id}/export/formatsFormat berdaftar: { id, name, content_type, drops, includes_archived }. Mana-mana peranan projek.
GET/projects/{id}/export/{format}Muat turun satu (manager). Pertukaran: eat (kesetiaan penuh), jira, pivotal, shortcut, trello, asana, gitlab, linear, plane, plane_json; dokumen: pdf, docx.
GET/projects/{id}/export/attachmentsSetiap lampiran sebagai satu zip boleh-layar (fail mengekalkan nama asal; manifes JSON + CSV) (manager).

Eksport dokumen (pdf, docx) mengambil parameter pertanyaan tambahan: page_size= (letter lalai / a4 / legal / folio), from= / to= (sempadan tetingkap story — RFC 3339 atau YYYY-MM-DD sahaja; story berada dalam julat apabila created atau completed_at-nya jatuh di dalamnya), include_icebox= / include_backlog= (kedua-duanya lalai false, jadi eksport boleh-kongsi hanya menunjukkan kerja terjadual / sedang berjalan). Format CSV pertukaran mengabaikannya.

KaedahLaluanPenerangan
GET / POST/projects/{id}/backups · GET …/backups/{snapshot_id} · …/backups/healthSenaraikan snapshot, ambil satu sekarang, baca satu, dan ringkasan kesihatan pengekalan
GET / POST/projects/{id}/restores · POST …/restores/partial · GET …/restores/{restore_id}Pulihkan keseluruhan snapshot, atau jadual terpilih daripadanya, dan tinjau pemulihan

POST itu berada pada peringkat had kadar sensitif (di bawah).

East Agile Tracker ialah penyedia OAuth 2.1 untuk klien MCP. Klien menemuinya di /.well-known/oauth-authorization-server dan /.well-known/oauth-protected-resource/mcp, menghantar anda ke /oauth/authorize (halaman persetujuan), menukar kod di /oauth/token, dan kemudian bercakap MCP di /mcp dengan token ea_mcp_* yang terhasil. Geran disenaraikan dan dibatalkan di /me/oauth_grants. Endpoint penyedia mempunyai peringkat had kadar tersendiri.

wss://eastagiletracker.com/ws/control?token=<session JWT>

Untuk kawalan-jauh UI interaktif ({ "action": "get_state", "id": "req-1" }). Token ialah JWT sesi pelayar — kunci API ditolak dengan 401 sebelum naik taraf sambungan. Bukan saluran data — semua bacaan/penulisan melalui REST. Satu-instance sahaja; tidak disebarkan merentasi replika.

Endpoint penulisan (POST, PUT, DELETE) menerima pengepala Idempotency-Key. Kunci yang sama + badan yang sama memainkan semula respons tercache (tetingkap 24 jam); kunci yang sama + badan yang berbeza memulangkan 409 idempotency_conflict. Kunci diskopkan kepada bukti kelayakan yang menghantarnya. Tidak digunakan pada GET/HEAD/OPTIONS, /openapi.json dan /docs, /api/auth/*, atau muat naik multipart pada laluan /attachments. Respons yang terhenti sebelum jawapan domain tidak pernah dicache — 401, 403, 404, 429, dan setiap 5xx — jadi cuba semula selepas mana-mana daripadanya mencapai pengendali; 400, 409, 412, dan 422 ialah jawapan domain dan dimainkan semula seperti kejayaan.

Endpoint senarai menerima cursor=<opaque> dan limit=<n>. Apabila ditetapkan, respons ialah { "items": [...], "next_cursor": "<str|null>" }; hantar next_cursor kembali untuk menghalamankan. Had limit berbeza bagi setiap endpoint: 200 pada story, ulasan, dan projek; 500 pada peristiwa; 1000 pada carian dan log audit.

Senarai biasa (tanpa cursor/limit) yang terpaksa memotong responsnya menyatakannya dalam pengepala — X-Tracker-Pagination-Truncated, X-Tracker-Pagination-Limit, X-Tracker-Pagination-Offset, dan X-Tracker-Pagination-Next-Offset; hantar yang terakhir kembali sebagai offset= untuk halaman seterusnya. Tiada pengepala jumlah kiraan.

Endpoint senarai menerima fields= (dipisahkan koma) untuk memulangkan hanya medan tertentu. story_id sentiasa disertakan; nama medan tidak diketahui memulangkan 400 validation_failed dengan nama yang menyalahi dalam details.fields.

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

Setiap ralat JSON mempunyai code dan error; sesetengahnya menambah details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
StatuscodeBila
400invalid_parameterinput buruk; mesej dalam error, tiada details (kebanyakan pengesahan: kosong/panjang/null-byte/e-mel)
400validation_failedralat input berstruktur; details.fields ialah tatasusunan nama medan yang menyalahi
401unauthenticatedtoken hilang/tidak sah
403unauthorized_operationdisahkan tetapi peranan tidak mencukupi
404unfound_resourcetidak ditemui — juga dipulangkan kepada bukan ahli
409conflictkonflik sumber (cth. pendua)
409idempotency_conflictIdempotency-Key diguna semula dengan badan yang berbeza
409stale_write · import_already_runningstory telah berubah sejak expected_updated_at anda · import sudah sedang berjalan
412precondition_failedIf-Match tidak sepadan dengan ETag semasa sumber; details membawa expected dan current
413request_too_largebadan melebihi had saiz laluan
422invalid_transitiongerakan keadaan tidak sah; details membawa { from, to, allowed }
429rate_limitedterlalu banyak permintaan daripada IP ini pada laluan yang dihadkan kadarnya; pengepala Retry-After
500internal_errorkesalahan pelayan — mesej generik; selamat untuk cuba semula
503not_configureddeployment tidak mempunyai integrasi yang diperlukan oleh laluan ini (SMS, storan objek, …)

details.fields ialah tatasusunan JSON nama medan (cth. ["to"]), kadangkala dengan kunci tambahan seperti max. Tiada peta medan→mesej.

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

Setiap IP klien, pada segelintir laluan; trafik API yang disahkan di tempat lain tidak dihadkan kadarnya. Lalai (setiap pasangan ialah kadar berterusan dan ledakan, boleh dilaraskan oleh pengendali):

  • Auth/api/auth/*: 0.5 req/s, ledakan 20.
  • Penyedia OAuth/oauth/*: 1 req/s, ledakan 60.
  • Awam/api/contact: 0.2 req/s, ledakan 10.
  • Maklum balas/api/feedback: tiga peringkat bertindan — satu penghantaran setiap 15 s, 10 sejam, 36 sehari.
  • Avatar — ubah hala avatar yang tidak disahkan: 20 req/s, ledakan 200.
  • SensitifPOST sandaran dan pemulihan: ~0.002 req/s, ledakan 5.

Had yang dilampaui memulangkan 429 dengan pengepala Retry-After dan sampul ralat JSON standard, code: "rate_limited".