@shipeasy/openapi 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chunk-643YSMLU.js → chunk-LYNWK55D.js} +23 -1
  2. package/dist/chunk-LYNWK55D.js.map +1 -0
  3. package/dist/{chunk-MRW3DJ57.js → chunk-PRN4AEAM.js} +250 -100
  4. package/dist/chunk-PRN4AEAM.js.map +1 -0
  5. package/dist/{client-K0ShmsC7.d.ts → client-DO5HTb_L.d.ts} +690 -143
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.js +7 -1
  8. package/dist/custom.js +4 -4
  9. package/dist/custom.js.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.js +8 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/schemas.d.ts +686 -73
  14. package/dist/schemas.js +41 -5
  15. package/openapi.json +1486 -521
  16. package/openapi.yaml +1016 -350
  17. package/package.json +1 -1
  18. package/spec/components/errors.yaml +30 -1
  19. package/spec/components/schemas/common.yaml +6 -0
  20. package/spec/components/schemas/errors-api.yaml +66 -3
  21. package/spec/components/schemas/experiment-api-row.yaml +293 -0
  22. package/spec/components/schemas/experiments.yaml +54 -299
  23. package/spec/components/schemas/gates.yaml +19 -0
  24. package/spec/components/schemas/keys.yaml +2 -1
  25. package/spec/components/schemas/metrics.yaml +17 -17
  26. package/spec/components/schemas/ops.yaml +101 -0
  27. package/spec/components/schemas/projects.yaml +119 -1
  28. package/spec/components/schemas/universes.yaml +83 -1
  29. package/spec/openapi.yaml +14 -0
  30. package/spec/paths/alert-rules.yaml +1 -0
  31. package/spec/paths/configs.yaml +1 -0
  32. package/spec/paths/errors.yaml +96 -2
  33. package/spec/paths/events.yaml +1 -0
  34. package/spec/paths/experiments.yaml +8 -0
  35. package/spec/paths/gates.yaml +1 -0
  36. package/spec/paths/keys.yaml +1 -0
  37. package/spec/paths/killswitches.yaml +1 -0
  38. package/spec/paths/metrics.yaml +1 -0
  39. package/spec/paths/ops.yaml +111 -0
  40. package/spec/paths/projects.yaml +2 -2
  41. package/spec/paths/universes.yaml +1 -0
  42. package/dist/chunk-643YSMLU.js.map +0 -1
  43. package/dist/chunk-MRW3DJ57.js.map +0 -1
@@ -245,6 +245,11 @@ OpsErrorContext:
245
245
  items:
246
246
  type: string
247
247
  description: "Distinct, id-normalized routes this error has surfaced on (UUIDs/ids collapsed to `#`)."
248
+ stackTail:
249
+ anyOf:
250
+ - type: string
251
+ - type: "null"
252
+ description: "The last 3 non-empty lines of the latest occurrence's stack — the innermost frames closest to where the throw bubbled out, baked in as an at-a-glance locator. `null` when the source supplied no stack. Fetch the full stack via `related.error`."
248
253
  sdkVersion:
249
254
  anyOf:
250
255
  - type: string
@@ -380,6 +385,11 @@ OpsAlertMetricSummary:
380
385
  OpsMeasurePlanContext:
381
386
  type: object
382
387
  properties:
388
+ goal:
389
+ anyOf:
390
+ - type: string
391
+ - type: "null"
392
+ description: "The customer's underlying intent in their own words — WHAT they want to learn or achieve and WHY, independent of the specific steps. The plan below is a best-effort proposal made without repo access; when the code reveals a better path, this goal is the target you optimize for, not literal step-adherence."
383
393
  created:
384
394
  type: array
385
395
  items:
@@ -927,6 +937,97 @@ LinkPrToOpsItemResponse:
927
937
  - id
928
938
  additionalProperties: false
929
939
  description: Response for the update / link-pr endpoints.
