@shipeasy/openapi 2.3.0 → 2.4.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-LYNWK55D.js → chunk-4QSU744W.js} +161 -1
  2. package/dist/chunk-4QSU744W.js.map +1 -0
  3. package/dist/{chunk-PRN4AEAM.js → chunk-ZPKHTUVV.js} +1004 -251
  4. package/dist/chunk-ZPKHTUVV.js.map +1 -0
  5. package/dist/{client-DO5HTb_L.d.ts → client-WGNXT4xl.d.ts} +5267 -2643
  6. package/dist/client.d.ts +1 -1
  7. package/dist/client.js +45 -1
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +46 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/schemas.d.ts +2933 -542
  12. package/dist/schemas.js +213 -1
  13. package/openapi.json +11646 -6855
  14. package/openapi.yaml +4939 -1675
  15. package/package.json +1 -1
  16. package/spec/components/errors.yaml +3 -0
  17. package/spec/components/schemas/alerts.yaml +138 -0
  18. package/spec/components/schemas/attributes.yaml +53 -3
  19. package/spec/components/schemas/common.yaml +10 -0
  20. package/spec/components/schemas/configs.yaml +58 -0
  21. package/spec/components/schemas/connectors.yaml +5 -1
  22. package/spec/components/schemas/errors-api.yaml +51 -4
  23. package/spec/components/schemas/experiments.yaml +347 -87
  24. package/spec/components/schemas/gates.yaml +341 -277
  25. package/spec/components/schemas/i18n.yaml +169 -40
  26. package/spec/components/schemas/killswitches.yaml +36 -0
  27. package/spec/components/schemas/metrics.yaml +183 -6
  28. package/spec/components/schemas/ops.yaml +817 -29
  29. package/spec/components/schemas/projects.yaml +129 -3
  30. package/spec/openapi.yaml +47 -0
  31. package/spec/paths/alerts.yaml +184 -0
  32. package/spec/paths/attributes.yaml +23 -5
  33. package/spec/paths/configs.yaml +70 -0
  34. package/spec/paths/errors.yaml +16 -0
  35. package/spec/paths/experiments.yaml +236 -16
  36. package/spec/paths/gates.yaml +137 -0
  37. package/spec/paths/i18n.yaml +290 -6
  38. package/spec/paths/killswitches.yaml +6 -0
  39. package/spec/paths/metrics.yaml +186 -0
  40. package/spec/paths/ops.yaml +299 -0
  41. package/spec/paths/projects.yaml +60 -0
  42. package/dist/chunk-LYNWK55D.js.map +0 -1
  43. package/dist/chunk-PRN4AEAM.js.map +0 -1
@@ -91,9 +91,9 @@ GetCurrentProjectResponse:
91
91
  defaultAllocationPct:
92
92
  type: integer
93
93
  description: Default traffic allocation (basis points) new experiments start with.
94
- defaultHoldout:
94
+ defaultHoldoutBp:
95
95
  type: integer
96
- description: Default holdout carve-out (basis points) that seeds each new universe's holdout.
96
+ description: Default holdout carve-out (basis points) that seeds each new universe's holdout (0 = none).
97
97
  defaultWinsorizePct:
98
98
  type: integer
99
99
  description: Default winsorization percentile new metrics start with.
@@ -120,6 +120,110 @@ GetCurrentProjectResponse:
120
120
  srmThreshold:
121
121
  type: number
122
122
  description: SRM chi-square p-value below which the run is called invalid.
