flagon-io/g1t

public

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t/apps/api/src/reference.json

3,681 lines105,447 bytesCodeBlame
1{
2 "device_code": {
3 "request": {
4 "client_name": "Claude Code"
5 },
6 "response": {
7 "device_code": "Gm3k…",
8 "user_code": "WDJB-MJHT",
9 "verification_uri": "https://g1t.sh/device",
10 "verification_uri_complete": "https://g1t.sh/device?code=WDJB-MJHT",
11 "expires_in": 900,
12 "interval": 5
13 }
14 },
15 "device_token": {
16 "request": {
17 "device_code": "Gm3k…"
18 },
19 "response": {
20 "status": "approved",
21 "token": "g1t_…",
22 "username": "syntaqx",
23 "verified": true
24 }
25 },
26 "whoami": {
27 "response": {
28 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
29 "username": "syntaqx",
30 "kind": "user",
31 "verified": true,
32 "workspaces": [
33 {
34 "slug": "acme",
35 "role": "member",
36 "base_permission": "write"
37 },
38 {
39 "slug": "flagon-io",
40 "role": "owner",
41 "base_permission": "write"
42 }
43 ]
44 },
45 "notes": "`kind` is `user`, `workspace` for a [workspace access token](/guides/workspaces/#workspace-access-tokens), or `agent` for the token a g1t agent works with. For a workspace token, `username` is the workspace's slug and `workspaces` holds only that workspace. Each workspace carries its `base_permission`: what a member gets on each of its repositories (owners have Admin). Roles given on single repositories are in `grants`, each with `repo_id`, `workspace` and `role`; it is left out when there are none. See [Access and roles](/guides/access-and-roles/)."
46 },
47 "create_workspace": {
48 "request": {
49 "slug": "acme-labs",
50 "name": "Acme Labs"
51 },
52 "response": {
53 "id": "wsp_01m43teqa9em6bje0bhvdj4jkb",
54 "slug": "acme-labs",
55 "name": "Acme Labs",
56 "description": null,
57 "created_at": "2026-10-04T16:02:51.337Z",
58 "member_count": 1,
59 "base_permission": "write"
60 },
61 "notes": "`base_permission` is what every member gets on each of its repositories: `write` until an owner changes it with `PATCH /workspaces/{workspace}`. See [Access and roles](/guides/access-and-roles/)."
62 },
63 "delete_workspace": {
64 "request": {
65 "confirm": "acme-labs"
66 },
67 "response": true,
68 "notes": "Refused with `409` while the workspace holds repositories or projects, and with `402` while billing cannot settle it, each with a message that says what to do. See [Delete a workspace](/guides/workspaces/#delete-a-workspace)."
69 },
70 "list_emails": {
71 "response": {
72 "emails": [
73 {
74 "email": "ada@example.com",
75 "verified": true,
76 "primary": true,
77 "backup": false,
78 "created_at": "2026-09-01T10:00:00.000Z",
79 "verified_at": "2026-09-01T10:02:11.000Z"
80 },
81 {
82 "email": "ada@acme.com",
83 "verified": true,
84 "primary": false,
85 "backup": true,
86 "created_at": "2026-10-02T09:30:00.000Z",
87 "verified_at": "2026-10-02T09:31:40.000Z"
88 },
89 {
90 "email": "ada.l@example.org",
91 "verified": false,
92 "primary": false,
93 "backup": false,
94 "created_at": "2026-10-05T14:12:03.000Z",
95 "verified_at": null
96 }
97 ],
98 "private_email": true,
99 "block_private_pushes": false,
100 "noreply": "6c1d0efg+ada@users.noreply.g1t.sh",
101 "commit_email": "6c1d0efg+ada@users.noreply.g1t.sh",
102 "limit": 10
103 },
104 "notes": "Your primary address comes first, then confirmed addresses, then unconfirmed ones. Any confirmed address signs you in, can reset your password and attributes commits to you. See [Email addresses](/guides/authentication/#email-addresses)."
105 },
106 "add_email": {
107 "request": {
108 "email": "ada.l@example.org",
109 "password": "…"
110 },
111 "response": {
112 "emails": [
113 {
114 "email": "ada@example.com",
115 "verified": true,
116 "primary": true,
117 "backup": false,
118 "created_at": "2026-09-01T10:00:00.000Z",
119 "verified_at": "2026-09-01T10:02:11.000Z"
120 },
121 {
122 "email": "ada@acme.com",
123 "verified": true,
124 "primary": false,
125 "backup": true,
126 "created_at": "2026-10-02T09:30:00.000Z",
127 "verified_at": "2026-10-02T09:31:40.000Z"
128 },
129 {
130 "email": "ada.l@example.org",
131 "verified": false,
132 "primary": false,
133 "backup": false,
134 "created_at": "2026-10-05T14:12:03.000Z",
135 "verified_at": null
136 }
137 ],
138 "private_email": true,
139 "block_private_pushes": false,
140 "noreply": "6c1d0efg+ada@users.noreply.g1t.sh",
141 "commit_email": "6c1d0efg+ada@users.noreply.g1t.sh",
142 "limit": 10
143 },
144 "notes": "Answers `403` with code `reauth_required` when `password` is missing or wrong, and `409` when another account has confirmed the address. The new address stays unconfirmed until its link is followed."
145 },
146 "remove_email": {
147 "request": {
148 "password": "…"
149 },
150 "response": {
151 "emails": [
152 {
153 "email": "ada@example.com",
154 "verified": true,
155 "primary": true,
156 "backup": false,
157 "created_at": "2026-09-01T10:00:00.000Z",
158 "verified_at": "2026-09-01T10:02:11.000Z"
159 },
160 {
161 "email": "ada@acme.com",
162 "verified": true,
163 "primary": false,
164 "backup": true,
165 "created_at": "2026-10-02T09:30:00.000Z",
166 "verified_at": "2026-10-02T09:31:40.000Z"
167 },
168 {
169 "email": "ada.l@example.org",
170 "verified": false,
171 "primary": false,
172 "backup": false,
173 "created_at": "2026-10-05T14:12:03.000Z",
174 "verified_at": null
175 }
176 ],
177 "private_email": true,
178 "block_private_pushes": false,
179 "noreply": "6c1d0efg+ada@users.noreply.g1t.sh",
180 "commit_email": "6c1d0efg+ada@users.noreply.g1t.sh",
181 "limit": 10
182 },
183 "notes": "Give the address in the path, URL-encoded: `DELETE /user/emails/ada.l%40example.org`. Answers `409` for your primary address or your last confirmed one."
184 },
185 "update_email_settings": {
186 "request": {
187 "primary": "ada@acme.com",
188 "password": "…"
189 },
190 "response": {
191 "emails": [
192 {
193 "email": "ada@example.com",
194 "verified": true,
195 "primary": true,
196 "backup": false,
197 "created_at": "2026-09-01T10:00:00.000Z",
198 "verified_at": "2026-09-01T10:02:11.000Z"
199 },
200 {
201 "email": "ada@acme.com",
202 "verified": true,
203 "primary": false,
204 "backup": true,
205 "created_at": "2026-10-02T09:30:00.000Z",
206 "verified_at": "2026-10-02T09:31:40.000Z"
207 },
208 {
209 "email": "ada.l@example.org",
210 "verified": false,
211 "primary": false,
212 "backup": false,
213 "created_at": "2026-10-05T14:12:03.000Z",
214 "verified_at": null
215 }
216 ],
217 "private_email": true,
218 "block_private_pushes": false,
219 "noreply": "6c1d0efg+ada@users.noreply.g1t.sh",
220 "commit_email": "6c1d0efg+ada@users.noreply.g1t.sh",
221 "limit": 10
222 },
223 "notes": "Only the fields given change. `primary` and `backup` need `password`; `private_email` and `block_private_pushes` do not."
224 },
225 "list_invites": {
226 "response": {
227 "mode": "invite",
228 "allowance": {
229 "limit": 5,
230 "used": 2,
231 "remaining": 3
232 },
233 "workspaces": [
234 {
235 "slug": "acme-labs",
236 "allowance": {
237 "limit": 20,
238 "used": 4,
239 "remaining": 16
240 }
241 }
242 ],
243 "invites": [
244 {
245 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
246 "code": "g1t-k7m2-q9xd-4hpw-…",
247 "hint": "g1t-k7m2",
248 "email": "ada@example.com",
249 "kind": "account",
250 "workspace": null,
251 "status": "pending",
252 "charged_to": "user",
253 "invited_by": "syntaqx",
254 "redeemed_by": null,
255 "created_at": "2026-10-05T17:00:00.000Z",
256 "expires_at": "2026-11-04T17:00:00.000Z",
257 "redeemed_at": null,
258 "revoked_at": null
259 },
260 {
261 "id": "inv_01kp1v3c4d5e6f7g8h9j0k1m2n",
262 "code": null,
263 "hint": "g1t-p3rt",
264 "email": null,
265 "kind": "account",
266 "workspace": null,
267 "status": "redeemed",
268 "charged_to": "user",
269 "invited_by": "syntaqx",
270 "redeemed_by": "grace",
271 "created_at": "2026-10-02T09:12:40.000Z",
272 "expires_at": "2026-11-01T09:12:40.000Z",
273 "redeemed_at": "2026-10-02T11:30:05.000Z",
274 "revoked_at": null
275 }
276 ]
277 },
278 "notes": "`allowance.limit` and `allowance.remaining` are null when you have no limit. A revoked or expired invite that was never used is not counted. Ask for more at hey@flagon.io with the subject `[g1t Invites]`. See [Invites](/guides/authentication/#invites)."
279 },
280 "create_invite": {
281 "request": {
282 "email": "ada@example.com"
283 },
284 "response": {
285 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
286 "code": "g1t-k7m2-q9xd-4hpw-…",
287 "hint": "g1t-k7m2",
288 "email": "ada@example.com",
289 "kind": "account",
290 "workspace": null,
291 "status": "pending",
292 "charged_to": "user",
293 "invited_by": "syntaqx",
294 "redeemed_by": null,
295 "created_at": "2026-10-05T17:00:00.000Z",
296 "expires_at": "2026-11-04T17:00:00.000Z",
297 "redeemed_at": null,
298 "revoked_at": null
299 },
300 "notes": "Refused with `402` (`limit`) when you have no invites left, with `409` when you already have a pending invite for that address or it already has a g1t account, and with `403` for an agent's or a workspace's token. The code is returned in full; send people the link `https://g1t.sh/invite/<code>`."
301 },
302 "revoke_invite": {
303 "response": {
304 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
305 "code": null,
306 "hint": "g1t-k7m2",
307 "email": "ada@example.com",
308 "kind": "account",
309 "workspace": null,
310 "status": "revoked",
311 "charged_to": "user",
312 "invited_by": "syntaqx",
313 "redeemed_by": null,
314 "created_at": "2026-10-05T17:00:00.000Z",
315 "expires_at": "2026-11-04T17:00:00.000Z",
316 "redeemed_at": null,
317 "revoked_at": "2026-10-06T08:00:00.000Z"
318 }
319 },
320 "list_workspace_invites": {
321 "response": [
322 {
323 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
324 "code": "g1t-k7m2-q9xd-4hpw-…",
325 "hint": "g1t-k7m2",
326 "email": "ada@example.com",
327 "kind": "account",
328 "workspace": "acme-labs",
329 "status": "pending",
330 "charged_to": "workspace",
331 "invited_by": "syntaqx",
332 "redeemed_by": null,
333 "created_at": "2026-10-05T17:00:00.000Z",
334 "expires_at": "2026-11-04T17:00:00.000Z",
335 "redeemed_at": null,
336 "revoked_at": null
337 },
338 {
339 "id": "inv_01kp1z9y8x7w6v5t4s3r2q1p0n",
340 "code": "g1t-k7m2-q9xd-4hpw-…",
341 "hint": "g1t-w2vb",
342 "email": "linus@example.com",
343 "kind": "workspace",
344 "workspace": "acme-labs",
345 "status": "pending",
346 "charged_to": "none",
347 "invited_by": "syntaqx",
348 "redeemed_by": null,
349 "created_at": "2026-10-05T17:00:00.000Z",
350 "expires_at": "2026-11-04T17:00:00.000Z",
351 "redeemed_at": null,
352 "revoked_at": null
353 }
354 ]
355 },
356 "invite_member": {
357 "request": {
358 "email": "ada@example.com"
359 },
360 "response": {
361 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
362 "code": "g1t-k7m2-q9xd-4hpw-…",
363 "hint": "g1t-k7m2",
364 "email": "ada@example.com",
365 "kind": "account",
366 "workspace": "acme-labs",
367 "status": "pending",
368 "charged_to": "workspace",
369 "invited_by": "syntaqx",
370 "redeemed_by": null,
371 "created_at": "2026-10-05T17:00:00.000Z",
372 "expires_at": "2026-11-04T17:00:00.000Z",
373 "redeemed_at": null,
374 "revoked_at": null
375 },
376 "notes": "`kind` is `workspace` when the address already has a g1t account (`charged_to` is then `none`), and `account` when accepting makes one. Both answers look alike to the caller on purpose: the invite is emailed either way."
377 },
378 "revoke_workspace_invite": {
379 "response": {
380 "id": "inv_01kp2x7m8n9q0r1s2t3v4w5x6y",
381 "code": null,
382 "hint": "g1t-k7m2",
383 "email": "ada@example.com",
384 "kind": "account",
385 "workspace": "acme-labs",
386 "status": "revoked",
387 "charged_to": "workspace",
388 "invited_by": "syntaqx",
389 "redeemed_by": null,
390 "created_at": "2026-10-05T17:00:00.000Z",
391 "expires_at": "2026-11-04T17:00:00.000Z",
392 "redeemed_at": null,
393 "revoked_at": "2026-10-06T08:00:00.000Z"
394 }
395 },
396 "list_repos": {
397 "query": {
398 "q": "hello"
399 },
400 "response": [
401 {
402 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
403 "namespace": "flagon-io",
404 "name": "hello",
405 "description": "A tiny service that says hello.",
406 "is_private": false,
407 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
408 "default_branch": "main",
409 "fork_of": null,
410 "protected": true,
411 "created_at": "2026-09-28T14:11:52.640Z",
412 "website": "https://hello.g1t.page",
413 "archived_at": null
414 }
415 ],
416 "notes": "Returns at most 50 repositories, newest first. Forks made for pull requests are left out."
417 },
418 "create_repo": {
419 "request": {
420 "workspace": "flagon-io",
421 "name": "hello-cli",
422 "description": "Command-line client for hello.",
423 "private": false
424 },
425 "response": {
426 "id": "rep_01m43tk1jhehztx23drs87f5fc",
427 "namespace": "flagon-io",
428 "name": "hello-cli",
429 "description": "Command-line client for hello.",
430 "is_private": false,
431 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
432 "default_branch": "main",
433 "fork_of": null,
434 "protected": false,
435 "created_at": "2026-10-04T16:05:12.913Z",
436 "website": "https://hello.g1t.page",
437 "archived_at": null
438 },
439 "notes": "`owner_id` is the id of the person who created the repository. With `import_url`, `default_branch` is the default branch of the repository copied."
440 },
441 "get_repo": {
442 "response": {
443 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
444 "namespace": "flagon-io",
445 "name": "hello",
446 "description": "A tiny service that says hello.",
447 "is_private": false,
448 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
449 "default_branch": "main",
450 "fork_of": null,
451 "protected": true,
452 "created_at": "2026-09-28T14:11:52.640Z",
453 "website": "https://hello.g1t.page",
454 "archived_at": null
455 }
456 },
457 "update_repo": {
458 "request": {
459 "description": "Says hello, politely.",
460 "website": "hello.g1t.page",
461 "default_branch": "trunk",
462 "protected": true
463 },
464 "response": {
465 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
466 "namespace": "flagon-io",
467 "name": "hello",
468 "description": "Says hello, politely.",
469 "is_private": false,
470 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
471 "default_branch": "trunk",
472 "fork_of": null,
473 "protected": true,
474 "created_at": "2026-09-28T14:11:52.640Z",
475 "topics": [
476 "http",
477 "example"
478 ],
479 "website": "https://hello.g1t.page",
480 "archived_at": null
481 },
482 "notes": "Only the fields given change. `website` gets `https://` when no scheme is given; an empty string clears it. `default_branch` must name a branch that exists (`422` otherwise); it is changed after the other fields. `description`, `website`, `topics` and `protected` need the Maintain role or higher, and `private` and `default_branch` the Admin role (`403` otherwise, saying which role). Changing `private` here needs no confirmation; `POST /repos/{owner}/{name}/visibility` asks for one. Making it private is refused with `402` when a free workspace's private storage has no room for it. See [Managing a repository](/guides/managing-repositories/) and [Access and roles](/guides/access-and-roles/)."
483 },
484 "transfer_repo": {
485 "request": {
486 "to": "flagon-io"
487 },
488 "response": {
489 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
490 "namespace": "flagon-io",
491 "name": "hello",
492 "description": "A tiny service that says hello.",
493 "is_private": false,
494 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
495 "default_branch": "main",
496 "fork_of": null,
497 "protected": true,
498 "created_at": "2026-09-28T14:11:52.640Z",
499 "website": "https://hello.g1t.page",
500 "archived_at": null
501 },
502 "notes": "The repository at its new address. Refused with `409` when the destination already has a repository of that name, `403` unless you own both workspaces, and `402` when a free destination has no room for a private repository. The old address redirects. See [Transferring a repository](/guides/transferring-repositories/)."
503 },
504 "rename_repo": {
505 "request": {
506 "name": "greeter"
507 },
508 "response": {
509 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
510 "namespace": "flagon-io",
511 "name": "greeter",
512 "description": "A tiny service that says hello.",
513 "is_private": false,
514 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
515 "default_branch": "main",
516 "fork_of": null,
517 "protected": true,
518 "created_at": "2026-09-28T14:11:52.640Z",
519 "topics": [
520 "http",
521 "example"
522 ],
523 "website": "https://hello.g1t.page",
524 "archived_at": null
525 },
526 "notes": "The repository under its new name. Needs the Admin role (`403` otherwise). Refused with `409` when the workspace already has a repository of that name, a recently deleted one included, and with `422` when the name is not valid. The old address redirects. See [Rename a repository](/guides/managing-repositories/#rename-a-repository)."
527 },
528 "rename_branch": {
529 "params": {
530 "owner": "flagon-io",
531 "name": "hello",
532 "branch": "feature/login"
533 },
534 "request": {
535 "new_name": "feature/sign-in"
536 },
537 "response": {
538 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
539 "namespace": "flagon-io",
540 "name": "hello",
541 "description": "A tiny service that says hello.",
542 "is_private": false,
543 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
544 "default_branch": "main",
545 "fork_of": null,
546 "protected": true,
547 "created_at": "2026-09-28T14:11:52.640Z",
548 "topics": [
549 "http",
550 "example"
551 ],
552 "website": "https://hello.g1t.page",
553 "archived_at": null
554 },
555 "notes": "The repository after the rename; renaming the default branch changes `default_branch`. Send a branch name with slashes URL-encoded, as one path segment. Refused with `404` when there is no such branch, `409` when a branch named `new_name` exists, `422` when `new_name` is not a valid branch name, and `403` without the Write role, or without the Admin role for the default branch. See [Rename a branch](/guides/managing-repositories/#rename-a-branch)."
556 },
557 "set_repo_visibility": {
558 "request": {
559 "private": true,
560 "confirm": "flagon-io/hello"
561 },
562 "response": {
563 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
564 "namespace": "flagon-io",
565 "name": "hello",
566 "description": "A tiny service that says hello.",
567 "is_private": true,
568 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
569 "default_branch": "main",
570 "fork_of": null,
571 "protected": true,
572 "created_at": "2026-09-28T14:11:52.640Z",
573 "topics": [
574 "http",
575 "example"
576 ],
577 "website": "https://hello.g1t.page",
578 "archived_at": null
579 },
580 "notes": "Needs the Admin role (`403` otherwise). Refused with `422` when `confirm` is not the repository's full name, and with `402` when a free workspace's private storage has no room for it. See [Change who can see a repository](/guides/managing-repositories/#change-who-can-see-a-repository)."
581 },
582 "archive_repo": {
583 "response": {
584 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
585 "namespace": "flagon-io",
586 "name": "hello",
587 "description": "A tiny service that says hello.",
588 "is_private": false,
589 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
590 "default_branch": "main",
591 "fork_of": null,
592 "protected": true,
593 "created_at": "2026-09-28T14:11:52.640Z",
594 "topics": [
595 "http",
596 "example"
597 ],
598 "website": "https://hello.g1t.page",
599 "archived_at": "2026-10-05T09:30:00.000Z"
600 },
601 "notes": "The repository, with `archived_at` set. Needs the Admin role (`403` otherwise). See [Archive a repository](/guides/managing-repositories/#archive-a-repository)."
602 },
603 "unarchive_repo": {
604 "response": {
605 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
606 "namespace": "flagon-io",
607 "name": "hello",
608 "description": "A tiny service that says hello.",
609 "is_private": false,
610 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
611 "default_branch": "main",
612 "fork_of": null,
613 "protected": true,
614 "created_at": "2026-09-28T14:11:52.640Z",
615 "topics": [
616 "http",
617 "example"
618 ],
619 "website": "https://hello.g1t.page",
620 "archived_at": null
621 },
622 "notes": "The repository, with `archived_at` null. Needs the Admin role (`403` otherwise)."
623 },
624 "delete_repo": {
625 "request": {
626 "confirm": "flagon-io/hello"
627 },
628 "response": {
629 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
630 "namespace": "flagon-io",
631 "name": "hello",
632 "description": "A tiny service that says hello.",
633 "is_private": false,
634 "deleted_at": "2026-10-05T09:30:00.000Z",
635 "deleted_by": "syntaqx",
636 "purge_after": "2026-11-04T09:30:00.000Z"
637 },
638 "notes": "The deleted repository and when it will be purged, 30 days on. Owners of the workspace only (`403`), whatever their role on the repository. Refused with `422` when `confirm` is not its full name. Its name stays taken until it is purged. See [Delete a repository](/guides/managing-repositories/#delete-a-repository)."
639 },
640 "list_deleted_repos": {
641 "params": {
642 "workspace": "flagon-io"
643 },
644 "response": [
645 {
646 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
647 "namespace": "flagon-io",
648 "name": "hello",
649 "description": "A tiny service that says hello.",
650 "is_private": false,
651 "deleted_at": "2026-10-05T09:30:00.000Z",
652 "deleted_by": "syntaqx",
653 "purge_after": "2026-11-04T09:30:00.000Z"
654 }
655 ],
656 "notes": "Newest first. Empty for anyone who is not an owner of the workspace."
657 },
658 "restore_repo": {
659 "response": {
660 "id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
661 "namespace": "flagon-io",
662 "name": "hello",
663 "description": "A tiny service that says hello.",
664 "is_private": false,
665 "owner_id": "usr_01kkntcg1eeb98j62xjm7eh09p",
666 "default_branch": "main",
667 "fork_of": null,
668 "protected": true,
669 "created_at": "2026-09-28T14:11:52.640Z",
670 "topics": [
671 "http",
672 "example"
673 ],
674 "website": "https://hello.g1t.page",
675 "archived_at": null
676 },
677 "notes": "The repository, back at its address. Name it by the path it had. Owners only (`403`); `404` when no deleted repository had that path, or it has been purged. See [Restore a repository](/guides/managing-repositories/#restore-a-repository)."
678 },
679 "purge_repo": {
680 "request": {
681 "confirm": "flagon-io/hello"
682 },
683 "response": true,
684 "notes": "Permanent: it cannot be restored afterwards, and its name is free again. Only a deleted repository can be purged (`404` otherwise). Owners only (`403`); `422` when `confirm` is not its full name."
685 },
686 "get_repo_settings": {
687 "response": {
688 "auto_merge": false,
689 "require_up_to_date": false,
690 "required_approvals": 0,
691 "count_agent_approvals": true,
692 "allow_ignoring_checks": true,
693 "agent_review": true,
694 "max_revisions": 2,
695 "merge_queue": false,
696 "updated_by": null,
697 "updated_at": null
698 }
699 },
700 "update_repo_settings": {
701 "request": {
702 "required_approvals": 1,
703 "count_agent_approvals": false,
704 "merge_queue": true
705 },
706 "response": {
707 "auto_merge": false,
708 "require_up_to_date": false,
709 "required_approvals": 1,
710 "count_agent_approvals": false,
711 "allow_ignoring_checks": true,
712 "agent_review": true,
713 "max_revisions": 2,
714 "merge_queue": true,
715 "updated_by": "syntaqx",
716 "updated_at": "2026-10-04T16:20:37.508Z"
717 },
718 "notes": "`required_approvals` is at most 6 and `max_revisions` at most 5. See [what a repository can ask for](/guides/g1t-agents/#what-a-repository-can-ask-for)."
719 },
720 "list_events": {
721 "query": {
722 "before": "evt_01m43t2a6c9e3g7j1m5q9t3x7b"
723 },
724 "response": [
725 {
726 "id": "evt_01m43smh3ve52vkcna207vqctf",
727 "type": "pull.opened",
728 "source": "work",
729 "time": "2026-10-01T18:20:02.117Z",
730 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
731 "actor": "usr_01kkntcg1eeb98j62xjm7eh09p",
732 "data": {
733 "pull_id": "pr_01m43smh3vexsr5pmp60qwv0vs",
734 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
735 "number": 14,
736 "issue": 12,
737 "agent": "claude-code"
738 }
739 },
740 {
741 "id": "evt_01m43shrzpf2vt5rxbb02z0xjt",
742 "type": "issue.opened",
743 "source": "work",
744 "time": "2026-10-01T18:04:11.482Z",
745 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
746 "actor": "usr_01kkntcg1eeb98j62xjm7eh09p",
747 "data": {
748 "issue_id": "iss_01m43shrzpfe49x74ga7sj1c6v",
749 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
750 "number": 12,
751 "title": "Greeting should name the caller"
752 }
753 }
754 ],
755 "notes": "Returns 50 events a page. To page back, send the `id` of the last event you have as `before`. `actor` is a user id, and `data` depends on `type`."
756 },
757 "list_issues": {
758 "query": {
759 "state": "open",
760 "label": "feature"
761 },
762 "response": [
763 {
764 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
765 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
766 "number": 12,
767 "title": "Greeting should name the caller",
768 "body": "Take a name from the first argument; fall back to world.",
769 "labels": [
770 "feature"
771 ],
772 "checks": [
773 "cargo test"
774 ],
775 "state": "open",
776 "reason": null,
777 "resolved_by": null,
778 "author": {
779 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
780 "username": "syntaqx",
781 "kind": "user",
782 "verified": false,
783 "workspaces": []
784 },
785 "created_at": "2026-10-01T18:04:11.482Z",
786 "updated_at": "2026-10-01T18:04:11.482Z",
787 "closed_at": null,
788 "pull_count": 1,
789 "comment_count": 0,
790 "assignees": [],
791 "blocked_by": [],
792 "queued": false,
793 "agent": "claude-code"
794 }
795 ],
796 "notes": "Returns at most 100 issues, newest first. `comment_count` counts comments, not events such as \"opened #14 for this\"."
797 },
798 "create_issue": {
799 "request": {
800 "title": "Greeting should name the caller",
801 "body": "Take a name from the first argument; fall back to world.",
802 "labels": [
803 "feature"
804 ],
805 "checks": [
806 "cargo test"
807 ]
808 },
809 "response": {
810 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
811 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
812 "number": 12,
813 "title": "Greeting should name the caller",
814 "body": "Take a name from the first argument; fall back to world.",
815 "labels": [
816 "feature"
817 ],
818 "checks": [
819 "cargo test"
820 ],
821 "state": "open",
822 "reason": null,
823 "resolved_by": null,
824 "author": {
825 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
826 "username": "syntaqx",
827 "kind": "user",
828 "verified": false,
829 "workspaces": []
830 },
831 "created_at": "2026-10-01T18:04:11.482Z",
832 "updated_at": "2026-10-01T18:04:11.482Z",
833 "closed_at": null,
834 "pull_count": 0,
835 "comment_count": 0,
836 "assignees": [],
837 "blocked_by": [],
838 "queued": false,
839 "agent": null
840 },
841 "notes": "Labels are lowercased. A label not used before is created."
842 },
843 "get_issue": {
844 "response": {
845 "issue": {
846 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
847 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
848 "number": 12,
849 "title": "Greeting should name the caller",
850 "body": "Take a name from the first argument; fall back to world.",
851 "labels": [
852 "feature"
853 ],
854 "checks": [
855 "cargo test"
856 ],
857 "state": "closed",
858 "reason": "completed",
859 "resolved_by": 14,
860 "author": {
861 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
862 "username": "syntaqx",
863 "kind": "user",
864 "verified": false,
865 "workspaces": []
866 },
867 "created_at": "2026-10-01T18:04:11.482Z",
868 "updated_at": "2026-10-01T18:52:17.093Z",
869 "closed_at": "2026-10-01T18:52:17.093Z",
870 "pull_count": 2,
871 "comment_count": 0,
872 "assignees": [],
873 "blocked_by": [],
874 "queued": false,
875 "agent": null
876 },
877 "pulls": [
878 {
879 "id": "pr_01m43sjq8tcz5rbm2a7k4d9e6w",
880 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
881 "number": 13,
882 "issue": 12,
883 "title": "Greeting should name the caller",
884 "body": null,
885 "agent": "claude-code",
886 "runtime": "external",
887 "status": "closed",
888 "fork": {
889 "namespace": "pulls",
890 "name": "pr_01m43sjq8tcz5rbm2a7k4d9e6w"
891 },
892 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
893 "branch": null,
894 "head_commit": null,
895 "merge_base": null,
896 "merged_by": null,
897 "merged_at": null,
898 "superseded_by": 14,
899 "check_status": null,
900 "files": [],
901 "assignees": [],
902 "reviewers": [],
903 "author": {
904 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
905 "username": "syntaqx",
906 "kind": "user",
907 "verified": false,
908 "workspaces": []
909 },
910 "created_at": "2026-10-01T18:20:02.117Z",
911 "updated_at": "2026-10-01T18:20:02.117Z"
912 },
913 {
914 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
915 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
916 "number": 14,
917 "issue": 12,
918 "title": "Greeting should name the caller",
919 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
920 "agent": "claude-code",
921 "runtime": "external",
922 "status": "merged",
923 "fork": {
924 "namespace": "pulls",
925 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
926 },
927 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
928 "branch": null,
929 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
930 "merge_base": "3a7e9c1b5d2f4a6c8e0b2d4f6a8c0e2b4d6f8a1c",
931 "merged_by": "syntaqx",
932 "merged_at": "2026-10-01T18:52:17.093Z",
933 "superseded_by": null,
934 "check_status": "passed",
935 "files": [
936 {
937 "path": "src/main.rs",
938 "additions": 6,
939 "deletions": 2
940 }
941 ],
942 "assignees": [],
943 "reviewers": [
944 "ana"
945 ],
946 "author": {
947 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
948 "username": "syntaqx",
949 "kind": "user",
950 "verified": false,
951 "workspaces": []
952 },
953 "created_at": "2026-10-01T18:20:02.117Z",
954 "updated_at": "2026-10-01T18:52:17.093Z"
955 }
956 ],
957 "comments": [
958 {
959 "id": "cmt_01m43sr2b7d5f0j6k3n8p1q4v9",
960 "kind": "event",
961 "author": {
962 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
963 "username": "syntaqx",
964 "kind": "user",
965 "verified": false,
966 "workspaces": []
967 },
968 "body": "opened #14 for this",
969 "path": null,
970 "line": null,
971 "verdict": null,
972 "created_at": "2026-10-01T18:20:02.141Z"
973 }
974 ]
975 },
976 "notes": "A closed issue says how it was closed: `reason` is `completed` or `not_planned`, and `resolved_by` is the number of the pull request whose merge closed it. Each pull request made for it is listed; one closed because another was merged has `superseded_by` set."
977 },
978 "update_issue": {
979 "request": {
980 "labels": [
981 "feature",
982 "good first issue"
983 ],
984 "assignees": [
985 "syntaqx"
986 ]
987 },
988 "response": {
989 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
990 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
991 "number": 12,
992 "title": "Greeting should name the caller",
993 "body": "Take a name from the first argument; fall back to world.",
994 "labels": [
995 "feature",
996 "good first issue"
997 ],
998 "checks": [
999 "cargo test"
1000 ],
1001 "state": "open",
1002 "reason": null,
1003 "resolved_by": null,
1004 "author": {
1005 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1006 "username": "syntaqx",
1007 "kind": "user",
1008 "verified": false,
1009 "workspaces": []
1010 },
1011 "created_at": "2026-10-01T18:04:11.482Z",
1012 "updated_at": "2026-10-01T18:09:47.305Z",
1013 "closed_at": null,
1014 "pull_count": 0,
1015 "comment_count": 0,
1016 "assignees": [
1017 "syntaqx"
1018 ],
1019 "blocked_by": [],
1020 "queued": false,
1021 "agent": null
1022 }
1023 },
1024 "close_issue": {
1025 "request": {
1026 "reason": "not_planned"
1027 },
1028 "response": {
1029 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
1030 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1031 "number": 12,
1032 "title": "Greeting should name the caller",
1033 "body": "Take a name from the first argument; fall back to world.",
1034 "labels": [
1035 "feature"
1036 ],
1037 "checks": [
1038 "cargo test"
1039 ],
1040 "state": "closed",
1041 "reason": "not_planned",
1042 "resolved_by": null,
1043 "author": {
1044 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1045 "username": "syntaqx",
1046 "kind": "user",
1047 "verified": false,
1048 "workspaces": []
1049 },
1050 "created_at": "2026-10-01T18:04:11.482Z",
1051 "updated_at": "2026-10-01T19:30:00.214Z",
1052 "closed_at": "2026-10-01T19:30:00.214Z",
1053 "pull_count": 0,
1054 "comment_count": 0,
1055 "assignees": [],
1056 "blocked_by": [],
1057 "queued": false,
1058 "agent": null
1059 }
1060 },
1061 "reopen_issue": {
1062 "response": {
1063 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
1064 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1065 "number": 12,
1066 "title": "Greeting should name the caller",
1067 "body": "Take a name from the first argument; fall back to world.",
1068 "labels": [
1069 "feature"
1070 ],
1071 "checks": [
1072 "cargo test"
1073 ],
1074 "state": "open",
1075 "reason": null,
1076 "resolved_by": null,
1077 "author": {
1078 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1079 "username": "syntaqx",
1080 "kind": "user",
1081 "verified": false,
1082 "workspaces": []
1083 },
1084 "created_at": "2026-10-01T18:04:11.482Z",
1085 "updated_at": "2026-10-01T19:41:52.830Z",
1086 "closed_at": null,
1087 "pull_count": 0,
1088 "comment_count": 0,
1089 "assignees": [],
1090 "blocked_by": [],
1091 "queued": false,
1092 "agent": null
1093 }
1094 },
1095 "assign_issue": {
1096 "request": {
1097 "instructions": "Keep the change to src/main.rs."
1098 },
1099 "response": {
1100 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1101 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1102 "number": 14,
1103 "issue": 12,
1104 "title": "Greeting should name the caller",
1105 "body": null,
1106 "agent": "g1t-agent",
1107 "runtime": "hosted",
1108 "status": "draft",
1109 "fork": {
1110 "namespace": "pulls",
1111 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1112 },
1113 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1114 "branch": null,
1115 "head_commit": null,
1116 "merge_base": null,
1117 "merged_by": null,
1118 "merged_at": null,
1119 "superseded_by": null,
1120 "check_status": null,
1121 "files": [],
1122 "assignees": [],
1123 "reviewers": [],
1124 "author": {
1125 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1126 "username": "syntaqx",
1127 "kind": "user",
1128 "verified": false,
1129 "workspaces": []
1130 },
1131 "created_at": "2026-10-01T18:20:02.117Z",
1132 "updated_at": "2026-10-01T18:20:02.117Z"
1133 },
1134 "notes": "The response is the pull request the g1t agent opened, still a draft. Follow it with [get a pull request](/reference/api/pull-requests/get-pull-request/): `lifecycle` says what the agent is doing."
1135 },
1136 "add_comment": {
1137 "request": {
1138 "body": "Should an empty name fall back to \"world\"?"
1139 },
1140 "response": {
1141 "id": "cmt_01m43sv4c8e2g6j0m4q8t2x6a1",
1142 "kind": "comment",
1143 "author": {
1144 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1145 "username": "syntaqx",
1146 "kind": "user",
1147 "verified": true,
1148 "workspaces": [
1149 {
1150 "slug": "flagon-io",
1151 "role": "owner"
1152 }
1153 ]
1154 },
1155 "body": "Should an empty name fall back to \"world\"?",
1156 "path": null,
1157 "line": null,
1158 "verdict": null,
1159 "created_at": "2026-10-01T18:12:30.551Z"
1160 }
1161 },
1162 "list_labels": {
1163 "response": [
1164 "bug",
1165 "feature",
1166 "docs",
1167 "chore",
1168 "question",
1169 "good first issue"
1170 ],
1171 "notes": "The five default labels come first, then the others used on the repository's issues, alphabetically."
1172 },
1173 "plan_work": {
1174 "request": {
1175 "brief": "Greet people by name, from the command line and the web page."
1176 },
1177 "response": {
1178 "plan_id": "pln_01m43s9c4e8g2j6m0q4t8x2b6d"
1179 }
1180 },
1181 "get_plan": {
1182 "params": {
1183 "plan": "pln_01m43s9c4e8g2j6m0q4t8x2b6d"
1184 },
1185 "response": {
1186 "id": "pln_01m43s9c4e8g2j6m0q4t8x2b6d",
1187 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1188 "brief": "Greet people by name, from the command line and the web page.",
1189 "status": "ready",
1190 "summary": "Name parsing first, then the two places that print the greeting.",
1191 "issues": [
1192 {
1193 "title": "Greeting should name the caller",
1194 "body": "Accept an optional name in `greet()` and use it.",
1195 "labels": [
1196 "feature"
1197 ],
1198 "checks": [
1199 "cargo test"
1200 ],
1201 "files": [
1202 "src/greet.rs"
1203 ],
1204 "depends_on": [],
1205 "number": null
1206 },
1207 {
1208 "title": "Show the caller's name on the web page",
1209 "body": "Read `?name=` and pass it to `greet()`.",
1210 "labels": [
1211 "feature"
1212 ],
1213 "checks": [
1214 "cargo test"
1215 ],
1216 "files": [
1217 "src/web.rs"
1218 ],
1219 "depends_on": [
1220 1
1221 ],
1222 "number": null
1223 }
1224 ],
1225 "error": null,
1226 "author": {
1227 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1228 "username": "syntaqx",
1229 "kind": "user",
1230 "verified": false,
1231 "workspaces": []
1232 },
1233 "created_at": "2026-10-01T17:58:40.006Z",
1234 "finished_at": "2026-10-01T18:01:12.774Z",
1235 "progress": [],
1236 "exchanges": []
1237 },
1238 "notes": "A plan still `planning` after 20 minutes is reported as `failed`. `progress` follows each issue once the plan is applied."
1239 },
1240 "apply_plan": {
1241 "params": {
1242 "plan": "pln_01m43s9c4e8g2j6m0q4t8x2b6d"
1243 },
1244 "request": {
1245 "assign": true
1246 },
1247 "response": {
1248 "id": "pln_01m43s9c4e8g2j6m0q4t8x2b6d",
1249 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1250 "brief": "Greet people by name, from the command line and the web page.",
1251 "status": "applied",
1252 "summary": "Name parsing first, then the two places that print the greeting.",
1253 "issues": [
1254 {
1255 "title": "Greeting should name the caller",
1256 "body": "Accept an optional name in `greet()` and use it.",
1257 "labels": [
1258 "feature"
1259 ],
1260 "checks": [
1261 "cargo test"
1262 ],
1263 "files": [
1264 "src/greet.rs"
1265 ],
1266 "depends_on": [],
1267 "number": 12
1268 },
1269 {
1270 "title": "Show the caller's name on the web page",
1271 "body": "Read `?name=` and pass it to `greet()`.",
1272 "labels": [
1273 "feature"
1274 ],
1275 "checks": [
1276 "cargo test"
1277 ],
1278 "files": [
1279 "src/web.rs"
1280 ],
1281 "depends_on": [
1282 1
1283 ],
1284 "number": 13
1285 }
1286 ],
1287 "error": null,
1288 "author": {
1289 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1290 "username": "syntaqx",
1291 "kind": "user",
1292 "verified": false,
1293 "workspaces": []
1294 },
1295 "created_at": "2026-10-01T17:58:40.006Z",
1296 "finished_at": "2026-10-01T18:01:12.774Z",
1297 "progress": [],
1298 "exchanges": []
1299 },
1300 "notes": "Each opened issue's `number` is filled in. Issues left out with `keep` stay `null`."
1301 },
1302 "list_pull_requests": {
1303 "query": {
1304 "state": "open"
1305 },
1306 "response": [
1307 {
1308 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1309 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1310 "number": 14,
1311 "issue": 12,
1312 "title": "Greeting should name the caller",
1313 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
1314 "agent": "claude-code",
1315 "runtime": "external",
1316 "status": "open",
1317 "fork": {
1318 "namespace": "pulls",
1319 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1320 },
1321 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1322 "branch": null,
1323 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1324 "merge_base": null,
1325 "merged_by": null,
1326 "merged_at": null,
1327 "superseded_by": null,
1328 "check_status": "passed",
1329 "files": [
1330 {
1331 "path": "src/main.rs",
1332 "additions": 6,
1333 "deletions": 2
1334 }
1335 ],
1336 "assignees": [],
1337 "reviewers": [
1338 "ana"
1339 ],
1340 "author": {
1341 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1342 "username": "syntaqx",
1343 "kind": "user",
1344 "verified": false,
1345 "workspaces": []
1346 },
1347 "created_at": "2026-10-01T18:20:02.117Z",
1348 "updated_at": "2026-10-01T18:35:44.902Z"
1349 }
1350 ],
1351 "notes": "Returns at most 100 pull requests, newest first. `check_status` is `queued`, `running`, `passed`, `failed`, `errored`, or `null` when no checks have run against the head."
1352 },
1353 "create_pull_request": {
1354 "request": {
1355 "issue": 12,
1356 "agent": "claude-code"
1357 },
1358 "response": {
1359 "pull": {
1360 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1361 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1362 "number": 14,
1363 "issue": 12,
1364 "title": "Greeting should name the caller",
1365 "body": null,
1366 "agent": "claude-code",
1367 "runtime": "external",
1368 "status": "draft",
1369 "fork": {
1370 "namespace": "pulls",
1371 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1372 },
1373 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1374 "branch": null,
1375 "head_commit": null,
1376 "merge_base": null,
1377 "merged_by": null,
1378 "merged_at": null,
1379 "superseded_by": null,
1380 "check_status": null,
1381 "files": [],
1382 "assignees": [],
1383 "reviewers": [],
1384 "author": {
1385 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1386 "username": "syntaqx",
1387 "kind": "user",
1388 "verified": false,
1389 "workspaces": []
1390 },
1391 "created_at": "2026-10-01T18:20:02.117Z",
1392 "updated_at": "2026-10-01T18:20:02.117Z"
1393 },
1394 "git": {
1395 "remote": "https://g1t.sh/pulls/pr_01m43smh3vexsr5pmp60qwv0vs.git",
1396 "username": "syntaqx",
1397 "password": "your g1t access token"
1398 }
1399 },
1400 "notes": "`title` defaults to the issue's title, and is required when there is no `issue`. Push to `git.remote` with your username and an access token as the password.\n\nSend `branch` to open the pull request from a branch already pushed to the repository. No fork is made, `fork` is `null`, `git.remote` is the repository itself, and the pull request is `open` at once."
1401 },
1402 "get_pull_request": {
1403 "response": {
1404 "pull": {
1405 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1406 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1407 "number": 14,
1408 "issue": 12,
1409 "title": "Greeting should name the caller",
1410 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
1411 "agent": "claude-code",
1412 "runtime": "external",
1413 "status": "open",
1414 "fork": {
1415 "namespace": "pulls",
1416 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1417 },
1418 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1419 "branch": null,
1420 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1421 "merge_base": null,
1422 "merged_by": null,
1423 "merged_at": null,
1424 "superseded_by": null,
1425 "check_status": "passed",
1426 "files": [
1427 {
1428 "path": "src/main.rs",
1429 "additions": 6,
1430 "deletions": 2
1431 }
1432 ],
1433 "assignees": [],
1434 "reviewers": [
1435 "ana"
1436 ],
1437 "author": {
1438 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1439 "username": "syntaqx",
1440 "kind": "user",
1441 "verified": false,
1442 "workspaces": []
1443 },
1444 "created_at": "2026-10-01T18:20:02.117Z",
1445 "updated_at": "2026-10-01T18:35:44.902Z"
1446 },
1447 "issue": {
1448 "id": "iss_01m43shrzpfe49x74ga7sj1c6v",
1449 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1450 "number": 12,
1451 "title": "Greeting should name the caller",
1452 "body": "Take a name from the first argument; fall back to world.",
1453 "labels": [
1454 "feature"
1455 ],
1456 "checks": [
1457 "cargo test"
1458 ],
1459 "state": "open",
1460 "reason": null,
1461 "resolved_by": null,
1462 "author": {
1463 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1464 "username": "syntaqx",
1465 "kind": "user",
1466 "verified": false,
1467 "workspaces": []
1468 },
1469 "created_at": "2026-10-01T18:04:11.482Z",
1470 "updated_at": "2026-10-01T18:20:02.117Z",
1471 "closed_at": null,
1472 "pull_count": 1,
1473 "comment_count": 0,
1474 "assignees": [],
1475 "blocked_by": [],
1476 "queued": false,
1477 "agent": "claude-code"
1478 },
1479 "comments": [
1480 {
1481 "id": "cmt_01m43st6d0f4h8k2n6r0v4z8c2",
1482 "kind": "event",
1483 "author": {
1484 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1485 "username": "syntaqx",
1486 "kind": "user",
1487 "verified": false,
1488 "workspaces": []
1489 },
1490 "body": "marked this ready for review",
1491 "path": null,
1492 "line": null,
1493 "verdict": null,
1494 "created_at": "2026-10-01T18:33:10.420Z"
1495 }
1496 ],
1497 "checks": {
1498 "id": "chk_01m43sw8e2g6j0m4q8t2x6a0c4",
1499 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1500 "status": "passed",
1501 "results": [
1502 {
1503 "command": "cargo test",
1504 "passed": true,
1505 "exit_code": 0,
1506 "output": "test result: ok. 3 passed; 0 failed",
1507 "duration_ms": 18234
1508 }
1509 ],
1510 "error": null,
1511 "created_at": "2026-10-01T18:33:11.002Z",
1512 "finished_at": "2026-10-01T18:35:44.902Z"
1513 },
1514 "overlaps": [],
1515 "behind": false,
1516 "review_pending": false,
1517 "lifecycle": null,
1518 "landing": false,
1519 "stalled": null,
1520 "messages": [
1521 {
1522 "id": "msg_01m43tx5egeh4t3f9zcnjenqvz",
1523 "author": "syntaqx",
1524 "body": "Keep \"world\" as the default when no name is given.",
1525 "created_at": "2026-10-01T18:25:00.310Z",
1526 "delivered_at": "2026-10-01T18:25:31.007Z",
1527 "kind": "message",
1528 "from_number": null,
1529 "to_number": 14,
1530 "answer": null,
1531 "declined": false
1532 }
1533 ],
1534 "statuses": []
1535 },
1536 "notes": "| Field | |\n| --- | --- |\n| `pull.files` | The files it changes, with lines added and removed. |\n| `checks` | The latest run of the acceptance checks against its head, with each command's output. |\n| `overlaps` | Other pull requests in progress that change the same files. |\n| `behind` | Whether the default branch has moved since it was made. |\n| `landing` | Whether it is being brought up to date to land. |\n| `lifecycle` | For a pull request the g1t agent is seeing through: its stage, such as `working`, `checking`, `reviewing` or `needs_you`. |\n| `comments` | Comments, reviews and events, with `path`, `line` and `verdict`. |\n| `messages` | Messages sent to the agent working on it. |\n| `statuses` | Commit statuses reported for its head, such as workflow runs. |\n| `mergeable` | Whether it merges cleanly into its target: `clean`, `conflicting`, `checking` (being worked out) or `unknown`. Worked out ahead of time whenever it or its target moves. |\n| `conflicts` | When `mergeable` is `conflicting`, the files that conflict. Resolve them by merging the target in, or have the g1t agent do it. |\n| `earlierChecks` | Earlier runs of the acceptance checks, newest first, without their output. |\n\nChecks are started by g1t, not through the API. They run when a pull request becomes ready for review and again when its head moves."
1537 },
1538 "get_pull_request_changes": {
1539 "response": {
1540 "base": "3a7e9c1b5d2f4a6c8e0b2d4f6a8c0e2b4d6f8a1c",
1541 "head": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1542 "files": [
1543 {
1544 "path": "src/main.rs",
1545 "status": "modified",
1546 "additions": 1,
1547 "deletions": 1,
1548 "binary": false,
1549 "hunks": [
1550 {
1551 "lines": [
1552 {
1553 "kind": "context",
1554 "old": 3,
1555 "new": 3,
1556 "text": "fn main() {"
1557 },
1558 {
1559 "kind": "delete",
1560 "old": 4,
1561 "new": null,
1562 "text": " println!(\"Hello, world!\");"
1563 },
1564 {
1565 "kind": "add",
1566 "old": null,
1567 "new": 4,
1568 "text": " println!(\"Hello, {}!\", std::env::args().nth(1).unwrap_or(\"world\".into()));"
1569 },
1570 {
1571 "kind": "context",
1572 "old": 5,
1573 "new": 5,
1574 "text": "}"
1575 }
1576 ]
1577 }
1578 ]
1579 }
1580 ],
1581 "truncated": false
1582 },
1583 "notes": "A file's `status` is `added`, `modified` or `deleted`. A binary file has no `hunks`. In a line, `old` is `null` when it was added and `new` is `null` when it was deleted."
1584 },
1585 "mark_pull_request_ready": {
1586 "request": {
1587 "summary": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\"."
1588 },
1589 "response": {
1590 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1591 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1592 "number": 14,
1593 "issue": 12,
1594 "title": "Greeting should name the caller",
1595 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
1596 "agent": "claude-code",
1597 "runtime": "external",
1598 "status": "open",
1599 "fork": {
1600 "namespace": "pulls",
1601 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1602 },
1603 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1604 "branch": null,
1605 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1606 "merge_base": null,
1607 "merged_by": null,
1608 "merged_at": null,
1609 "superseded_by": null,
1610 "check_status": null,
1611 "files": [
1612 {
1613 "path": "src/main.rs",
1614 "additions": 6,
1615 "deletions": 2
1616 }
1617 ],
1618 "assignees": [],
1619 "reviewers": [],
1620 "author": {
1621 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1622 "username": "syntaqx",
1623 "kind": "user",
1624 "verified": false,
1625 "workspaces": []
1626 },
1627 "created_at": "2026-10-01T18:20:02.117Z",
1628 "updated_at": "2026-10-01T18:33:10.398Z"
1629 }
1630 },
1631 "review_pull_request": {
1632 "request": {
1633 "verdict": "request_changes",
1634 "body": "Trim the name before using it."
1635 },
1636 "response": {
1637 "id": "cmt_01m43sx9f3h7k1n5r9v3z7d1g5",
1638 "kind": "comment",
1639 "author": {
1640 "id": "usr_01kz9d3f7h1k5n9r3v7z1c5g9b",
1641 "username": "ana",
1642 "kind": "user",
1643 "verified": true,
1644 "workspaces": [
1645 {
1646 "slug": "flagon-io",
1647 "role": "member"
1648 }
1649 ]
1650 },
1651 "body": "Trim the name before using it.",
1652 "path": null,
1653 "line": null,
1654 "verdict": "request_changes",
1655 "created_at": "2026-10-01T18:40:05.019Z"
1656 }
1657 },
1658 "merge_pull_request": {
1659 "request": {
1660 "keep_issue_open": false
1661 },
1662 "response": {
1663 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1664 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1665 "number": 14,
1666 "issue": 12,
1667 "title": "Greeting should name the caller",
1668 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
1669 "agent": "claude-code",
1670 "runtime": "external",
1671 "status": "merged",
1672 "fork": {
1673 "namespace": "pulls",
1674 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1675 },
1676 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1677 "branch": null,
1678 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1679 "merge_base": "3a7e9c1b5d2f4a6c8e0b2d4f6a8c0e2b4d6f8a1c",
1680 "merged_by": "syntaqx",
1681 "merged_at": "2026-10-01T18:52:17.093Z",
1682 "superseded_by": null,
1683 "check_status": "passed",
1684 "files": [
1685 {
1686 "path": "src/main.rs",
1687 "additions": 6,
1688 "deletions": 2
1689 }
1690 ],
1691 "assignees": [],
1692 "reviewers": [
1693 "ana"
1694 ],
1695 "author": {
1696 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1697 "username": "syntaqx",
1698 "kind": "user",
1699 "verified": false,
1700 "workspaces": []
1701 },
1702 "created_at": "2026-10-01T18:20:02.117Z",
1703 "updated_at": "2026-10-01T18:52:17.093Z"
1704 },
1705 "notes": "A draft, or one whose checks have not passed, answers `409`. A pull request still `open` in the response has not landed yet: `landing` is true on it while it is brought up to date, and [get the merge queue](/reference/api/pull-requests/get-merge-queue/) shows it waiting in the [merge queue](/guides/merge-queue/). Merging records the pull request in the issue's `resolved_by` and sets `superseded_by` on the pull requests it closes."
1706 },
1707 "close_pull_request": {
1708 "response": {
1709 "id": "pr_01m43smh3vexsr5pmp60qwv0vs",
1710 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
1711 "number": 14,
1712 "issue": 12,
1713 "title": "Greeting should name the caller",
1714 "body": "Reads a name from the first argument. `hello ana` prints \"Hello, ana!\".",
1715 "agent": "claude-code",
1716 "runtime": "external",
1717 "status": "closed",
1718 "fork": {
1719 "namespace": "pulls",
1720 "name": "pr_01m43smh3vexsr5pmp60qwv0vs"
1721 },
1722 "fork_repo_id": "rep_01m43smh5xd7aw2kq9tv0b4c8e",
1723 "branch": null,
1724 "head_commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1725 "merge_base": null,
1726 "merged_by": null,
1727 "merged_at": null,
1728 "superseded_by": null,
1729 "check_status": null,
1730 "files": [
1731 {
1732 "path": "src/main.rs",
1733 "additions": 6,
1734 "deletions": 2
1735 }
1736 ],
1737 "assignees": [],
1738 "reviewers": [],
1739 "author": {
1740 "id": "usr_01kkntcg1eeb98j62xjm7eh09p",
1741 "username": "syntaqx",
1742 "kind": "user",
1743 "verified": false,
1744 "workspaces": []
1745 },
1746 "created_at": "2026-10-01T18:20:02.117Z",
1747 "updated_at": "2026-10-01T19:02:48.760Z"
1748 }
1749 },
1750 "get_merge_queue": {
1751 "response": {
1752 "enabled": true,
1753 "active": [
1754 {
1755 "id": "qen_01m43rn0qsft1tpap1awkewzbb",
1756 "number": 14,
1757 "title": "Greeting should name the caller",
1758 "agent": "claude-code",
1759 "state": "testing",
1760 "ahead": [],
1761 "base_commit": "3a7e9c1b5d2f4a6c8e0b2d4f6a8c0e2b4d6f8a1c",
1762 "combined_commit": null,
1763 "error": null,
1764 "results": [],
1765 "enqueued_by": "syntaqx",
1766 "created_at": "2026-10-04T15:31:20.441Z",
1767 "finished_at": null
1768 }
1769 ],
1770 "recent": [
1771 {
1772 "id": "qen_01m43khqjmeb5a1magayrnk63z",
1773 "number": 11,
1774 "title": "Fix trailing newline in greeting",
1775 "agent": "g1t-agent",
1776 "state": "landed",
1777 "ahead": [],
1778 "base_commit": "4b1d7e9c2a5f8e3d6c0b9a7e5d3c1b8a6f4e2d0c",
1779 "combined_commit": "c3e8a1f6d4b2097e5c3a1f8d6b4e2c0a9f7d5b3e",
1780 "error": null,
1781 "results": [
1782 {
1783 "command": "cargo test",
1784 "passed": true,
1785 "exit_code": 0,
1786 "output": "test result: ok. 12 passed; 0 failed\n",
1787 "duration_ms": 48211
1788 }
1789 ],
1790 "enqueued_by": "g1t",
1791 "created_at": "2026-10-04T14:02:09.876Z",
1792 "finished_at": "2026-10-04T14:09:55.102Z"
1793 }
1794 ]
1795 },
1796 "notes": "An entry's `state` is `waiting`, `testing`, `passed`, `failed`, `landed` or `removed`. `active` is in queue order; `recent` holds at most 20, newest first."
1797 },
1798 "message_agent": {
1799 "request": {
1800 "body": "Keep \"world\" as the default when no name is given."
1801 },
1802 "response": {
1803 "id": "msg_01m43tx5egeh4t3f9zcnjenqvz",
1804 "author": "syntaqx",
1805 "body": "Keep \"world\" as the default when no name is given.",
1806 "created_at": "2026-10-01T18:25:00.310Z",
1807 "delivered_at": null,
1808 "kind": "message",
1809 "from_number": null,
1810 "to_number": 14,
1811 "answer": null,
1812 "declined": false
1813 },
1814 "notes": "The response is the message. `delivered_at` is set once the agent has read it."
1815 },
1816 "answer_message": {
1817 "params": {
1818 "id": "msg_01m43t66tde8hs2vpxhh3v8tqw"
1819 },
1820 "request": {
1821 "body": "No. greet() keeps its name; only greet_named() is added."
1822 },
1823 "response": {
1824 "id": "msg_01m43t66tde8hs2vpxhh3v8tqw",
1825 "author": "g1t-agent",
1826 "body": "Are you renaming greet() in src/lib.rs? I need to call it from #16.",
1827 "created_at": "2026-10-01T18:58:12.301Z",
1828 "delivered_at": "2026-10-01T18:58:40.117Z",
1829 "kind": "question",
1830 "from_number": 16,
1831 "to_number": 14,
1832 "answer": "No. greet() keeps its name; only greet_named() is added.",
1833 "declined": false
1834 },
1835 "notes": "The response is the question or handoff that was answered, with `answer` and `declined` filled in."
1836 },
1837 "take_messages": {
1838 "response": [
1839 {
1840 "id": "msg_01m43tx5egeh4t3f9zcnjenqvz",
1841 "author": "syntaqx",
1842 "body": "Keep \"world\" as the default when no name is given.",
1843 "created_at": "2026-10-01T18:25:00.310Z",
1844 "delivered_at": "2026-10-01T18:25:31.007Z",
1845 "kind": "message",
1846 "from_number": null,
1847 "to_number": 14,
1848 "answer": null,
1849 "declined": false
1850 }
1851 ],
1852 "notes": "Only a g1t agent's token can take messages. They come oldest first, and each is marked delivered."
1853 },
1854 "read_session": {
1855 "query": {
1856 "after": 0
1857 },
1858 "response": [
1859 {
1860 "seq": 1,
1861 "kind": "prompt",
1862 "text": "Make the greeting name the caller (issue #12).",
1863 "tool": null,
1864 "commit": null,
1865 "at": "2026-10-01T18:21:00.004Z"
1866 },
1867 {
1868 "seq": 2,
1869 "kind": "tool_call",
1870 "text": "cargo test",
1871 "tool": "bash",
1872 "commit": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1873 "at": "2026-10-01T18:30:12.660Z"
1874 }
1875 ]
1876 },
1877 "record_session": {
1878 "request": {
1879 "entries": [
1880 {
1881 "kind": "message",
1882 "text": "Reading src/main.rs."
1883 },
1884 {
1885 "kind": "tool_call",
1886 "text": "cargo test",
1887 "tool": "bash"
1888 }
1889 ]
1890 },
1891 "response": {
1892 "count": 2
1893 },
1894 "notes": "Up to 200 entries can be appended per request. Each is recorded against the pull request's head commit at the time. See [sessions and why-blame](/guides/why-blame/)."
1895 },
1896 "list_workflows": {
1897 "response": [
1898 {
1899 "id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
1900 "path": ".g1t/workflows/ci.yml",
1901 "name": "CI",
1902 "events": [
1903 "push",
1904 "pull_request",
1905 "workflow_dispatch"
1906 ],
1907 "state": "active",
1908 "error": null,
1909 "notes": [
1910 {
1911 "severity": "unsupported",
1912 "job": "test",
1913 "message": "`services` containers (such as a database) are not started on g1t yet."
1914 }
1915 ],
1916 "dispatch": {
1917 "debug": {
1918 "description": "Verbose logs",
1919 "type": "boolean",
1920 "default": false
1921 }
1922 },
1923 "last_run": {
1924 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
1925 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
1926 "path": ".g1t/workflows/ci.yml",
1927 "name": "CI",
1928 "title": "Greeting should name the caller",
1929 "number": 12,
1930 "attempt": 1,
1931 "event": "push",
1932 "ref": "refs/heads/main",
1933 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1934 "pull": null,
1935 "status": "completed",
1936 "conclusion": "success",
1937 "error": null,
1938 "actor": "syntaqx",
1939 "created_at": "2026-10-04T15:42:07.318Z",
1940 "started_at": "2026-10-04T15:42:09.020Z",
1941 "finished_at": "2026-10-04T15:44:31.877Z"
1942 }
1943 },
1944 {
1945 "id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9nq",
1946 "path": ".g1t/workflows/nightly.yml",
1947 "name": "Nightly",
1948 "events": [
1949 "schedule"
1950 ],
1951 "state": "disabled",
1952 "error": null,
1953 "notes": [],
1954 "dispatch": null,
1955 "last_run": null
1956 }
1957 ],
1958 "notes": "`state` is `active` or `disabled`. `dispatch` holds the `workflow_dispatch` inputs, or is `null` when the workflow cannot be run by hand. See [GitHub Actions](/guides/actions/)."
1959 },
1960 "list_workflow_runs": {
1961 "query": {
1962 "workflow": "ci.yml",
1963 "branch": "main",
1964 "per_page": 20
1965 },
1966 "response": [
1967 {
1968 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
1969 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
1970 "path": ".g1t/workflows/ci.yml",
1971 "name": "CI",
1972 "title": "Greeting should name the caller",
1973 "number": 12,
1974 "attempt": 1,
1975 "event": "push",
1976 "ref": "refs/heads/main",
1977 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
1978 "pull": null,
1979 "status": "completed",
1980 "conclusion": "success",
1981 "error": null,
1982 "actor": "syntaqx",
1983 "created_at": "2026-10-04T15:42:07.318Z",
1984 "started_at": "2026-10-04T15:42:09.020Z",
1985 "finished_at": "2026-10-04T15:44:31.877Z"
1986 }
1987 ],
1988 "notes": "A run's `status` is `queued`, `pending` (waiting for its concurrency group), `in_progress` or `completed`; `conclusion` is set once it completes."
1989 },
1990 "list_runs_of_workflow": {
1991 "params": {
1992 "workflow": "ci.yml"
1993 },
1994 "query": {
1995 "branch": "main",
1996 "per_page": 20
1997 },
1998 "response": [
1999 {
2000 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2001 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2002 "path": ".g1t/workflows/ci.yml",
2003 "name": "CI",
2004 "title": "Greeting should name the caller",
2005 "number": 12,
2006 "attempt": 1,
2007 "event": "push",
2008 "ref": "refs/heads/main",
2009 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2010 "pull": null,
2011 "status": "completed",
2012 "conclusion": "success",
2013 "error": null,
2014 "actor": "syntaqx",
2015 "created_at": "2026-10-04T15:42:07.318Z",
2016 "started_at": "2026-10-04T15:42:09.020Z",
2017 "finished_at": "2026-10-04T15:44:31.877Z"
2018 }
2019 ]
2020 },
2021 "get_workflow_run": {
2022 "params": {
2023 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr"
2024 },
2025 "response": {
2026 "run": {
2027 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2028 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2029 "path": ".g1t/workflows/ci.yml",
2030 "name": "CI",
2031 "title": "Greeting should name the caller",
2032 "number": 12,
2033 "attempt": 1,
2034 "event": "push",
2035 "ref": "refs/heads/main",
2036 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2037 "pull": null,
2038 "status": "completed",
2039 "conclusion": "failure",
2040 "error": null,
2041 "actor": "syntaqx",
2042 "created_at": "2026-10-04T15:42:07.318Z",
2043 "started_at": "2026-10-04T15:42:09.020Z",
2044 "finished_at": "2026-10-04T15:44:31.877Z"
2045 },
2046 "jobs": [
2047 {
2048 "id": "job_01kpx7b3d0e4f8g2h6j0k4m8ns",
2049 "run_id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2050 "key": "test",
2051 "name": "test",
2052 "needs": [],
2053 "status": "completed",
2054 "conclusion": "failure",
2055 "steps": [
2056 {
2057 "number": 1,
2058 "name": "Run actions/checkout@v4",
2059 "status": "completed",
2060 "conclusion": "success",
2061 "started_at": "2026-10-04T15:42:10.101Z",
2062 "finished_at": "2026-10-04T15:42:12.433Z"
2063 },
2064 {
2065 "number": 2,
2066 "name": "Run cargo test",
2067 "status": "completed",
2068 "conclusion": "failure",
2069 "started_at": "2026-10-04T15:42:12.440Z",
2070 "finished_at": "2026-10-04T15:44:30.902Z"
2071 }
2072 ],
2073 "annotations": [
2074 {
2075 "level": "error",
2076 "message": "assertion failed: greeting names the caller",
2077 "title": "greet",
2078 "file": "src/main.rs",
2079 "line": 41
2080 }
2081 ],
2082 "reason": null,
2083 "started_at": "2026-10-04T15:42:09.020Z",
2084 "finished_at": "2026-10-04T15:44:31.002Z"
2085 },
2086 {
2087 "id": "job_01kpx7b3d0e4f8g2h6j0k4m8nt",
2088 "run_id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2089 "key": "deploy",
2090 "name": "deploy",
2091 "needs": [
2092 "test"
2093 ],
2094 "status": "completed",
2095 "conclusion": "skipped",
2096 "steps": [],
2097 "annotations": [],
2098 "reason": "A job it needs did not succeed.",
2099 "started_at": null,
2100 "finished_at": "2026-10-04T15:44:31.877Z"
2101 }
2102 ],
2103 "notes": [
2104 {
2105 "severity": "unsupported",
2106 "job": "test",
2107 "message": "`services` containers (such as a database) are not started on g1t yet."
2108 }
2109 ]
2110 }
2111 },
2112 "get_job_logs": {
2113 "params": {
2114 "job": "job_01kpx7b3d0e4f8g2h6j0k4m8ns"
2115 },
2116 "query": {
2117 "after": 0
2118 },
2119 "response": {
2120 "chunks": [
2121 {
2122 "seq": 1,
2123 "step": 0,
2124 "text": "Preparing the sandbox\n"
2125 },
2126 {
2127 "seq": 2,
2128 "step": 2,
2129 "text": "> cargo test\ntest greet ... FAILED\n"
2130 }
2131 ],
2132 "done": true
2133 },
2134 "notes": "Returns at most 500 chunks. Step 0 is the job's setup. While `done` is false, call again with the last `seq` as `after`."
2135 },
2136 "dispatch_workflow": {
2137 "params": {
2138 "workflow": "ci.yml"
2139 },
2140 "request": {
2141 "ref": "main",
2142 "inputs": {
2143 "debug": true
2144 }
2145 },
2146 "response": {
2147 "id": "run_01kpx8d4e7f0g3h6j9k2m5n8pq",
2148 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2149 "path": ".g1t/workflows/ci.yml",
2150 "name": "CI",
2151 "title": "CI run by syntaqx",
2152 "number": 13,
2153 "attempt": 1,
2154 "event": "workflow_dispatch",
2155 "ref": "refs/heads/main",
2156 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2157 "pull": null,
2158 "status": "queued",
2159 "conclusion": null,
2160 "error": null,
2161 "actor": "syntaqx",
2162 "created_at": "2026-10-04T16:30:00.512Z",
2163 "started_at": null,
2164 "finished_at": null
2165 }
2166 },
2167 "cancel_workflow_run": {
2168 "params": {
2169 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr"
2170 },
2171 "response": {
2172 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2173 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2174 "path": ".g1t/workflows/ci.yml",
2175 "name": "CI",
2176 "title": "Greeting should name the caller",
2177 "number": 12,
2178 "attempt": 1,
2179 "event": "push",
2180 "ref": "refs/heads/main",
2181 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2182 "pull": null,
2183 "status": "completed",
2184 "conclusion": "cancelled",
2185 "error": null,
2186 "actor": "syntaqx",
2187 "created_at": "2026-10-04T15:42:07.318Z",
2188 "started_at": "2026-10-04T15:42:09.020Z",
2189 "finished_at": "2026-10-04T15:44:31.877Z"
2190 }
2191 },
2192 "rerun_workflow_run": {
2193 "params": {
2194 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr"
2195 },
2196 "request": {
2197 "failed_only": true
2198 },
2199 "response": {
2200 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2201 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2202 "path": ".g1t/workflows/ci.yml",
2203 "name": "CI",
2204 "title": "Greeting should name the caller",
2205 "number": 12,
2206 "attempt": 2,
2207 "event": "push",
2208 "ref": "refs/heads/main",
2209 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2210 "pull": null,
2211 "status": "queued",
2212 "conclusion": null,
2213 "error": null,
2214 "actor": "syntaqx",
2215 "created_at": "2026-10-04T15:42:07.318Z",
2216 "started_at": null,
2217 "finished_at": null
2218 },
2219 "notes": "The run keeps its id; `attempt` goes up by one."
2220 },
2221 "rerun_failed_jobs": {
2222 "params": {
2223 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr"
2224 },
2225 "response": {
2226 "id": "run_01kpx7b3c6d9e2f5g8h1j4k7mr",
2227 "workflow_id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9np",
2228 "path": ".g1t/workflows/ci.yml",
2229 "name": "CI",
2230 "title": "Greeting should name the caller",
2231 "number": 12,
2232 "attempt": 2,
2233 "event": "push",
2234 "ref": "refs/heads/main",
2235 "sha": "9f2c4e1a7b3d5f60812a4c6e8b0d2f4a6c8e0b13",
2236 "pull": null,
2237 "status": "queued",
2238 "conclusion": null,
2239 "error": null,
2240 "actor": "syntaqx",
2241 "created_at": "2026-10-04T15:42:07.318Z",
2242 "started_at": null,
2243 "finished_at": null
2244 }
2245 },
2246 "update_workflow": {
2247 "params": {
2248 "workflow": "nightly.yml"
2249 },
2250 "request": {
2251 "enabled": false
2252 },
2253 "response": {
2254 "id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9nq",
2255 "path": ".g1t/workflows/nightly.yml",
2256 "name": "Nightly",
2257 "events": [
2258 "schedule"
2259 ],
2260 "state": "disabled",
2261 "error": null,
2262 "notes": [],
2263 "dispatch": null,
2264 "last_run": null
2265 }
2266 },
2267 "enable_workflow": {
2268 "params": {
2269 "workflow": "nightly.yml"
2270 },
2271 "response": {
2272 "id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9nq",
2273 "path": ".g1t/workflows/nightly.yml",
2274 "name": "Nightly",
2275 "events": [
2276 "schedule"
2277 ],
2278 "state": "active",
2279 "error": null,
2280 "notes": [],
2281 "dispatch": null,
2282 "last_run": null
2283 }
2284 },
2285 "disable_workflow": {
2286 "params": {
2287 "workflow": "nightly.yml"
2288 },
2289 "response": {
2290 "id": "wfl_01kpw2c5d8e1f4g7h0j3k6m9nq",
2291 "path": ".g1t/workflows/nightly.yml",
2292 "name": "Nightly",
2293 "events": [
2294 "schedule"
2295 ],
2296 "state": "disabled",
2297 "error": null,
2298 "notes": [],
2299 "dispatch": null,
2300 "last_run": null
2301 }
2302 },
2303 "list_actions_secrets": {
2304 "response": [
2305 {
2306 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ab",
2307 "name": "NPM_TOKEN",
2308 "kind": "secret",
2309 "value": null,
2310 "scope": "workspace",
2311 "updated_at": "2026-10-01T09:12:44.020Z",
2312 "available_to": [
2313 "workflows"
2314 ],
2315 "environments": [],
2316 "projects": [],
2317 "note": null,
2318 "updated_by": "syntaqx"
2319 },
2320 {
2321 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ac",
2322 "name": "STRIPE_KEY",
2323 "kind": "secret",
2324 "value": null,
2325 "scope": "project",
2326 "updated_at": "2026-10-04T15:42:07.318Z",
2327 "available_to": [
2328 "workflows",
2329 "deployments"
2330 ],
2331 "environments": [
2332 "production"
2333 ],
2334 "projects": [],
2335 "note": "Rotate in the Stripe dashboard.",
2336 "updated_by": "syntaqx"
2337 }
2338 ],
2339 "notes": "Values are never returned. A repository's list includes the workspace's rows that reach it, with `scope` set to `workspace`. Empty `environments` means every environment."
2340 },
2341 "list_actions_secrets_for_workspace": {
2342 "params": {
2343 "workspace": "flagon-io"
2344 },
2345 "response": [
2346 {
2347 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ab",
2348 "name": "NPM_TOKEN",
2349 "kind": "secret",
2350 "value": null,
2351 "scope": "workspace",
2352 "updated_at": "2026-10-04T15:42:07.318Z",
2353 "available_to": [
2354 "workflows"
2355 ],
2356 "environments": [],
2357 "projects": [],
2358 "note": null,
2359 "updated_by": "syntaqx"
2360 }
2361 ],
2362 "notes": "Values are never returned. A repository's list includes the workspace's rows that reach it, with `scope` set to `workspace`. Empty `environments` means every environment."
2363 },
2364 "set_actions_secret": {
2365 "params": {
2366 "setting": "STRIPE_KEY"
2367 },
2368 "request": {
2369 "value": "sk_live_…",
2370 "available_to": [
2371 "workflows",
2372 "deployments"
2373 ],
2374 "environments": [
2375 "production"
2376 ]
2377 },
2378 "response": {
2379 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ac",
2380 "name": "STRIPE_KEY",
2381 "kind": "secret",
2382 "value": null,
2383 "scope": "project",
2384 "updated_at": "2026-10-04T15:42:07.318Z",
2385 "available_to": [
2386 "workflows",
2387 "deployments"
2388 ],
2389 "environments": [
2390 "production"
2391 ],
2392 "projects": [],
2393 "note": null,
2394 "updated_by": "syntaqx"
2395 },
2396 "notes": "Keys are uppercased. See [secrets and variables](/guides/secrets-and-variables/)."
2397 },
2398 "set_actions_secret_for_workspace": {
2399 "params": {
2400 "workspace": "flagon-io",
2401 "setting": "NPM_TOKEN"
2402 },
2403 "request": {
2404 "value": "npm_…",
2405 "projects": [
2406 "hello"
2407 ]
2408 },
2409 "response": {
2410 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ac",
2411 "name": "NPM_TOKEN",
2412 "kind": "secret",
2413 "value": null,
2414 "scope": "workspace",
2415 "updated_at": "2026-10-04T15:42:07.318Z",
2416 "available_to": [
2417 "workflows"
2418 ],
2419 "environments": [],
2420 "projects": [
2421 "hello"
2422 ],
2423 "note": null,
2424 "updated_by": "syntaqx"
2425 }
2426 },
2427 "delete_actions_secret": {
2428 "params": {
2429 "setting": "STRIPE_KEY"
2430 },
2431 "response": true
2432 },
2433 "delete_actions_secret_for_workspace": {
2434 "params": {
2435 "workspace": "flagon-io",
2436 "setting": "NPM_TOKEN"
2437 },
2438 "response": true
2439 },
2440 "list_actions_variables": {
2441 "response": [
2442 {
2443 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2444 "name": "NODE_VERSION",
2445 "kind": "variable",
2446 "value": "20",
2447 "scope": "project",
2448 "updated_at": "2026-10-04T15:42:07.318Z",
2449 "available_to": [
2450 "workflows",
2451 "deployments"
2452 ],
2453 "environments": [],
2454 "projects": [],
2455 "note": null,
2456 "updated_by": "syntaqx"
2457 }
2458 ],
2459 "notes": "A repository's list includes the workspace's rows that reach it, with `scope` set to `workspace`. Empty `environments` means every environment."
2460 },
2461 "list_actions_variables_for_workspace": {
2462 "params": {
2463 "workspace": "flagon-io"
2464 },
2465 "response": [
2466 {
2467 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2468 "name": "NODE_VERSION",
2469 "kind": "variable",
2470 "value": "20",
2471 "scope": "workspace",
2472 "updated_at": "2026-10-04T15:42:07.318Z",
2473 "available_to": [
2474 "workflows",
2475 "deployments"
2476 ],
2477 "environments": [],
2478 "projects": [],
2479 "note": null,
2480 "updated_by": "syntaqx"
2481 }
2482 ]
2483 },
2484 "set_actions_variable": {
2485 "request": {
2486 "setting": "NODE_VERSION",
2487 "value": "20"
2488 },
2489 "response": {
2490 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2491 "name": "NODE_VERSION",
2492 "kind": "variable",
2493 "value": "20",
2494 "scope": "project",
2495 "updated_at": "2026-10-04T15:42:07.318Z",
2496 "available_to": [
2497 "workflows",
2498 "deployments"
2499 ],
2500 "environments": [],
2501 "projects": [],
2502 "note": null,
2503 "updated_by": "syntaqx"
2504 },
2505 "notes": "GitHub's clients send the key as `name`; that is accepted too."
2506 },
2507 "set_actions_variable_for_workspace": {
2508 "params": {
2509 "workspace": "flagon-io"
2510 },
2511 "request": {
2512 "setting": "NODE_VERSION",
2513 "value": "20"
2514 },
2515 "response": {
2516 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2517 "name": "NODE_VERSION",
2518 "kind": "variable",
2519 "value": "20",
2520 "scope": "workspace",
2521 "updated_at": "2026-10-04T15:42:07.318Z",
2522 "available_to": [
2523 "workflows",
2524 "deployments"
2525 ],
2526 "environments": [],
2527 "projects": [],
2528 "note": null,
2529 "updated_by": "syntaqx"
2530 }
2531 },
2532 "update_actions_variable": {
2533 "params": {
2534 "setting": "NODE_VERSION"
2535 },
2536 "request": {
2537 "value": "22"
2538 },
2539 "response": {
2540 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2541 "name": "NODE_VERSION",
2542 "kind": "variable",
2543 "value": "22",
2544 "scope": "project",
2545 "updated_at": "2026-10-04T15:42:07.318Z",
2546 "available_to": [
2547 "workflows",
2548 "deployments"
2549 ],
2550 "environments": [],
2551 "projects": [],
2552 "note": null,
2553 "updated_by": "syntaqx"
2554 }
2555 },
2556 "update_actions_variable_for_workspace": {
2557 "params": {
2558 "workspace": "flagon-io",
2559 "setting": "NODE_VERSION"
2560 },
2561 "request": {
2562 "value": "22"
2563 },
2564 "response": {
2565 "id": "set_01kpv9q4r7s0t3v6w9x2y5z8ad",
2566 "name": "NODE_VERSION",
2567 "kind": "variable",
2568 "value": "22",
2569 "scope": "workspace",
2570 "updated_at": "2026-10-04T15:42:07.318Z",
2571 "available_to": [
2572 "workflows",
2573 "deployments"
2574 ],
2575 "environments": [],
2576 "projects": [],
2577 "note": null,
2578 "updated_by": "syntaqx"
2579 }
2580 },
2581 "delete_actions_variable": {
2582 "params": {
2583 "setting": "NODE_VERSION"
2584 },
2585 "response": true
2586 },
2587 "delete_actions_variable_for_workspace": {
2588 "params": {
2589 "workspace": "flagon-io",
2590 "setting": "NODE_VERSION"
2591 },
2592 "response": true
2593 },
2594 "list_webhooks": {
2595 "response": [
2596 {
2597 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2598 "scope": "repo",
2599 "workspace": "flagon-io",
2600 "repo": "flagon-io/hello",
2601 "url": "https://hooks.example.com/g1t",
2602 "events": [
2603 "git.push",
2604 "pull.merged"
2605 ],
2606 "active": true,
2607 "secret_hint": "…9c2e",
2608 "created_by": "syntaqx",
2609 "created_at": "2026-10-04T15:42:07.318Z",
2610 "last_status": "delivered",
2611 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2612 }
2613 ]
2614 },
2615 "list_webhooks_for_workspace": {
2616 "params": {
2617 "workspace": "flagon-io"
2618 },
2619 "response": [
2620 {
2621 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2622 "scope": "workspace",
2623 "workspace": "flagon-io",
2624 "repo": null,
2625 "url": "https://hooks.example.com/g1t",
2626 "events": [
2627 "git.push",
2628 "pull.merged"
2629 ],
2630 "active": true,
2631 "secret_hint": "…9c2e",
2632 "created_by": "syntaqx",
2633 "created_at": "2026-10-04T15:42:07.318Z",
2634 "last_status": "delivered",
2635 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2636 }
2637 ]
2638 },
2639 "create_webhook": {
2640 "request": {
2641 "url": "https://hooks.example.com/g1t",
2642 "events": [
2643 "git.push",
2644 "pull.merged"
2645 ]
2646 },
2647 "response": {
2648 "hook": {
2649 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2650 "scope": "repo",
2651 "workspace": "flagon-io",
2652 "repo": "flagon-io/hello",
2653 "url": "https://hooks.example.com/g1t",
2654 "events": [
2655 "git.push",
2656 "pull.merged"
2657 ],
2658 "active": true,
2659 "secret_hint": "…9c2e",
2660 "created_by": "syntaqx",
2661 "created_at": "2026-10-04T15:42:07.318Z",
2662 "last_status": "delivered",
2663 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2664 },
2665 "secret": "whsec_…"
2666 },
2667 "notes": "A ping is sent before the response, so `last_status` is usually set already. When g1t made the signing secret, `secret` holds it: it is shown only this once. See [webhooks](/guides/webhooks/)."
2668 },
2669 "create_webhook_for_workspace": {
2670 "params": {
2671 "workspace": "flagon-io"
2672 },
2673 "request": {
2674 "url": "https://hooks.example.com/g1t"
2675 },
2676 "response": {
2677 "hook": {
2678 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2679 "scope": "workspace",
2680 "workspace": "flagon-io",
2681 "repo": null,
2682 "url": "https://hooks.example.com/g1t",
2683 "events": [
2684 "*"
2685 ],
2686 "active": true,
2687 "secret_hint": "…9c2e",
2688 "created_by": "syntaqx",
2689 "created_at": "2026-10-04T15:42:07.318Z",
2690 "last_status": "delivered",
2691 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2692 },
2693 "secret": "whsec_…"
2694 },
2695 "notes": "A ping is sent before the response, so `last_status` is usually set already. When g1t made the signing secret, `secret` holds it: it is shown only this once. See [webhooks](/guides/webhooks/)."
2696 },
2697 "update_webhook": {
2698 "params": {
2699 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2700 },
2701 "request": {
2702 "active": false
2703 },
2704 "response": {
2705 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2706 "scope": "repo",
2707 "workspace": "flagon-io",
2708 "repo": "flagon-io/hello",
2709 "url": "https://hooks.example.com/g1t",
2710 "events": [
2711 "git.push",
2712 "pull.merged"
2713 ],
2714 "active": false,
2715 "secret_hint": "…9c2e",
2716 "created_by": "syntaqx",
2717 "created_at": "2026-10-04T15:42:07.318Z",
2718 "last_status": "delivered",
2719 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2720 }
2721 },
2722 "update_webhook_for_workspace": {
2723 "params": {
2724 "workspace": "flagon-io",
2725 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2726 },
2727 "request": {
2728 "active": false
2729 },
2730 "response": {
2731 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2732 "scope": "workspace",
2733 "workspace": "flagon-io",
2734 "repo": null,
2735 "url": "https://hooks.example.com/g1t",
2736 "events": [
2737 "git.push",
2738 "pull.merged"
2739 ],
2740 "active": false,
2741 "secret_hint": "…9c2e",
2742 "created_by": "syntaqx",
2743 "created_at": "2026-10-04T15:42:07.318Z",
2744 "last_status": "delivered",
2745 "last_delivered_at": "2026-10-04T15:42:07.611Z"
2746 }
2747 },
2748 "delete_webhook": {
2749 "params": {
2750 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2751 },
2752 "response": true
2753 },
2754 "delete_webhook_for_workspace": {
2755 "params": {
2756 "workspace": "flagon-io",
2757 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2758 },
2759 "response": true
2760 },
2761 "ping_webhook": {
2762 "params": {
2763 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2764 },
2765 "response": {
2766 "id": "dlv_01kpx5p9v2j7k3m8n4p5q6r7st",
2767 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2768 "event_id": "",
2769 "event": "ping",
2770 "status": "delivered",
2771 "attempts": 1,
2772 "response_status": 200,
2773 "response_body": "ok",
2774 "error": null,
2775 "duration_ms": 184,
2776 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2777 "created_at": "2026-10-04T16:01:12.440Z",
2778 "delivered_at": "2026-10-04T16:01:12.631Z",
2779 "next_attempt_at": null
2780 },
2781 "notes": "`payload` is the JSON that was sent, as a string."
2782 },
2783 "ping_webhook_for_workspace": {
2784 "params": {
2785 "workspace": "flagon-io",
2786 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2787 },
2788 "response": {
2789 "id": "dlv_01kpx5p9v2j7k3m8n4p5q6r7st",
2790 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2791 "event_id": "",
2792 "event": "ping",
2793 "status": "delivered",
2794 "attempts": 1,
2795 "response_status": 200,
2796 "response_body": "ok",
2797 "error": null,
2798 "duration_ms": 184,
2799 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2800 "created_at": "2026-10-04T16:01:12.440Z",
2801 "delivered_at": "2026-10-04T16:01:12.631Z",
2802 "next_attempt_at": null
2803 }
2804 },
2805 "list_webhook_deliveries": {
2806 "params": {
2807 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2808 },
2809 "response": [
2810 {
2811 "id": "dlv_01kpx6a2b3c4d5e6f7g8h9j0kz",
2812 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2813 "event_id": "",
2814 "event": "ping",
2815 "status": "pending",
2816 "attempts": 1,
2817 "response_status": 503,
2818 "response_body": "Service Unavailable",
2819 "error": null,
2820 "duration_ms": 212,
2821 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2822 "created_at": "2026-10-04T16:20:03.100Z",
2823 "delivered_at": null,
2824 "next_attempt_at": "2026-10-04T16:21:03.312Z"
2825 },
2826 {
2827 "id": "dlv_01kpx5p9v2j7k3m8n4p5q6r7st",
2828 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2829 "event_id": "",
2830 "event": "ping",
2831 "status": "delivered",
2832 "attempts": 1,
2833 "response_status": 200,
2834 "response_body": "ok",
2835 "error": null,
2836 "duration_ms": 184,
2837 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2838 "created_at": "2026-10-04T16:01:12.440Z",
2839 "delivered_at": "2026-10-04T16:01:12.631Z",
2840 "next_attempt_at": null
2841 }
2842 ],
2843 "notes": "Returns at most 50, newest first. `status` is `pending`, `delivered` or `failed`; `next_attempt_at` is set while it is pending."
2844 },
2845 "list_webhook_deliveries_for_workspace": {
2846 "params": {
2847 "workspace": "flagon-io",
2848 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd"
2849 },
2850 "response": [
2851 {
2852 "id": "dlv_01kpx6a2b3c4d5e6f7g8h9j0kz",
2853 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2854 "event_id": "",
2855 "event": "ping",
2856 "status": "pending",
2857 "attempts": 1,
2858 "response_status": 503,
2859 "response_body": "Service Unavailable",
2860 "error": null,
2861 "duration_ms": 212,
2862 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2863 "created_at": "2026-10-04T16:20:03.100Z",
2864 "delivered_at": null,
2865 "next_attempt_at": "2026-10-04T16:21:03.312Z"
2866 },
2867 {
2868 "id": "dlv_01kpx5p9v2j7k3m8n4p5q6r7st",
2869 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2870 "event_id": "",
2871 "event": "ping",
2872 "status": "delivered",
2873 "attempts": 1,
2874 "response_status": 200,
2875 "response_body": "ok",
2876 "error": null,
2877 "duration_ms": 184,
2878 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2879 "created_at": "2026-10-04T16:01:12.440Z",
2880 "delivered_at": "2026-10-04T16:01:12.631Z",
2881 "next_attempt_at": null
2882 }
2883 ]
2884 },
2885 "redeliver_webhook": {
2886 "params": {
2887 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2888 "delivery": "dlv_01kpx6a2b3c4d5e6f7g8h9j0kz"
2889 },
2890 "response": {
2891 "id": "dlv_01kpx6c8d1e2f3g4h5j6k7m8np",
2892 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2893 "event_id": "",
2894 "event": "ping",
2895 "status": "delivered",
2896 "attempts": 1,
2897 "response_status": 200,
2898 "response_body": "ok",
2899 "error": null,
2900 "duration_ms": 171,
2901 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2902 "created_at": "2026-10-04T16:25:40.007Z",
2903 "delivered_at": "2026-10-04T16:25:40.178Z",
2904 "next_attempt_at": null
2905 },
2906 "notes": "The response is the new delivery."
2907 },
2908 "redeliver_webhook_for_workspace": {
2909 "params": {
2910 "workspace": "flagon-io",
2911 "id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2912 "delivery": "dlv_01kpx6a2b3c4d5e6f7g8h9j0kz"
2913 },
2914 "response": {
2915 "id": "dlv_01kpx6c8d1e2f3g4h5j6k7m8np",
2916 "hook_id": "hk_01kpx5p9s4h0t1w6x8y2a3b4cd",
2917 "event_id": "",
2918 "event": "ping",
2919 "status": "delivered",
2920 "attempts": 1,
2921 "response_status": 200,
2922 "response_body": "ok",
2923 "error": null,
2924 "duration_ms": 171,
2925 "payload": "{\"hook\":{\"events\":[\"git.push\",\"pull.merged\"],\"id\":\"hk_01kpx5p9s4h0t1w6x8y2a3b4cd\",\"url\":\"https://hooks.example.com/g1t\"},\"message\":\"g1t will send this webhook's events here.\",\"time\":\"2026-10-04T16:01:12.440Z\",\"type\":\"ping\"}",
2926 "created_at": "2026-10-04T16:25:40.007Z",
2927 "delivered_at": "2026-10-04T16:25:40.178Z",
2928 "next_attempt_at": null
2929 }
2930 },
2931 "list_integrations": {
2932 "params": {
2933 "workspace": "flagon-io"
2934 },
2935 "response": [
2936 {
2937 "id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab",
2938 "workspace": "flagon-io",
2939 "provider": "anthropic",
2940 "kind": "models",
2941 "name": "Anthropic",
2942 "config": {
2943 "assign": false,
2944 "write_back": true
2945 },
2946 "secret_hint": "…3f9a",
2947 "webhook_url": null,
2948 "created_by": "syntaqx",
2949 "created_at": "2026-10-04T15:42:07.318Z",
2950 "last_used_at": "2026-10-04T15:42:08.102Z",
2951 "last_error": null,
2952 "models": [
2953 "claude-haiku-4-5",
2954 "claude-sonnet-4-5"
2955 ]
2956 },
2957 {
2958 "id": "con_01kpx4n8r3g9s0v5w7x1z2a3bc",
2959 "workspace": "flagon-io",
2960 "provider": "jira",
2961 "kind": "tracker",
2962 "name": "Jira",
2963 "config": {
2964 "assign": false,
2965 "write_back": true,
2966 "site": "https://acme.atlassian.net",
2967 "email": "syntaqx@example.com",
2968 "keys": [
2969 "TECH"
2970 ]
2971 },
2972 "secret_hint": "…x7Qe",
2973 "webhook_url": null,
2974 "created_by": "syntaqx",
2975 "created_at": "2026-10-04T15:42:07.318Z",
2976 "last_used_at": null,
2977 "last_error": null,
2978 "models": []
2979 }
2980 ],
2981 "notes": "`kind` is `models`, `alerts` or `tracker`. `secret_hint` shows the end of the secret; the secret itself is never returned. `webhook_url` is where an alert source sends its alerts."
2982 },
2983 "connect_integration": {
2984 "params": {
2985 "workspace": "flagon-io"
2986 },
2987 "request": {
2988 "provider": "webhook",
2989 "config": {
2990 "repo": "flagon-io/hello",
2991 "label": "bug"
2992 }
2993 },
2994 "response": {
2995 "connection": {
2996 "id": "con_01kpx4n8r3g9s0v5w7x1z2a3bd",
2997 "workspace": "flagon-io",
2998 "provider": "webhook",
2999 "kind": "alerts",
3000 "name": "Webhook",
3001 "config": {
3002 "repo": "flagon-io/hello",
3003 "label": "bug",
3004 "assign": false,
3005 "write_back": true
3006 },
3007 "secret_hint": null,
3008 "webhook_url": "https://api.g1t.sh/hooks/con_01kpx4n8r3g9s0v5w7x1z2a3bd",
3009 "created_by": "syntaqx",
3010 "created_at": "2026-10-04T15:42:07.318Z",
3011 "last_used_at": null,
3012 "last_error": null,
3013 "models": []
3014 },
3015 "signing_secret": "g1ts_9f2c4a7e1b0d3c6f8a2e5b7d9c1f4a6e8b0d2c4f6a8e1b3d"
3016 },
3017 "notes": "`signing_secret` is set only when g1t made it, for `datadog` and `webhook`, and is shown only this once. A model provider is tested as it is connected. See [integrations](/guides/integrations/) and [model providers](/guides/models/)."
3018 },
3019 "disconnect_integration": {
3020 "params": {
3021 "workspace": "flagon-io",
3022 "id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab"
3023 },
3024 "response": true
3025 },
3026 "test_integration": {
3027 "params": {
3028 "workspace": "flagon-io",
3029 "id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab"
3030 },
3031 "response": {
3032 "ok": true,
3033 "message": "Anthropic accepted the key and offers 9 models."
3034 },
3035 "notes": "Credentials that do not work still answer `200`, with `ok` false and `message` saying what went wrong."
3036 },
3037 "get_model_routes": {
3038 "params": {
3039 "workspace": "flagon-io"
3040 },
3041 "response": [
3042 {
3043 "task": "default",
3044 "connection_id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab",
3045 "model": "claude-sonnet-4-5"
3046 },
3047 {
3048 "task": "review",
3049 "connection_id": null,
3050 "model": null
3051 }
3052 ]
3053 },
3054 "set_model_routes": {
3055 "params": {
3056 "workspace": "flagon-io"
3057 },
3058 "request": {
3059 "routes": [
3060 {
3061 "task": "default",
3062 "connection_id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab",
3063 "model": "claude-sonnet-4-5"
3064 },
3065 {
3066 "task": "review",
3067 "connection_id": null
3068 }
3069 ]
3070 },
3071 "response": [
3072 {
3073 "task": "default",
3074 "connection_id": "con_01kpx3m7q2f8r9t4v6w0y1z2ab",
3075 "model": "claude-sonnet-4-5"
3076 },
3077 {
3078 "task": "review",
3079 "connection_id": null,
3080 "model": null
3081 }
3082 ],
3083 "notes": "The response is the routes as saved, ordered by task."
3084 },
3085 "get_context": {
3086 "query": {
3087 "reference": "TECH-1234"
3088 },
3089 "response": {
3090 "provider": "jira",
3091 "key": "TECH-1234",
3092 "title": "Checkout fails for EU cards",
3093 "url": "https://acme.atlassian.net/browse/TECH-1234",
3094 "status": "In Progress",
3095 "body": "Customers with 3DS cards see a 500 at /pay.",
3096 "fetched_at": "2026-10-04T15:42:07.318Z"
3097 }
3098 },
3099 "import_issue": {
3100 "request": {
3101 "reference": "TECH-1234"
3102 },
3103 "response": {
3104 "number": 42,
3105 "item": {
3106 "provider": "jira",
3107 "key": "TECH-1234",
3108 "title": "Checkout fails for EU cards",
3109 "url": "https://acme.atlassian.net/browse/TECH-1234",
3110 "status": "In Progress",
3111 "body": "Customers with 3DS cards see a 500 at /pay.",
3112 "fetched_at": "2026-10-04T15:42:07.318Z"
3113 },
3114 "created": true
3115 },
3116 "notes": "`created` is false when the ticket was imported before; `number` is then that issue."
3117 },
3118 "remember": {
3119 "request": {
3120 "text": "The tests need TZ=UTC or the date tests fail.",
3121 "scope": "project",
3122 "kind": "gotcha",
3123 "from_number": 14
3124 },
3125 "response": {
3126 "id": "mem_01m43v8q2w3e4r5t6y7u8i9o0p",
3127 "scope": "project",
3128 "workspace": "flagon-io",
3129 "repo": {
3130 "namespace": "flagon-io",
3131 "name": "hello"
3132 },
3133 "text": "The tests need TZ=UTC or the date tests fail.",
3134 "kind": "gotcha",
3135 "source": {
3136 "kind": "run",
3137 "run_id": "arn_01m43v2c1p9k8d7e6f5a4b3c2d",
3138 "repo": {
3139 "namespace": "flagon-io",
3140 "name": "hello"
3141 },
3142 "number": 14
3143 },
3144 "created_by": "g1t-agent",
3145 "pinned": false,
3146 "created_at": "2026-10-01T18:40:12.000Z",
3147 "updated_at": "2026-10-01T18:40:12.000Z",
3148 "last_used_at": null
3149 },
3150 "notes": "Text that looks like a key, a token or a password is refused with `invalid`: memory is read by every agent in the workspace. Saving the same text again in the same scope returns the memory already kept."
3151 },
3152 "recall": {
3153 "query": {
3154 "q": "pnpm"
3155 },
3156 "response": {
3157 "project": [],
3158 "workspace": [
3159 {
3160 "id": "mem_01m43t0a1s2d3f4g5h6j7k8l9z",
3161 "scope": "workspace",
3162 "workspace": "flagon-io",
3163 "repo": null,
3164 "text": "We use pnpm everywhere, never npm or yarn.",
3165 "kind": "convention",
3166 "source": {
3167 "kind": "person",
3168 "run_id": null,
3169 "repo": null,
3170 "number": null
3171 },
3172 "created_by": "syntaqx",
3173 "pinned": true,
3174 "created_at": "2026-10-01T18:40:12.000Z",
3175 "updated_at": "2026-10-01T18:40:12.000Z",
3176 "last_used_at": null
3177 }
3178 ]
3179 },
3180 "notes": "Anyone who can read the repository gets its project memory; `workspace` is filled only for members of the workspace, and is empty for anyone else. Each memory returned is marked used, which keeps it near the front of what agents are given."
3181 },
3182 "search": {
3183 "query": {
3184 "q": "parse_query language:rust repo:acme/web",
3185 "type": "code"
3186 },
3187 "response": {
3188 "query": "parse_query repo:acme/web language:rust",
3189 "type": "code",
3190 "counts": {
3191 "repositories": 0,
3192 "code": 2,
3193 "issues": 0,
3194 "pulls": 0,
3195 "people": 0
3196 },
3197 "page": 1,
3198 "per_page": 20,
3199 "more": false,
3200 "hits": [
3201 {
3202 "kind": "code",
3203 "title": "src/search/query.rs",
3204 "url": "/acme/web/blob/main/src/search/query.rs#L42",
3205 "repo": "acme/web",
3206 "private": false,
3207 "description": null,
3208 "snippet": [],
3209 "lines": [
3210 {
3211 "number": 41,
3212 "parts": [
3213 {
3214 "text": "/// Reads a query typed into the search box.",
3215 "highlight": false
3216 }
3217 ]
3218 },
3219 {
3220 "number": 42,
3221 "parts": [
3222 {
3223 "text": "pub fn ",
3224 "highlight": false
3225 },
3226 {
3227 "text": "parse_query",
3228 "highlight": true
3229 },
3230 {
3231 "text": "(text: &str) -> Query {",
3232 "highlight": false
3233 }
3234 ]
3235 },
3236 {
3237 "number": 43,
3238 "parts": [
3239 {
3240 "text": " let mut query = Query::default();",
3241 "highlight": false
3242 }
3243 ]
3244 }
3245 ],
3246 "path": "src/search/query.rs",
3247 "language": "rust",
3248 "ref": "main",
3249 "number": null,
3250 "state": null,
3251 "author": null,
3252 "labels": [],
3253 "topics": [],
3254 "slug": null,
3255 "avatar": null,
3256 "updated_at": null
3257 }
3258 ],
3259 "notes": []
3260 },
3261 "notes": "`q` takes words, `\"exact phrases\"`, `-words` to leave out, and qualifiers: `repo:owner/name`, `org:` (or `workspace:`), `language:`, `path:` (a glob when it has `*`), `is:issue`, `is:pr`, `is:open`, `is:closed`, `is:merged`, `is:draft`, `is:public`, `is:private`, `author:` and `label:`; most can be left out with a leading `-`, as in `-label:wontfix`. `type` is `repositories`, `code`, `issues`, `pulls` or `people`; without it, `path:` means code, `is:pr` pull requests, `is:open`, `author:` or `label:` issues, and anything else repositories. `counts` says how many results each type has, up to 1,000. Each result's `snippet` (or, for code, each of its `lines`) is a list of parts, `highlight` true where the query matched. Code is searched on default branches and needs a word of three characters or more, unless the query names a `repo:`. Public content is returned to anyone, without a token; private content only to people who can read it (members of its workspace, and people given a role on the repository), checked when the search runs, so a repository made private, or a role taken away, stops appearing at once. A g1t agent's token can search too."
3262 },
3263 "search_context": {
3264 "params": {
3265 "workspace": "acme"
3266 },
3267 "query": {
3268 "q": "how do we run the web tests",
3269 "project": "web"
3270 },
3271 "response": {
3272 "query": "how do we run the web tests",
3273 "mode": "semantic",
3274 "hits": [
3275 {
3276 "kind": "memory",
3277 "id": "mem_01m4a0c2b7k3f9d1e5g8h2j6k4",
3278 "title": "Gotcha",
3279 "snippet": "The date tests fail unless TZ=UTC.",
3280 "project": "web",
3281 "url": "/acme/web/memory",
3282 "score": 0.82,
3283 "source": "AGENTS.md",
3284 "by": "g1t",
3285 "updated_at": "2026-10-04T21:10:02.000Z"
3286 },
3287 {
3288 "kind": "doc",
3289 "id": "ent_5f0c2a9e41d7b3c86a1e2f40:2",
3290 "title": "Web (README.md)",
3291 "snippet": "## Testing Run npm test. The end-to-end tests need the api running locally…",
3292 "project": "web",
3293 "url": "/acme/web/blob/main/README.md",
3294 "score": 0.77,
3295 "source": "README.md",
3296 "by": null,
3297 "updated_at": "2026-10-04T20:58:41.000Z"
3298 },
3299 {
3300 "kind": "project",
3301 "id": "ent_9b1d6f0a2c3e4b5d6e7f8a9b",
3302 "title": "web",
3303 "snippet": "The storefront. Written in TypeScript. Packages: @acme/web. Uses api. Owned by ana.",
3304 "project": "web",
3305 "url": "/acme/web",
3306 "score": 0.71,
3307 "source": "catalog",
3308 "by": null,
3309 "updated_at": "2026-10-04T20:58:41.000Z"
3310 }
3311 ]
3312 },
3313 "notes": "Give `workspace`, or `repo` as `owner/name` for its workspace. `kinds` narrows to some of `project`, `app`, `api`, `package`, `language`, `owner`, `environment`, `integration`, `doc`, `memory`, `issue` and `pull`; in a URL, comma-separated. `mode` is `text` when the search index could not answer and words were matched instead. Memory is returned only to members of the workspace and its agents; anything from a private project, only to those who can read it (members, unless the base permission is None, and people given a role on its repository). A g1t agent searches its own workspace only."
3314 },
3315 "get_entity": {
3316 "params": {
3317 "workspace": "acme",
3318 "kind": "project",
3319 "id": "web"
3320 },
3321 "response": {
3322 "entity": {
3323 "id": "ent_9b1d6f0a2c3e4b5d6e7f8a9b",
3324 "workspace": "acme",
3325 "kind": "project",
3326 "key": "web",
3327 "name": "web",
3328 "summary": "The storefront. Written in TypeScript. Packages: @acme/web. Uses api. Owned by ana.",
3329 "project": "web",
3330 "private": true,
3331 "data": {
3332 "repo": "acme/web",
3333 "root_dir": "",
3334 "default_branch": "main",
3335 "languages": [
3336 "TypeScript"
3337 ],
3338 "owners": [
3339 "ana"
3340 ],
3341 "tests": true,
3342 "test_commands": [
3343 "npm test"
3344 ],
3345 "production_url": "https://web--acme.g1t.page"
3346 },
3347 "source": "scan",
3348 "ref": "/acme/web",
3349 "updated_at": "2026-10-04T20:58:41.000Z"
3350 },
3351 "relations": [
3352 {
3353 "kind": "depends_on",
3354 "direction": "out",
3355 "entity": {
3356 "id": "ent_0a7c3e5b9d1f2a4c6e8b0d2f",
3357 "workspace": "acme",
3358 "kind": "project",
3359 "key": "api",
3360 "name": "api",
3361 "summary": "The public API. Written in Rust.",
3362 "project": "api",
3363 "private": true,
3364 "data": {},
3365 "source": "scan",
3366 "ref": "/acme/api",
3367 "updated_at": "2026-10-04T20:57:12.000Z"
3368 }
3369 },
3370 {
3371 "kind": "owned_by",
3372 "direction": "out",
3373 "entity": {
3374 "id": "ent_3c5e7a9b1d2f4a6c8e0b2d4f",
3375 "workspace": "acme",
3376 "kind": "owner",
3377 "key": "ana",
3378 "name": "ana",
3379 "summary": null,
3380 "project": null,
3381 "private": false,
3382 "data": {},
3383 "source": "scan",
3384 "ref": "/u/ana",
3385 "updated_at": "2026-10-04T20:58:41.000Z"
3386 }
3387 }
3388 ]
3389 },
3390 "notes": "`id` is the entry's id, or its key: a project's or app's slug, `npm:<name>` (or `cargo:`, `go:`, `pypi:`) for a package, a username for an owner, `<project>/production` for an environment. `data` depends on the kind: a package's version and dependencies, an API's routes, an app's production address."
3391 },
3392 "list_collaborators": {
3393 "response": {
3394 "repo": "flagon-io/hello",
3395 "base_permission": "write",
3396 "people": [
3397 {
3398 "username": "syntaqx",
3399 "name": "Chase Pierce",
3400 "avatar": null,
3401 "role": "admin",
3402 "source": "owner",
3403 "direct": null,
3404 "workspace_role": "owner"
3405 },
3406 {
3407 "username": "linus",
3408 "name": null,
3409 "avatar": null,
3410 "role": "maintain",
3411 "source": "direct",
3412 "direct": "maintain",
3413 "workspace_role": "member"
3414 },
3415 {
3416 "username": "grace",
3417 "name": "Grace Hopper",
3418 "avatar": null,
3419 "role": "write",
3420 "source": "base",
3421 "direct": null,
3422 "workspace_role": "member"
3423 },
3424 {
3425 "username": "ada",
3426 "name": "Ada Lovelace",
3427 "avatar": null,
3428 "role": "triage",
3429 "source": "direct",
3430 "direct": "triage",
3431 "workspace_role": null
3432 }
3433 ],
3434 "invitations": [
3435 {
3436 "id": "rin_01kp3c4d5e6f7g8h9j0k1m2n3p",
3437 "repo": "flagon-io/hello",
3438 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3439 "invitee": "alan",
3440 "email": null,
3441 "role": "write",
3442 "invited_by": "syntaqx",
3443 "inviter_avatar": null,
3444 "status": "pending",
3445 "created_at": "2026-10-05T17:00:00.000Z",
3446 "expires_at": "2026-10-12T17:00:00.000Z"
3447 },
3448 {
3449 "id": "rin_01kp3d7e8f9g0h1j2k3m4n5p6q",
3450 "repo": "flagon-io/hello",
3451 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3452 "invitee": null,
3453 "email": "joan@example.com",
3454 "role": "read",
3455 "invited_by": "syntaqx",
3456 "inviter_avatar": null,
3457 "status": "pending",
3458 "created_at": "2026-10-05T17:00:00.000Z",
3459 "expires_at": "2026-10-12T17:00:00.000Z"
3460 }
3461 ],
3462 "viewer_role": "admin",
3463 "can_manage": true
3464 },
3465 "notes": "Owners are listed with `source` `owner`, members with the base permission with `base`, and anyone given a role on this repository with `direct`; `role` is the highest of these, and `direct` shows a direct role even when ownership or the base permission gives more. `workspace_role` null means an outside collaborator. Anyone can read a public repository, which is not listed. `invitations` is empty unless you have the Admin role (`can_manage`). Refused with `403` below the Write role, and `404` for a private repository you cannot see. See [Access and roles](/guides/access-and-roles/)."
3466 },
3467 "add_collaborator": {
3468 "request": {
3469 "invitee": "ada",
3470 "role": "triage"
3471 },
3472 "response": {
3473 "result": "invited",
3474 "invitation": {
3475 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r",
3476 "repo": "flagon-io/hello",
3477 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3478 "invitee": "ada",
3479 "email": null,
3480 "role": "triage",
3481 "invited_by": "syntaqx",
3482 "inviter_avatar": null,
3483 "status": "pending",
3484 "created_at": "2026-10-05T17:00:00.000Z",
3485 "expires_at": "2026-10-12T17:00:00.000Z"
3486 }
3487 },
3488 "notes": "`invitee` is a username or an email address. A member of the workspace answers `{\"result\": \"granted\", \"collaborator\": {…}}` with the role already given, shown as list_collaborators shows a person. Anyone else answers `{\"result\": \"invited\", \"invitation\": {…}}`: the invitation is emailed and waits 7 days, and the role is theirs once they accept it. An email address without an account gets an invitation with `email` set and `invitee` null, and an invite that makes the account and accepts in one step. Refused with `404` when no account has that username, `409` when they already have a role of their own or a pending invitation (change it with update_collaborator), and `403` without the Admin role, from an agent's or a workspace's token, or when the person does not meet what the workspace asks of everyone with access. The `repo.collaborator_added` webhook event is sent once they have the role. See [Access and roles](/guides/access-and-roles/)."
3489 },
3490 "update_collaborator": {
3491 "params": {
3492 "owner": "flagon-io",
3493 "name": "hello",
3494 "username": "ada"
3495 },
3496 "request": {
3497 "role": "write"
3498 },
3499 "response": {
3500 "username": "ada",
3501 "name": "Ada Lovelace",
3502 "avatar": null,
3503 "role": "write",
3504 "source": "direct",
3505 "direct": "write",
3506 "workspace_role": null
3507 },
3508 "notes": "Changes a direct role, or the role of the person's pending invitation. `404` when they have neither: an owner's Admin and a member's base permission are not changed here. Changing a direct role sends the `repo.collaborator_role_changed` webhook event. See [Access and roles](/guides/access-and-roles/)."
3509 },
3510 "remove_collaborator": {
3511 "params": {
3512 "owner": "flagon-io",
3513 "name": "hello",
3514 "username": "ada"
3515 },
3516 "response": true,
3517 "notes": "Takes away a direct role. Anyone may remove their own, to leave a repository. `404` when the person has no role of their own on it. A member keeps the workspace's base permission. Sends the `repo.collaborator_removed` webhook event. See [Access and roles](/guides/access-and-roles/)."
3518 },
3519 "get_collaborator_permission": {
3520 "params": {
3521 "owner": "flagon-io",
3522 "name": "hello",
3523 "username": "ada"
3524 },
3525 "response": {
3526 "username": "ada",
3527 "role": "triage",
3528 "source": "direct",
3529 "capabilities": [
3530 "read",
3531 "participate",
3532 "triage"
3533 ]
3534 },
3535 "notes": "`capabilities` lists what the role allows, in the table's order: `read`, `participate`, `triage`, `push`, `merge`, `run`, `manage_settings`, `manage_protection`, `manage_integrations`, `manage_access`, `administer` and `delete` (which also takes an owner of the workspace). `role` and `source` are null, and `capabilities` empty, for someone with no role. Refused with `403` below the Write role, unless you ask about yourself. See [Access and roles](/guides/access-and-roles/)."
3536 },
3537 "list_repo_invitations": {
3538 "response": [
3539 {
3540 "id": "rin_01kp3c4d5e6f7g8h9j0k1m2n3p",
3541 "repo": "flagon-io/hello",
3542 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3543 "invitee": "alan",
3544 "email": null,
3545 "role": "write",
3546 "invited_by": "syntaqx",
3547 "inviter_avatar": null,
3548 "status": "pending",
3549 "created_at": "2026-10-05T17:00:00.000Z",
3550 "expires_at": "2026-10-12T17:00:00.000Z"
3551 },
3552 {
3553 "id": "rin_01kp3d7e8f9g0h1j2k3m4n5p6q",
3554 "repo": "flagon-io/hello",
3555 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3556 "invitee": null,
3557 "email": "joan@example.com",
3558 "role": "read",
3559 "invited_by": "syntaqx",
3560 "inviter_avatar": null,
3561 "status": "pending",
3562 "created_at": "2026-10-05T17:00:00.000Z",
3563 "expires_at": "2026-10-12T17:00:00.000Z"
3564 }
3565 ],
3566 "notes": "Pending invitations only, newest first. `email` is set for an invitation sent to an address that had no account. Refused with `403` without the Admin role. See [Access and roles](/guides/access-and-roles/)."
3567 },
3568 "revoke_repo_invitation": {
3569 "params": {
3570 "owner": "flagon-io",
3571 "name": "hello",
3572 "id": "rin_01kp3c4d5e6f7g8h9j0k1m2n3p"
3573 },
3574 "response": {
3575 "id": "rin_01kp3c4d5e6f7g8h9j0k1m2n3p",
3576 "repo": "flagon-io/hello",
3577 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3578 "invitee": "alan",
3579 "email": null,
3580 "role": "write",
3581 "invited_by": "syntaqx",
3582 "inviter_avatar": null,
3583 "status": "revoked",
3584 "created_at": "2026-10-05T17:00:00.000Z",
3585 "expires_at": "2026-10-12T17:00:00.000Z"
3586 },
3587 "notes": "`404` when there is no pending invitation with that id on this repository."
3588 },
3589 "list_my_repo_invitations": {
3590 "response": [
3591 {
3592 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r",
3593 "repo": "flagon-io/hello",
3594 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3595 "invitee": "ada",
3596 "email": null,
3597 "role": "triage",
3598 "invited_by": "syntaqx",
3599 "inviter_avatar": null,
3600 "status": "pending",
3601 "created_at": "2026-10-05T17:00:00.000Z",
3602 "expires_at": "2026-10-12T17:00:00.000Z"
3603 }
3604 ],
3605 "notes": "Invitations sent to your username, and to any of your confirmed addresses before you had an account, newest first. Accept one with `PATCH /user/repository_invitations/{id}`, or decline it with `DELETE`. Expired and answered ones are left out."
3606 },
3607 "accept_repo_invitation": {
3608 "params": {
3609 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r"
3610 },
3611 "response": {
3612 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r",
3613 "repo": "flagon-io/hello",
3614 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3615 "invitee": "ada",
3616 "email": null,
3617 "role": "triage",
3618 "invited_by": "syntaqx",
3619 "inviter_avatar": null,
3620 "status": "accepted",
3621 "created_at": "2026-10-05T17:00:00.000Z",
3622 "expires_at": "2026-10-12T17:00:00.000Z"
3623 },
3624 "notes": "The role is yours at once. `404` when you have no pending invitation with that id (it may have expired or been revoked), and `403` when your account does not meet what the workspace asks of everyone with access, such as two-factor authentication, with a message that says what to turn on. See [Access and roles](/guides/access-and-roles/)."
3625 },
3626 "decline_repo_invitation": {
3627 "params": {
3628 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r"
3629 },
3630 "response": {
3631 "id": "rin_01kp3e9f0g1h2j3k4m5n6p7q8r",
3632 "repo": "flagon-io/hello",
3633 "repo_id": "rep_01m3m5q6p0e2qaw6mmjahk0qrr",
3634 "invitee": "ada",
3635 "email": null,
3636 "role": "triage",
3637 "invited_by": "syntaqx",
3638 "inviter_avatar": null,
3639 "status": "declined",
3640 "created_at": "2026-10-05T17:00:00.000Z",
3641 "expires_at": "2026-10-12T17:00:00.000Z"
3642 },
3643 "notes": "`404` when you have no pending invitation with that id."
3644 },
3645 "set_base_permission": {
3646 "params": {
3647 "workspace": "flagon-io"
3648 },
3649 "request": {
3650 "base_permission": "read"
3651 },
3652 "response": {
3653 "workspace": "flagon-io",
3654 "base_permission": "read"
3655 },
3656 "notes": "`base_permission` is `none`, `read`, `write` (the default) or `admin`. Owners keep Admin, and a role given on a repository directly still counts where it is higher. Refused with `403` for anyone but an owner signed in as a person. See [Access and roles](/guides/access-and-roles/)."
3657 },
3658 "list_outside_collaborators": {
3659 "params": {
3660 "workspace": "flagon-io"
3661 },
3662 "response": [
3663 {
3664 "username": "ada",
3665 "name": "Ada Lovelace",
3666 "avatar": null,
3667 "repos": [
3668 {
3669 "repo": "flagon-io/docs",
3670 "role": "write"
3671 },
3672 {
3673 "repo": "flagon-io/hello",
3674 "role": "triage"
3675 }
3676 ]
3677 }
3678 ],
3679 "notes": "By username, each with the repositories they have a role on. Refused with `403` for anyone but an owner. See [Access and roles](/guides/access-and-roles/)."
3680 }
3681}