940
+ OpsCommentAuthorType:
941
+ type: string
942
+ enum:
943
+ - user
944
+ - system
945
+ description: >-
946
+ Who wrote a comment. `user` is a teammate (their email is in `authorEmail`);
947
+ `system` is Jarvis — the AI agent — which authors comments when an ops-notify
948
+ escalation lands on the item and when it is `@shipeasy`-mentioned in a thread.
949
+ OpsComment:
950
+ type: object
951
+ properties:
952
+ id:
953
+ type: string
954
+ description: Comment id.
955
+ feedbackId:
956
+ type: string
957
+ description: The queue item this comment hangs off.
958
+ parentId:
959
+ anyOf:
960
+ - type: string
961
+ - type: "null"
962
+ description: The top-level comment this is a reply to, or `null` for a top-level comment.
963
+ authorType:
964
+ $ref: "#/OpsCommentAuthorType"
965
+ authorEmail:
966
+ anyOf:
967
+ - type: string
968
+ - type: "null"
969
+ description: The teammate who wrote it, or `null` for a `system` (Jarvis) comment.
970
+ body:
971
+ type: string
972
+ description: Comment body as markdown (may contain sanitised inline image/video embeds).
973
+ createdAt:
974
+ type: string
975
+ description: ISO-8601 creation timestamp.
976
+ updatedAt:
977
+ type: string
978
+ description: ISO-8601 last-edit timestamp.
979
+ required:
980
+ - id
981
+ - feedbackId
982
+ - parentId
983
+ - authorType
984
+ - authorEmail
985
+ - body
986
+ - createdAt
987
+ - updatedAt
988
+ additionalProperties: false
989
+ description: A single comment on a queue item.
990
+ ListOpsCommentsResponse:
991
+ type: object
992
+ properties:
993
+ comments:
994
+ type: array
995
+ items:
996
+ $ref: "#/OpsComment"
997
+ required:
998
+ - comments
999
+ additionalProperties: false
1000
+ description: Response for `GET /api/admin/ops/{handle}/comments` — the thread, oldest first.
1001
+ CreateOpsCommentRequest:
1002
+ type: object
1003
+ properties:
1004
+ body:
1005
+ type: string
1006
+ minLength: 1
1007
+ maxLength: 10000
1008
+ description: The comment body as markdown. Mentions (`@teammate`, `@shipeasy`) are parsed from it.
1009
+ parentId:
1010
+ anyOf:
1011
+ - type: string
1012
+ - type: "null"
1013
+ description: >-
1014
+ Reply under this top-level comment. Omit / `null` for a top-level
1015
+ comment. Replying to a reply attaches to the same top-level parent
1016
+ (threading is one level deep).
1017
+ required:
1018
+ - body
1019
+ additionalProperties: false
1020
+ description: Body for `POST /api/admin/ops/{handle}/comments`.
1021
+ CreateOpsCommentResponse:
1022
+ type: object
1023
+ properties:
1024
+ id:
1025
+ type: string
1026
+ description: Newly created comment id.
1027
+ required:
1028
+ - id
1029
+ additionalProperties: false
1030
+ description: Response for `POST /api/admin/ops/{handle}/comments`.
930
1031
  NotifyOpsRequest:
931
1032
  type: object
932
1033
  properties:
@@ -19,7 +19,9 @@ GetCurrentProjectResponse:
19
19
  type: string
20
20
  enum:
21
21
  - free
22
- - paid
22
+ - pro
23
+ - business
24
+ - enterprise
23
25
  description: Billing plan tier.
24
26
  status:
25
27
  type: string
@@ -74,6 +76,50 @@ GetCurrentProjectResponse:
74
76
  - type: boolean
75
77
  - type: number
76
78
  description: Whether the feedback/ops module is enabled.
