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

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