123
+ slug:
124
+ anyOf:
125
+ - type: string
126
+ - type: "null"
127
+ description: URL-safe project identifier used in app URLs and SDK config, or `null` if unset.
128
+ logo:
129
+ anyOf:
130
+ - type: string
131
+ - type: "null"
132
+ description: Cache-busted URL of the project logo (served from the admin logo route), or `null` when no logo is set.
133
+ defaultEnv:
134
+ type: string
135
+ enum:
136
+ - dev
137
+ - staging
138
+ - prod
139
+ description: Default environment new resources are scoped to.
140
+ timezone:
141
+ type: string
142
+ description: IANA timezone the project's daily analysis runs in.
143
+ statMethod:
144
+ type: string
145
+ enum:
146
+ - sequential
147
+ - fixed
148
+ - bayesian
149
+ description: Statistical method the experiment analyzer uses.
150
+ sigThreshold:
151
+ type: string
152
+ description: Significance threshold (alpha) for experiment analysis, as a decimal string (e.g. `"0.05"`).
153
+ autoRollback:
154
+ type: boolean
155
+ description: Whether a failing guardrail auto-rolls back the experiment.
156
+ minSampleDays:
157
+ type: integer
158
+ description: Minimum number of days an experiment must run before it can be called.
159
+ moduleUser:
160
+ anyOf:
161
+ - type: boolean
162
+ - type: number
163
+ description: Whether the user-management module is enabled.
164
+ moduleEvents:
165
+ anyOf:
166
+ - type: boolean
167
+ - type: number
168
+ description: Whether the events module is enabled.
169
+ allowPublicTickets:
170
+ anyOf:
171
+ - type: boolean
172
+ - type: number
173
+ description: Whether key-authenticated public ticket creation (`POST /cli/report`) is allowed into this project. Off by default.
174
+ stripeSubscriptionId:
175
+ anyOf:
176
+ - type: string
177
+ - type: "null"
178
+ description: Stripe subscription id backing the project's billing, or `null` when unsubscribed.
179
+ scheduledInterval:
180
+ anyOf:
181
+ - type: string
182
+ enum:
183
+ - monthly
184
+ - annual
185
+ - type: "null"
186
+ description: Pending billing-interval change deferred to period end (only the annual→monthly downgrade), or `null` when no switch is pending.
187
+ spendLimitEnabled:
188
+ anyOf:
189
+ - type: boolean
190
+ - type: number
191
+ description: Whether the advisory monthly spend limit is enabled.
192
+ spendLimitUsd:
193
+ anyOf:
194
+ - type: integer
195
+ - type: "null"
196
+ description: Advisory monthly spend limit in whole USD, or `null` if unset.
197
+ spendAlertEmail:
198
+ anyOf:
199
+ - type: string
200
+ - type: "null"
201
+ description: Email address the spend alert is sent to, or `null` if unset.
202
+ defaultAssigneePendingApproval:
203
+ anyOf:
204
+ - type: string
205
+ - type: "null"
206
+ description: Default person owner (user id) auto-assigned to new `pending_approval` feedback items, or `null` when unset.
207
+ defaultAssigneeConnectorPendingApproval:
208
+ anyOf:
209
+ - type: string
210
+ - type: "null"
211
+ description: Default agent owner (connector id) auto-assigned to new `pending_approval` feedback items, or `null` when unset.
212
+ defaultAssigneeOpen:
213
+ anyOf:
214
+ - type: string
215
+ - type: "null"
216
+ description: Default person owner (user id) auto-assigned to new `open` feedback items, or `null` when unset.
217
+ defaultAssigneeConnectorOpen:
218
+ anyOf:
219
+ - type: string
220
+ - type: "null"
221
+ description: Default agent owner (connector id) auto-assigned to new `open` feedback items, or `null` when unset.
222
+ deletedAt:
223
+ anyOf:
224
+ - type: string
225
+ - type: "null"
226
+ description: ISO-8601 timestamp the project was soft-deleted (purged after a 14-day grace period), or `null` when live.
123
227
  createdAt:
124
228
  type: string
125
229
  description: ISO-8601 timestamp of project creation.
@@ -143,10 +247,32 @@ GetCurrentProjectResponse:
143
247
  - moduleGates
144
248
  - moduleExperiments
145
249
  - moduleFeedback