79
+ minSampleSize:
80
+ type: integer
81
+ description: Verdict power guard — minimum users per arm before a ship/hold verdict.
82
+ minRuntimeDays:
83
+ type: integer
84
+ description: Minimum days an experiment must run before a verdict (peeking guard).
85
+ defaultPower:
86
+ type: number
87
+ description: Target statistical power (1−β) feeding the realized-MDE calculation.
88
+ ciConfidence:
89
+ type: number
90
+ description: Confidence level for the interval surfaced on results.
91
+ defaultAllocationPct:
92
+ type: integer
93
+ description: Default traffic allocation (basis points) new experiments start with.
94
+ defaultHoldout:
95
+ type: integer
96
+ description: Default holdout carve-out (basis points) that seeds each new universe's holdout.
97
+ defaultWinsorizePct:
98
+ type: integer
99
+ description: Default winsorization percentile new metrics start with.
100
+ defaultMei:
101
+ anyOf:
102
+ - type: number
103
+ - type: "null"
104
+ description: Default minimum effect of interest (relative, 0–1) new metrics start with, or null.
105
+ cupedBaselineDays:
106
+ type: integer
107
+ description: CUPED baseline window — days of pre-experiment history, frozen at start.
108
+ cupedMinOverlap:
109
+ type: number
110
+ description: CUPED selection-bias guard — min share of users with a baseline, else skip.
111
+ cupedMinBaselineUsers:
112
+ type: integer
113
+ description: CUPED — minimum users with a baseline before it runs at all.
114
+ msprtTauMeiFactor:
115
+ type: number
116
+ description: mSPRT prior width — τ = minimum effect of interest × this factor.
117
+ msprtTauSdFactor:
118
+ type: number
119
+ description: mSPRT fallback prior width — τ = this × control SD when no MEI is set.
120
+ srmThreshold:
121
+ type: number
122
+ description: SRM chi-square p-value below which the run is called invalid.
77
123
  createdAt:
78
124
  type: string
79
125
  description: ISO-8601 timestamp of project creation.
@@ -218,5 +264,77 @@ UpdateProjectRequest:
218
264
  moduleEvents:
219
265
  type: boolean
220
266
  description: Enable/disable the events module.
267
+ minSampleSize:
268
+ type: integer
269
+ minimum: 2
270
+ maximum: 1000000
271
+ description: Verdict power guard — minimum users per arm before a ship/hold verdict.
272
+ minRuntimeDays:
273
+ type: integer
274
+ minimum: 0
275
+ maximum: 365
276
+ description: Minimum days an experiment must run before a verdict (peeking guard).
277
+ defaultPower:
278
+ type: number
279
+ minimum: 0.5
280
+ maximum: 0.99
281
+ description: Target statistical power (1−β) feeding the realized-MDE calculation.
282
+ ciConfidence:
283
+ type: number
284
+ minimum: 0.5
285
+ maximum: 0.999
286
+ description: Confidence level for the interval surfaced on results (any value in [0.5, 0.999], e.g. 0.90, 0.95, 0.975, 0.99).
287
+ defaultAllocationPct:
288
+ type: integer
289
+ minimum: 1
290
+ maximum: 10000
291
+ description: Default traffic allocation (basis points, 1000 = 10%) new experiments start with; overridable per experiment.
292
+ defaultHoldout:
293
+ type: integer
294
+ minimum: 0
295
+ maximum: 10000
296
+ description: Default holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
297
+ defaultWinsorizePct:
298
+ type: integer
299
+ minimum: 1
300
+ maximum: 99
301
+ description: Default winsorization percentile new metrics start with; overridable per metric.
302
+ defaultMei:
303
+ anyOf:
304
+ - type: number
305
+ minimum: 0
306
+ maximum: 1
307
+ - type: "null"
308
+ description: Default minimum effect of interest (relative, 0–1) new metrics start with; overridable per metric and per experiment. Null clears it.
309
+ cupedBaselineDays:
310
+ type: integer
311
+ minimum: 1
312
+ maximum: 365
313
+ description: CUPED baseline window — days of pre-experiment history, frozen at start.
314
+ cupedMinOverlap:
315
+ type: number
316
+ minimum: 0.01
317
+ maximum: 0.99
318
+ description: CUPED selection-bias guard — min share of users with a baseline, else skip.
319
+ cupedMinBaselineUsers:
320
+ type: integer
321
+ minimum: 10
322
+ maximum: 100000
323
+ description: CUPED — minimum users with a baseline before it runs at all.
324
+ msprtTauMeiFactor:
325
+ type: number
326
+ minimum: 0.1
327
+ maximum: 2
328
+ description: mSPRT prior width — τ = minimum effect of interest × this factor.
329
+ msprtTauSdFactor:
330
+ type: number
331
+ minimum: 0.05
332
+ maximum: 1
333
+ description: mSPRT fallback prior width — τ = this × control SD when no MEI is set.
334
+ srmThreshold:
335
+ type: number
336
+ minimum: 0.0001
337
+ maximum: 0.05
338
+ description: SRM chi-square p-value below which the run is called invalid.
221
339
  additionalProperties: false
222
340
  description: "Body for `PATCH /api/admin/projects/{id}`. Partial — every field is optional; only supplied fields change. The project id in the path must match the caller's own project."
@@ -1,3 +1,35 @@
1
+ # The universe owns the config schema for every experiment/variant in it — an
2
+ # ordered list of `{ name, type, default }`. Experiments may only override the
3
+ # per-variant value of a declared param, never add fields (universe rework).
4
+ UniverseParam:
5
+ type: object
6
+ properties:
7
+ name:
8
+ type: string
9
+ minLength: 1
10
+ maxLength: 128
11
+ pattern: ^[a-zA-Z_][a-zA-Z0-9_]*$
12
+ description: Param key, referenced by `groups[].params` on every experiment in the universe.
13
+ type:
14
+ type: string
15
+ enum:
16
+ - bool
17
+ - string
18
+ - int
19
+ - number
20
+ description: Scalar type of the param's value.
21
+ default:
22
+ description: "Universe-wide default. Returned when the assigned variant doesn't override this param (resolution: variant override → universe default)."
23
+ required:
24
+ - name
25
+ - type
26
+ - default
27
+ additionalProperties: false
28
+ UniverseParamSchema:
29
+ type: array
30
+ items:
31
+ $ref: "#/UniverseParam"
32
+ description: The universe's ordered config schema — the single source of truth for its params.
1
33
  ListUniversesResponse:
2
34
  type: object
3
35
  properties:
@@ -14,6 +46,11 @@ ListUniversesResponse:
14
46
  maxLength: 128
15
47
  pattern: ^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$
16
48
  description: Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
49
+ description:
50
+ anyOf:
51
+ - type: string
52
+ - type: "null"
53
+ description: Human-readable blurb shown in the universe picker/hovercard.
17
54
  unitType:
18
55
  type: string
19
56
  description: Unit of randomisation. Snake-case in request (`unit_type`), camelCase in response.
@@ -26,6 +63,16 @@ ListUniversesResponse:
26
63
  maxItems: 2
27
64
  - type: "null"
28
65
  description: Reserved holdout bucket range, or `null` if none.
66
+ recommendedHeadroom:
67
+ type: integer
68
+ minimum: 0
69
+ maximum: 10000
70
+ description: Basis points of headroom seeded into each new experiment's reserved tail (0 = none).
71
+ paramSchema:
72
+ anyOf:
73
+ - $ref: "#/UniverseParamSchema"
74
+ - type: "null"
75
+ description: The universe-owned config schema, or `null` on pre-rework universes not yet seeded.
29
76
  createdAt:
30
77
  type: string
31
78
  description: ISO-8601 timestamp of creation.
@@ -54,6 +101,13 @@ CreateUniverseRequest:
54
101
  description: Stable universe key. Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create.
55
102
  folder:
56
103
  $ref: ./common.yaml#/Folder
104
+ description:
105
+ default: null
106
+ anyOf:
107
+ - type: string
108
+ maxLength: 2000
109
+ - type: "null"
110
+ description: Human-readable blurb shown in the universe picker/hovercard.
57
111
  unit_type:
58
112
  default: user_id
59
113
  description: Unit of randomisation. Typically `user_id`. Use `account_id` to keep whole accounts in the same group across an experiment.
@@ -70,6 +124,18 @@ CreateUniverseRequest:
70
124
  maxItems: 2
71
125
  - type: "null"
72
126
  description: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or higher required.
127
+ recommended_headroom:
128
+ default: 0
129
+ type: integer
130
+ minimum: 0
131
+ maximum: 10000
132
+ description: Basis points of reserved headroom seeded into each new experiment created in this universe (0 = none). Lets variants be appended into a running experiment without reshuffling.
133
+ param_schema:
134
+ default: null
135
+ anyOf:
136
+ - $ref: "#/UniverseParamSchema"
137
+ - type: "null"
138
+ description: The universe-owned config schema — an ordered `{ name, type, default }[]`. Experiments may only override values per variant, never add fields. `null` starts an empty schema.
73
139
  required:
74
140
  - name
75
141
  additionalProperties: false
@@ -94,6 +160,12 @@ UpdateUniverseRequest:
94
160
  properties:
95
161
  folder:
96
162
  $ref: ./common.yaml#/Folder