250
+ - moduleUser
251
+ - moduleEvents
252
+ - allowPublicTickets
253
+ - slug
254
+ - logo
255
+ - defaultEnv
256
+ - timezone
257
+ - statMethod
258
+ - sigThreshold
259
+ - autoRollback
260
+ - minSampleDays
261
+ - defaultHoldoutBp
262
+ - stripeSubscriptionId
263
+ - scheduledInterval
264
+ - spendLimitEnabled
265
+ - spendLimitUsd
266
+ - spendAlertEmail
267
+ - defaultAssigneePendingApproval
268
+ - defaultAssigneeConnectorPendingApproval
269
+ - defaultAssigneeOpen
270
+ - defaultAssigneeConnectorOpen
271
+ - deletedAt
146
272
  - createdAt
147
273
  - updatedAt
148
274
  additionalProperties: {}
149
- description: The project the caller's auth header resolves to. The shape is open — additional project fields may be present.
275
+ description: The project the caller's auth header resolves to. The shape is open — additional project fields may be present. Stripe billing internals (`stripeCustomerId`, the `stripeItemId*` family) are intentionally undocumented.
150
276
  UpsertProjectRequest:
151
277
  type: object
152
278
  properties:
package/spec/openapi.yaml CHANGED
@@ -180,6 +180,25 @@ 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: Fired Alerts
184
+ parent: Ops
185
+ description: |-
186
+ Fired alerts: the conditions the platform has actually raised — metric-rule
187
+ crossings, armed kill switches, experiment SRM/peek guards, and guardrail
188
+ breaches. Raised only by the platform (UI killswitch handlers plus the
189
+ worker analysis consumer and alerts cron), never filed by hand; deduped per
190
+ `(source, dedupeKey)` with auto-resolve when the condition clears. This
191
+ surface lists them and triages one (status flip + person/agent owner). The
192
+ *rules* that define metric-threshold alerts are the sibling alert-rules
193
+ resource.
194
+ - name: Agents
195
+ parent: Ops
196
+ description: |-
197
+ Connected AI agents — one per authenticated trigger connector (Claude /
198
+ Cursor / Copilot / Jules). The read-only roster behind agent assignment
199
+ and the `ops ack` agent types: an AI ack (`ops ack <handle> --agent
200
+ <type>`) requires the type to appear here, so this list is where an
201
+ `AGENT_NOT_CONNECTED` error sends you.
183
202
  - name: Comments
184
203
  parent: Ops
185
204
  description: |-
@@ -252,6 +271,8 @@ paths:
252
271
  $ref: ./paths/gates.yaml#/~1api~1admin~1gates~1{id}~1enable
253
272
  /api/admin/gates/{id}/disable:
254
273
  $ref: ./paths/gates.yaml#/~1api~1admin~1gates~1{id}~1disable
274
+ /api/admin/gates/{id}/activity:
275
+ $ref: ./paths/gates.yaml#/~1api~1admin~1gates~1{id}~1activity
255
276
  /api/admin/experiments:
256
277
  $ref: ./paths/experiments.yaml#/~1api~1admin~1experiments
257
278
  /api/admin/experiments/{id}:
@@ -266,6 +287,10 @@ paths:
266
287
  $ref: ./paths/experiments.yaml#/~1api~1admin~1experiments~1{id}~1timeseries
267
288
  /api/admin/experiments/{id}/reanalyze:
268
289
  $ref: ./paths/experiments.yaml#/~1api~1admin~1experiments~1{id}~1reanalyze
290
+ /api/admin/experiments/{id}/readouts:
291
+ $ref: ./paths/experiments.yaml#/~1api~1admin~1experiments~1{id}~1readouts
292
+ /api/admin/experiments/{id}/readouts/{readoutId}:
293
+ $ref: ./paths/experiments.yaml#/~1api~1admin~1experiments~1{id}~1readouts~1{readoutId}
269
294
  /api/admin/configs:
270
295
  $ref: ./paths/configs.yaml#/~1api~1admin~1configs
271
296
  /api/admin/configs/{id}:
@@ -278,6 +303,8 @@ paths:
278
303
  $ref: ./paths/configs.yaml#/~1api~1admin~1configs~1{id}~1activity
279
304
  /api/admin/configs/{id}/schema:
280
305
  $ref: ./paths/configs.yaml#/~1api~1admin~1configs~1{id}~1schema
306
+ /api/admin/configs/{id}/versions:
307
+ $ref: ./paths/configs.yaml#/~1api~1admin~1configs~1{id}~1versions
281
308
  /api/admin/killswitches:
282
309
  $ref: ./paths/killswitches.yaml#/~1api~1admin~1killswitches
283
310
  /api/admin/killswitches/{id}:
@@ -302,6 +329,12 @@ paths:
302
329
  $ref: ./paths/metrics.yaml#/~1api~1admin~1metrics
303
330
  /api/admin/metrics/{id}:
304
331
  $ref: ./paths/metrics.yaml#/~1api~1admin~1metrics~1{id}
332
+ /api/admin/metrics/{id}/experiments:
333
+ $ref: ./paths/metrics.yaml#/~1api~1admin~1metrics~1{id}~1experiments
334
+ /api/admin/metrics/{id}/unarchive:
335
+ $ref: ./paths/metrics.yaml#/~1api~1admin~1metrics~1{id}~1unarchive
336
+ /api/admin/metrics/{id}/series:
337
+ $ref: ./paths/metrics.yaml#/~1api~1admin~1metrics~1{id}~1series
305
338
  /api/admin/events:
306
339
  $ref: ./paths/events.yaml#/~1api~1admin~1events
307
340
  /api/admin/events/{id}:
@@ -314,6 +347,12 @@ paths:
314
347
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}
315
348
  /api/admin/ops/{handle}/link-pr:
316
349
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1link-pr
350
+ /api/admin/ops/{handle}/ack:
351
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1ack
352
+ /api/admin/ops/{handle}/investigation:
353
+ $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1investigation
354
+ /api/admin/agent-profiles:
355
+ $ref: ./paths/ops.yaml#/~1api~1admin~1agent-profiles
317
356
  /api/admin/ops/{handle}/comments:
318
357
  $ref: ./paths/ops.yaml#/~1api~1admin~1ops~1{handle}~1comments
319
358
  /api/admin/notifications:
@@ -324,6 +363,10 @@ paths:
324
363
  $ref: ./paths/alert-rules.yaml#/~1api~1admin~1alert-rules
325
364
  /api/admin/alert-rules/{id}:
326
365
  $ref: ./paths/alert-rules.yaml#/~1api~1admin~1alert-rules~1{id}
366
+ /api/admin/alerts:
367
+ $ref: ./paths/alerts.yaml#/~1api~1admin~1alerts
368
+ /api/admin/alerts/{id}:
369
+ $ref: ./paths/alerts.yaml#/~1api~1admin~1alerts~1{id}
327
370
  /api/admin/projects/current:
328
371
  $ref: ./paths/projects.yaml#/~1api~1admin~1projects~1current
329
372
  /api/admin/projects/upsert:
@@ -340,6 +383,10 @@ paths:
340
383
  $ref: ./paths/i18n.yaml#/~1api~1admin~1i18n~1drafts
341
384
  /api/admin/i18n/drafts/{draftId}:
342
385
  $ref: ./paths/i18n.yaml#/~1api~1admin~1i18n~1drafts~1{draftId}
386
+ /api/admin/i18n/profiles/{profileId}:
387
+ $ref: ./paths/i18n.yaml#/~1api~1admin~1i18n~1profiles~1{profileId}
388
+ /api/admin/i18n/drafts/{draftId}/keys:
389
+ $ref: ./paths/i18n.yaml#/~1api~1admin~1i18n~1drafts~1{draftId}~1keys
343
390
  /api/admin/i18n/profiles/{profileId}/publish:
344
391
  $ref: ./paths/i18n.yaml#/~1api~1admin~1i18n~1profiles~1{profileId}~1publish
345
392
  /api/admin/i18n/set:
@@ -0,0 +1,184 @@
1
+ /api/admin/alerts:
2
+ get:
3
+ operationId: listAlerts
4
+ summary: List fired alerts
5
+ description: |-
6
+ Returns the project's FIRED alerts as a **bare JSON array** (no pagination envelope), ordered by `createdAt desc`. Defaults to the currently-firing ones (`status=active`); pass a `status` to widen to resolved/dismissed history or `all`.
7
+
8
+ Fired alerts are raised only by the platform — the UI's killswitch handlers plus the worker's analysis consumer and alerts cron — never filed by hand, so this surface is list + triage (via PATCH), with no create. The rules that *define* metric-threshold alerts live at `/api/admin/alert-rules`.
9
+
10
+ **Use case:** Snapshot what is currently firing for an on-call view or the home Alerts block, or pull `status=all` to audit how a noisy rule has behaved over time.
11
+ tags:
12
+ - Fired Alerts
13
+ parameters:
14
+ - $ref: ../components/parameters.yaml#/ProjectId
15
+ - name: status
16
+ in: query
17
+ required: false
18
+ description: Filter by lifecycle state. Defaults to `active` (currently firing); `all` returns every status.
19
+ schema:
20
+ type: string
21
+ enum:
22
+ - active
23
+ - resolved
24
+ - dismissed
25
+ - all
26
+ default: active
27
+ responses:
28
+ "200":
29
+ description: List fired alerts
30
+ content:
31
+ application/json:
32
+ schema:
33
+ $ref: ../components/schemas/alerts.yaml#/ListAlertsResponse
34
+ example:
35
+ - id: al_01j7w9c4d5e6f7g8h9i0j1k2l3
36
+ source: metric_rule
37
+ ruleId: ar_01j7w8a1b2c3d4e5f6g7h8i9j0
38
+ severity: danger
39
+ dedupeKey: ar_01j7w8a1b2c3d4e5f6g7h8i9j0
40
+ title: Checkout error rate above threshold
41
+ detail: checkout_errors was 137 over the trailing 24h — above the rule's threshold of 50.
42
+ href: /dashboard/metrics/met_01j6abc2d3e4f5g6h7i8j9k0l1
43
+ observedValue: 137
44
+ status: active
45
+ createdAt: 2026-06-28T14:55:31.000Z
46
+ resolvedAt: null
47
+ dismissedAt: null
48
+ assigneeId: null
49
+ assigneeConnectorId: null
50
+ assigneeAgent: null
51
+ - id: al_01j7w9b2a1z0y9x8w7v6u5t4s3
52
+ source: killswitch_armed
53
+ ruleId: null
54
+ severity: warn
55
+ dedupeKey: ks_01j5checkout_kill
56
+ title: Kill switch "checkout_kill" is armed
57
+ detail: The kill switch has been armed for 3 days — confirm it is still intentional.
58
+ href: /dashboard/killswitches/ks_01j5checkout_kill
59
+ observedValue: null
60
+ status: active
61
+ createdAt: 2026-06-27T09:12:05.000Z
62
+ resolvedAt: null
63
+ dismissedAt: null
64
+ assigneeId: 6f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c
65
+ assigneeConnectorId: null
66
+ assigneeAgent: null
67
+ "400":
68
+ $ref: ../components/responses.yaml#/BadRequest
69
+ "401":
70
+ $ref: ../components/responses.yaml#/Unauthorized
71
+ "403":
72
+ $ref: ../components/responses.yaml#/Forbidden
73
+ "404":
74
+ $ref: ../components/responses.yaml#/NotFound
75
+ "409":
76
+ $ref: ../components/responses.yaml#/Conflict
77
+ "422":
78
+ $ref: ../components/responses.yaml#/UnprocessableEntity
79
+ x-error-codes:
80
+ - BAD_REQUEST
81
+ - UNAUTHORIZED
82
+ - FORBIDDEN
83
+ x-cli:
84
+ name: list
85
+ /api/admin/alerts/{id}:
86
+ patch:
87
+ operationId: updateAlert
88
+ summary: Update a fired alert
89
+ description: |-
90
+ Triage writes on one fired alert — the only mutations this surface allows. All body fields are optional (at least one required); only the fields present are changed.
91
+
92
+ - **`status`** — flip between `active` / `resolved` / `dismissed`. `resolved` and `dismissed` stamp `resolvedAt` / `dismissedAt`; `active` re-opens and clears both. A resolved alert re-fires (as the same row, re-activated) if its condition is raised again.
93
+ - **`assigneeId`** — the PERSON owner (a `users.id`), or `null` to unassign.
94
+ - **`agent`** — the AGENT owner: a connected trigger connector's id, or the built-in `"jarvis"` (**Enterprise plan only** — `403` otherwise), or `null` to clear. Person and agent halves are independent.
95
+
96
+ Returns the updated row; `404` if the alert does not exist in the project.
97
+
98
+ **Use cases**
99
+
100
+ - **Wave off a known condition** — `{ "status": "dismissed" }` on an alert that needs no action.
101
+ - **Hand it to someone** — `{ "assigneeId": "…" }` from the ops cockpit's Owner column.
102
+ tags:
103
+ - Fired Alerts
104
+ parameters:
105
+ - $ref: ../components/parameters.yaml#/ProjectId
106
+ - name: id
107
+ in: path
108
+ required: true
109
+ description: Stable opaque alert id (`al_…`).
110
+ schema:
111
+ $ref: ../components/schemas/common.yaml#/ResourceId
112
+ requestBody:
113
+ required: true
114
+ content:
115
+ application/json:
116
+ schema:
117
+ $ref: ../components/schemas/alerts.yaml#/UpdateAlertRequest
118
+ examples:
119
+ resolve:
120
+ summary: Mark resolved
121
+ description: Close out a fired alert once the underlying condition is handled.
122
+ value:
123
+ status: resolved
124
+ dismiss:
125
+ summary: Dismiss a benign alert
126
+ description: Wave off an alert that needs no action.
127
+ value:
128
+ status: dismissed
129
+ assignPerson:
130
+ summary: Assign a person owner
131
+ description: Hand the alert to a teammate from the ops cockpit's Owner column.
132
+ value:
133
+ assigneeId: 6f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c
134
+ assignAgent:
135
+ summary: Assign an agent owner
136
+ description: Hand the alert to a connected coding agent (a connector id, or `"jarvis"` on Enterprise).
137
+ value:
138
+ agent: con_01j7wagentclaude0001
139
+ responses:
140
+ "200":
141
+ description: Update a fired alert
142
+ content:
143
+ application/json:
144
+ schema:
145
+ $ref: ../components/schemas/alerts.yaml#/UpdateAlertResponse
146
+ example:
147
+ id: al_01j7w9c4d5e6f7g8h9i0j1k2l3
148
+ source: metric_rule
149
+ ruleId: ar_01j7w8a1b2c3d4e5f6g7h8i9j0
150
+ severity: danger
151
+ dedupeKey: ar_01j7w8a1b2c3d4e5f6g7h8i9j0
152
+ title: Checkout error rate above threshold
153
+ detail: checkout_errors was 137 over the trailing 24h — above the rule's threshold of 50.
154
+ href: /dashboard/metrics/met_01j6abc2d3e4f5g6h7i8j9k0l1
155
+ observedValue: 137
156
+ status: resolved
157
+ createdAt: 2026-06-28T14:55:31.000Z
158
+ resolvedAt: 2026-06-28T16:40:12.000Z
159
+ dismissedAt: null
160
+ assigneeId: null
161
+ assigneeConnectorId: null
162
+ assigneeAgent: null
163
+ "400":
164
+ $ref: ../components/responses.yaml#/BadRequest
165
+ "401":
166
+ $ref: ../components/responses.yaml#/Unauthorized
167
+ "403":
168
+ $ref: ../components/responses.yaml#/Forbidden
169
+ "404":
170
+ $ref: ../components/responses.yaml#/NotFound
171
+ "409":
172
+ $ref: ../components/responses.yaml#/Conflict
173
+ "422":
174
+ $ref: ../components/responses.yaml#/UnprocessableEntity
175
+ x-error-codes:
176
+ - BAD_REQUEST
177
+ - UNAUTHORIZED
178
+ - FORBIDDEN
179
+ - NOT_FOUND
180
+ - VALIDATION
181
+ x-cli:
182
+ name: update
183
+ positional:
184
+ - id
@@ -19,12 +19,30 @@
19
19
  schema:
20
20
  $ref: ../components/schemas/attributes.yaml#/ListAttributesResponse
21
21
  example:
22
- - name: plan
22
+ - id: attr_01j7w8a1b2c3
23
+ name: plan
24
+ type: enum
25
+ enumValues:
26
+ - free
27
+ - paid
28
+ required: 1
29
+ description: Billing plan of the calling user.
30
+ sdkPath: user.plan
31
+ createdAt: 2026-06-20T09:14:08.000Z
32
+ source: manual
33
+ lastSeenAt: 2026-07-16T22:04:11.000Z
34
+ deprecated: 0
35
+ - id: attr_01j7w8a1b2c4
36
+ name: country
23
37
  type: string
24
- - name: country
25
- type: string
26
- - name: seats
27
- type: number
38
+ enumValues: null
39
+ required: 0
40
+ description: null
41
+ sdkPath: null
42
+ createdAt: 2026-06-20T09:14:08.000Z
43
+ source: auto
44
+ lastSeenAt: 2026-07-16T22:04:11.000Z
45
+ deprecated: 0
28
46
  "400":
29
47
  $ref: ../components/responses.yaml#/BadRequest
30
48
  "401":
@@ -25,6 +25,9 @@
25
25
  - id: cfg_01j7wae5h6j7k8l9m0n1p2q3r4
26
26
  name: pricing.tiers
27
27
  description: Pricing tier definitions consumed by the checkout flow.
28
+ folder: pricing
29
+ creatorEmail: ana@example.com
30
+ createdAt: 2026-05-01T10:12:00.000Z
28
31
  schema:
29
32
  type: object
30
33
  properties:
@@ -226,6 +229,7 @@
226
229
  id: cfg_01j7wae5h6j7k8l9m0n1p2q3r4
227
230
  name: pricing.tiers
228
231
  description: Pricing tier definitions consumed by the checkout flow.
232
+ folder: pricing
229
233
  schema:
230
234
  type: object
231
235
  properties:
@@ -688,6 +692,72 @@
688
692
  name: activity
689
693
  positional:
690
694
  - id
695
+ /api/admin/configs/{id}/versions:
696
+ get:
697
+ operationId: listConfigVersions
698
+ summary: List config version history
699
+ description: |-
700
+ Returns every published version of the config's value on one env, newest first. The `env` query parameter picks the environment (`dev`, `staging`, or `prod`) and defaults to `prod`; an unknown env returns `400`. The config's JSON Schema is config-level and not versioned — this is value history only.
701
+
702
+ **Use case:** Render the History timeline in the config detail pane (value diff + restore), or audit which value was live on prod at a given version.
703
+ tags:
704
+ - Configs
705
+ parameters:
706
+ - $ref: ../components/parameters.yaml#/ProjectId
707
+ - name: id
708
+ in: path
709
+ required: true
710
+ description: Stable opaque config id (`cfg_…`) or the config's `name`.
711
+ schema:
712
+ $ref: ../components/schemas/common.yaml#/ResourceId
713
+ - name: env
714
+ in: query
715
+ required: false
716
+ description: Environment to list history for (`dev`, `staging`, or `prod`). Defaults to `prod` when omitted.
717
+ schema:
718
+ $ref: ../components/schemas/common.yaml#/Env
719
+ responses:
720
+ "200":
721
+ description: List config version history
722
+ content:
723
+ application/json:
724
+ schema:
725
+ $ref: ../components/schemas/configs.yaml#/ListConfigVersionsResponse
726
+ example:
727
+ - version: 5
728
+ value:
729
+ tiers:
730
+ - name: free
731
+ - name: pro
732
+ publishedAt: 2026-05-09T18:22:11.000Z
733
+ publishedBy: ana@example.com
734
+ - version: 4
735
+ value:
736
+ tiers:
737
+ - name: free
738
+ publishedAt: 2026-05-08T11:05:22.000Z
739
+ publishedBy: bo@example.com
740
+ "400":
741
+ $ref: ../components/responses.yaml#/BadRequest
742
+ "401":
743
+ $ref: ../components/responses.yaml#/Unauthorized
744
+ "403":
745
+ $ref: ../components/responses.yaml#/Forbidden
746
+ "404":
747
+ $ref: ../components/responses.yaml#/NotFound
748
+ "409":
749
+ $ref: ../components/responses.yaml#/Conflict
750
+ "422":
751
+ $ref: ../components/responses.yaml#/UnprocessableEntity
752
+ x-error-codes:
753
+ - BAD_REQUEST
754
+ - UNAUTHORIZED
755
+ - FORBIDDEN
756
+ - NOT_FOUND
757
+ x-cli:
758
+ name: versions
759
+ positional:
760
+ - id
691
761
  /api/admin/configs/{id}/schema:
692
762
  patch:
693
763
  operationId: updateConfigSchema
@@ -73,6 +73,9 @@
73
73
  lastSeenAt: 2026-06-28T14:55:31.000Z
74
74
  createdAt: 2026-06-20T08:11:02.000Z
75
75
  updatedAt: 2026-06-28T14:55:31.000Z
76
+ assigneeId: null
77
+ assigneeConnectorId: null
78
+ assigneeAgent: null
76
79
  "400":
77
80
  $ref: ../components/responses.yaml#/BadRequest
78
81
  "401":
@@ -142,8 +145,13 @@
142
145
  lastSeenAt: 2026-06-28T14:55:31.000Z
143
146
  createdAt: 2026-06-20T08:11:02.000Z
144
147
  updatedAt: 2026-06-28T14:55:31.000Z
148
+ assigneeId: 6f1d2c3b-4a5e-4f60-9b7c-8d9e0f1a2b3c
149
+ assigneeConnectorId: null
150
+ assigneeAgent: null
145
151
  occurrences:
146
152
  - id: occ_01j7w7qq0v3k9d2m5rc8t1xh4n
153
+ projectId: e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90
154
+ errorId: err_01j7w7m9q4hxbf6npe6s9zr3vc
147
155
  message: Cannot read properties of undefined (reading 'id')
148
156
  stack: |-
149
157
  TypeError: Cannot read properties of undefined (reading 'id')
@@ -156,6 +164,8 @@
156
164
  sampleRate: 100
157
165
  seenAt: 2026-06-28T14:55:31.000Z
158
166
  - id: occ_01j7w7pk8s6e3f9b0zad7y5w2q
167
+ projectId: e976b15e-2f0d-4c6e-9b1a-3a7c1f2d8e90
168
+ errorId: err_01j7w7m9q4hxbf6npe6s9zr3vc
159
169
  message: Cannot read properties of undefined (reading 'id')
160
170
  stack: |-
161
171
  TypeError: Cannot read properties of undefined (reading 'id')
@@ -257,6 +267,9 @@
257
267
  lastSeenAt: 2026-06-28T14:55:31.000Z
258
268
  createdAt: 2026-06-20T08:11:02.000Z
259
269
  updatedAt: 2026-06-28T15:02:10.000Z
270
+ assigneeId: null
271
+ assigneeConnectorId: null
272
+ assigneeAgent: null
260
273
  "400":
261
274
  $ref: ../components/responses.yaml#/BadRequest
262
275
  "401":
@@ -377,6 +390,9 @@
377
390
  lastSeenAt: 2026-06-28T14:55:31.000Z
378
391
  createdAt: 2026-06-20T08:11:02.000Z
379
392
  updatedAt: 2026-06-28T15:02:10.000Z
393
+ assigneeId: null
394
+ assigneeConnectorId: null
395
+ assigneeAgent: null
380
396
  "400":
381
397
  $ref: ../components/responses.yaml#/BadRequest
382
398
  "401":