163
+ description:
164
+ anyOf:
165
+ - type: string
166
+ maxLength: 2000
167
+ - type: "null"
168
+ description: Human-readable blurb shown in the universe picker/hovercard.
97
169
  holdout_range:
98
170
  anyOf:
99
171
  - type: array
@@ -105,8 +177,18 @@ UpdateUniverseRequest:
105
177
  maxItems: 2
106
178
  - type: "null"
107
179
  description: Inclusive `[lo, hi]` bucket range (0–9999) reserved as the **holdout** — callers hashed into this slice are excluded from every experiment in the universe. `null` disables the holdout. Pro plan or higher required.
180
+ recommended_headroom:
181
+ type: integer
182
+ minimum: 0
183
+ maximum: 10000
184
+ description: Basis points of reserved headroom seeded into new experiments in this universe.
185
+ param_schema:
186
+ anyOf:
187
+ - $ref: "#/UniverseParamSchema"
188
+ - type: "null"
189
+ description: Replace the universe config schema. Additive changes + default edits are always allowed; removing a param a running experiment overrides is rejected (deprecate-only).
108
190
  additionalProperties: false
109
- description: Body for `PATCH /api/admin/universes/{id}`. Only `holdout_range` is mutable — name and unit_type are immutable after create.
191
+ description: Body for `PATCH /api/admin/universes/{id}`. `name` and `unit_type` are immutable after create; `holdout_range`, `description`, `recommended_headroom` and `param_schema` are mutable.
110
192
  UpdateUniverseResponse:
111
193
  type: object
112
194
  properties:
package/spec/openapi.yaml CHANGED
@@ -180,6 +180,16 @@ tags:
180
180
  **Immutable metric.** The bound metric (and its aggregation) is fixed at create time — there is no update path for `metricId`. Tune `threshold`/`comparator`/`windowHours`/`severity`/`name`/`enabled` instead, or delete + recreate to repoint the rule at a different metric.
181
181
 
182
182
  **Delivery.** `notify` optionally targets a Slack channel and/or email for this rule; `null` falls back to the project's default notification settings. Slack targets require a connected Slack connector.
183
+ - name: Comments
184
+ parent: Ops
185
+ description: |-
186
+ Comments on a queue item — the discussion thread that hangs off any bug,
187
+ feature request, or auto-filed error/alert ticket. Append a comment or read
188
+ the thread; one level of threaded replies via `parentId`.
189
+
190
+ **Mentions.** `@teammate` in a body raises an in-app notification for that
191
+ person; `@shipeasy` asks Jarvis (the AI agent) to read the item and reply.
192
+ Comments authored by Jarvis carry `authorType: system`.
183
193
  - name: Projects
184
194
  description: |-
185
195
  Projects: the account-level container every other resource is scoped to.
@@ -304,6 +314,8 @@ paths:
304
314
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}
305
315
  /api/admin/ops/{handle}/link-pr:
306
316
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1link-pr
317
+ /api/admin/ops/{handle}/comments:
318
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1comments
307
319
  /api/admin/notifications:
308
320
  $ref: ./paths/ops.yaml#/~1api~1admin~1notifications
309
321
  /api/admin/slack/channels:
@@ -338,6 +350,8 @@ paths:
338
350
  $ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}
339
351
  /api/admin/errors/{id}/file:
340
352
  $ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1file
353
+ /api/admin/errors/{id}/resolve:
354
+ $ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1resolve
341
355
  /api/admin/errors/{id}/series:
342
356
  $ref: ./paths/errors.yaml#/~1api~1admin~1errors~1{id}~1series
343
357
  /api/admin/connectors:
@@ -128,6 +128,7 @@
128
128
  - UNAUTHORIZED
129
129
  - FORBIDDEN
130
130
  - ALREADY_EXISTS
131
+ - METRIC_NOT_FOUND
131
132
  - REFERENCED_NOT_FOUND
132
133
  - VALIDATION
133
134
  x-cli:
@@ -192,6 +192,7 @@
192
192
  - FORBIDDEN
193
193
  - ALREADY_EXISTS
194
194
  - VALIDATION
195
+ - PLAN_LIMIT
195
196
  x-cli:
196
197
  name: create
197
198
  positional:
@@ -96,9 +96,9 @@
96
96
  operationId: getError
97
97
  summary: Get a tracked error
98
98
  description: |-
99
- Returns a single tracked error by its id, including the latest occurrence's stack, extras, and consequence. Returns `404` if no such error exists in the project.
99
+ Returns a single tracked error by its id, including the latest occurrence's stack, extras, and consequence, plus `occurrences` — the sampled per-instance detail rows behind the issue (newest first; exhaustive while the issue is small, thinned at volume, capped at 100). Returns `404` if no such error exists in the project.
100
100
 
101
- **Use case:** Drill into one issue — fetch its full stack and `seenUrls` to investigate, or to render the detail panel behind a row in the errors list.
101
+ **Use case:** Drill into one issue — fetch its full stack and `seenUrls` to investigate, or walk `occurrences` to see how the failing message/stack varies across instances.
102
102
  tags:
103
103
  - Errors
104
104
  parameters:
@@ -142,6 +142,31 @@
142
142
  lastSeenAt: 2026-06-28T14:55:31.000Z
143
143
  createdAt: 2026-06-20T08:11:02.000Z
144
144
  updatedAt: 2026-06-28T14:55:31.000Z
145
+ occurrences:
146
+ - id: occ_01j7w7qq0v3k9d2m5rc8t1xh4n
147
+ message: Cannot read properties of undefined (reading 'id')
148
+ stack: |-
149
+ TypeError: Cannot read properties of undefined (reading 'id')
150
+ at GateEditor (/app/gates/[id]/page.tsx:42:18)
151
+ url: https://app.example.com/dashboard/gat_01j7/edit
152
+ env: prod
153
+ side: client
154
+ sdkVersion: 6.0.0
155
+ extrasJson: '{"gateId":"gat_01j7"}'
156
+ sampleRate: 100
157
+ seenAt: 2026-06-28T14:55:31.000Z
158
+ - id: occ_01j7w7pk8s6e3f9b0zad7y5w2q
159
+ message: Cannot read properties of undefined (reading 'id')
160
+ stack: |-
161
+ TypeError: Cannot read properties of undefined (reading 'id')
162
+ at GateEditor (/app/gates/[id]/page.tsx:42:18)
163
+ url: https://app.example.com/dashboard/gat_02c4/edit
164
+ env: prod
165
+ side: client
166
+ sdkVersion: 6.0.0
167
+ extrasJson: '{"gateId":"gat_02c4"}'
168
+ sampleRate: 10
169
+ seenAt: 2026-06-24T09:12:05.000Z
145
170
  "400":
146
171
  $ref: ../components/responses.yaml#/BadRequest
147
172
  "401":
@@ -303,6 +328,75 @@
303
328
  name: file
304
329
  positional:
305
330
  - id
331
+ /api/admin/errors/{id}/resolve:
332
+ post:
333
+ operationId: resolveError
334
+ summary: Resolve a tracked error
335
+ description: |-
336
+ Marks one tracked error `resolved` — the single-purpose "close out" action. Takes no body; it is `PATCH /api/admin/errors/{id}` pinned to `{ "status": "resolved" }`, exposed so tooling can close an error without being handed the full open/resolved/ignored status machine. A resolved error reopens automatically (ingestion-side) if it recurs, so resolving is always safe: a premature resolve un-does itself on the next occurrence. Returns the updated row; `404` if the error does not exist.
337
+
338
+ **Use case:** Close out a tracked error from an agent or script once its fix has shipped — e.g. after a deploy, resolve every open issue the change addressed and let recurrence reopen anything that wasn't actually fixed.
339
+ tags:
340
+ - Errors
341
+ parameters:
342
+ - $ref: ../components/parameters.yaml#/ProjectId
343
+ - name: id
344
+ in: path
345
+ required: true
346
+ description: Stable opaque error id (`err_…`).
347
+ schema:
348
+ $ref: ../components/schemas/common.yaml#/ResourceId
349
+ responses:
350
+ "200":
351
+ description: Resolve a tracked error
352
+ content:
353
+ application/json:
354
+ schema:
355
+ $ref: ../components/schemas/errors-api.yaml#/ErrorRecord
356
+ example:
357
+ id: err_01j7w7m9q4hxbf6npe6s9zr3vc
358
+ projectId: e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90
359
+ fingerprint: 9c1f4f1f2c0c4a5fa1c2b6d3e7c8e3a1
360
+ causedByFingerprint: null
361
+ message: Cannot read properties of undefined (reading 'id')
362
+ errorType: TypeError
363
+ stack: null
364
+ source: shipeasy
365
+ url: https://app.example.com/dashboard/gat_01j7/edit
366
+ seenUrls: null
367
+ subject: gate editor
368
+ outcome: crash on load
369
+ side: client
370
+ env: prod
371
+ kind: uncaught
372
+ lastExtrasJson: null
373
+ sdkVersion: 6.0.0
374
+ count: 137
375
+ status: resolved
376
+ firstSeenAt: 2026-06-20T08:11:02.000Z
377
+ lastSeenAt: 2026-06-28T14:55:31.000Z
378
+ createdAt: 2026-06-20T08:11:02.000Z
379
+ updatedAt: 2026-06-28T15:02:10.000Z
380
+ "400":
381
+ $ref: ../components/responses.yaml#/BadRequest
382
+ "401":
383
+ $ref: ../components/responses.yaml#/Unauthorized
384
+ "403":
385
+ $ref: ../components/responses.yaml#/Forbidden
386
+ "404":
387
+ $ref: ../components/responses.yaml#/NotFound
388
+ "409":
389
+ $ref: ../components/responses.yaml#/Conflict
390
+ "422":
391
+ $ref: ../components/responses.yaml#/UnprocessableEntity
392
+ x-error-codes:
393
+ - UNAUTHORIZED
394
+ - FORBIDDEN
395
+ - NOT_FOUND
396
+ x-cli:
397
+ name: resolve
398
+ positional:
399
+ - id
306
400
  /api/admin/errors/{id}/series:
307
401
  post:
308
402
  operationId: getErrorSeries
@@ -127,6 +127,7 @@
127
127
  - FORBIDDEN
128
128
  - ALREADY_EXISTS
129
129
  - VALIDATION
130
+ - PLAN_LIMIT
130
131
  x-cli:
131
132
  name: create
132
133
  positional:
@@ -372,6 +372,7 @@
372
372
  - GROUPS_WEIGHT_SUM
373
373
  - REFERENCED_NOT_FOUND
374
374
  - VALIDATION
375
+ - EXPERIMENT_IMMUTABLE_FIELD
375
376
  x-cli:
376
377
  name: update
377
378
  positional:
@@ -510,6 +511,12 @@
510
511
  - NOT_FOUND
511
512
  - INVALID_TRANSITION
512
513
  - VALIDATION
514
+ - PLAN_LIMIT
515
+ - EXPERIMENT_NO_GOAL_METRIC
516
+ - EXPERIMENT_ARCHIVED_RESTART
517
+ - EXPERIMENT_NOT_RUNNING
518
+ - EXPERIMENT_RUNNING_ARCHIVE
519
+ - EXPERIMENT_RESTORE_INVALID
513
520
  x-cli:
514
521
  positional:
515
522
  - id
@@ -604,6 +611,7 @@
604
611
  - EVENT_PENDING
605
612
  - REFERENCED_NOT_FOUND
606
613
  - VALIDATION
614
+ - METRIC_UNKNOWN_ID
607
615
  x-cli:
608
616
  name: set-metrics
609
617
  positional:
@@ -195,6 +195,7 @@
195
195
  - FORBIDDEN
196
196
  - ALREADY_EXISTS
197
197
  - VALIDATION
198
+ - PLAN_LIMIT
198
199
  x-cli:
199
200
  name: create
200
201
  positional:
@@ -128,6 +128,7 @@
128
128
  - UNAUTHORIZED
129
129
  - FORBIDDEN
130
130
  - VALIDATION
131
+ - PLAN_LIMIT
131
132
  x-cli:
132
133
  name: create
133
134
  /api/admin/keys/{id}/revoke:
@@ -149,6 +149,7 @@
149
149
  - FORBIDDEN
150
150
  - ALREADY_EXISTS
151
151
  - VALIDATION
152
+ - PLAN_LIMIT
152
153
  x-cli:
153
154
  name: create
154
155
  positional:
@@ -141,6 +141,7 @@
141
141
  - EVENT_PENDING
142
142
  - REFERENCED_NOT_FOUND
143
143
  - VALIDATION
144
+ - PLAN_LIMIT
144
145
  x-cli:
145
146
  name: create
146
147
  positional: