@greatwait/contracts 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (190) hide show
  1. package/README.md +1 -1
  2. package/dist/authority.d.ts +4 -1
  3. package/dist/authority.js +1 -0
  4. package/dist/billing.d.ts +231 -1
  5. package/dist/billing.js +150 -1
  6. package/dist/callback-safety.js +13 -3
  7. package/dist/configuration-bounds.d.ts +13 -0
  8. package/dist/configuration-bounds.js +13 -0
  9. package/dist/data-export.d.ts +2 -0
  10. package/dist/delivery.d.ts +26 -0
  11. package/dist/delivery.js +2 -0
  12. package/dist/effective-limits.d.ts +40 -0
  13. package/dist/effective-limits.js +42 -0
  14. package/dist/endpoints.d.ts +173 -5
  15. package/dist/endpoints.js +77 -6
  16. package/dist/first-value-journey.d.ts +1 -1
  17. package/dist/first-value-journey.js +11 -7
  18. package/dist/forecast.d.ts +111 -21
  19. package/dist/forecast.js +87 -24
  20. package/dist/http-request.d.ts +193 -0
  21. package/dist/http-request.js +305 -0
  22. package/dist/identity.d.ts +4 -4
  23. package/dist/index.d.ts +9 -6
  24. package/dist/index.js +8 -5
  25. package/dist/mcp.d.ts +2 -1
  26. package/dist/mcp.js +1 -1
  27. package/dist/members.d.ts +141 -0
  28. package/dist/members.js +223 -0
  29. package/dist/oauth.d.ts +7 -0
  30. package/dist/operation-definitions.d.ts +20 -4
  31. package/dist/operation-definitions.js +9 -1
  32. package/dist/operational-config.d.ts +101 -0
  33. package/dist/operational-config.js +341 -0
  34. package/dist/operations.d.ts +1299 -52
  35. package/dist/operations.js +466 -32
  36. package/dist/organization-lifecycle.d.ts +10 -0
  37. package/dist/partition.d.ts +17 -9
  38. package/dist/partition.js +3 -3
  39. package/dist/policy.js +5 -2
  40. package/dist/problems.d.ts +25 -2
  41. package/dist/problems.js +49 -1
  42. package/dist/protocol.d.ts +5 -5
  43. package/dist/protocol.js +2 -1
  44. package/dist/scheduling-records.d.ts +226 -0
  45. package/dist/scheduling-records.js +5 -0
  46. package/dist/scheduling.d.ts +273 -1
  47. package/dist/scheduling.js +91 -4
  48. package/dist/secrets.d.ts +7 -0
  49. package/dist/tenancy.d.ts +1 -1
  50. package/dist/tenancy.js +1 -1
  51. package/dist/usage.js +6 -21
  52. package/dist/zod-values.d.ts +2 -2
  53. package/dist/zod-values.js +1 -1
  54. package/generated/v1/examples/attempts.list.response.json +2 -0
  55. package/generated/v1/examples/attempts.read.response.json +2 -0
  56. package/generated/v1/examples/billing.fundingconfirm.response.json +120 -0
  57. package/generated/v1/examples/billing.invoicehistory.response.json +6 -0
  58. package/generated/v1/examples/billing.invoices.response.json +15 -0
  59. package/generated/v1/examples/billing.paymenthistory.response.json +6 -0
  60. package/generated/v1/examples/billing.paymentmethod.response.json +16 -0
  61. package/generated/v1/examples/billing.paymentmethodconfirm.request.json +3 -0
  62. package/generated/v1/examples/billing.paymentmethodconfirm.response.json +16 -0
  63. package/generated/v1/examples/billing.paymentmethodremove.request.json +3 -0
  64. package/generated/v1/examples/billing.paymentmethodremove.response.json +4 -0
  65. package/generated/v1/examples/billing.paymentmethodsetup.request.json +1 -0
  66. package/generated/v1/examples/billing.paymentmethodsetup.response.json +3 -0
  67. package/generated/v1/examples/endpoints.ensure.request.json +3 -0
  68. package/generated/v1/examples/endpoints.ensure.response.json +20 -0
  69. package/generated/v1/examples/invitations.create.request.json +5 -0
  70. package/generated/v1/examples/invitations.create.response.json +7 -0
  71. package/generated/v1/examples/invitations.list.response.json +11 -0
  72. package/generated/v1/examples/invitations.resend.request.json +1 -0
  73. package/generated/v1/examples/invitations.resend.response.json +4 -0
  74. package/generated/v1/examples/invitations.revoke.request.json +3 -0
  75. package/generated/v1/examples/invitations.revoke.response.json +4 -0
  76. package/generated/v1/examples/limits.read.response.json +16 -0
  77. package/generated/v1/examples/members.list.response.json +13 -0
  78. package/generated/v1/examples/members.remove.request.json +3 -0
  79. package/generated/v1/examples/members.remove.response.json +4 -0
  80. package/generated/v1/examples/members.role.request.json +3 -0
  81. package/generated/v1/examples/members.role.response.json +4 -0
  82. package/generated/v1/examples/occurrences.redeliver.response.json +2 -0
  83. package/generated/v1/examples/projectmembers.add.request.json +1 -0
  84. package/generated/v1/examples/projectmembers.add.response.json +4 -0
  85. package/generated/v1/examples/projectmembers.remove.request.json +3 -0
  86. package/generated/v1/examples/projectmembers.remove.response.json +4 -0
  87. package/generated/v1/first-value-journey.json +24 -8
  88. package/generated/v1/manifest.json +627 -10
  89. package/generated/v1/openapi.json +29081 -15663
  90. package/generated/v1/policy-matrix.json +137 -2
  91. package/generated/v1/schemas/attempts.list.response.json +15 -0
  92. package/generated/v1/schemas/attempts.read.response.json +15 -0
  93. package/generated/v1/schemas/billing.fundingconfirm.response.json +552 -0
  94. package/generated/v1/schemas/billing.invoicehistory.query.json +16 -0
  95. package/generated/v1/schemas/billing.invoicehistory.response.json +88 -0
  96. package/generated/v1/schemas/billing.invoices.response.json +51 -0
  97. package/generated/v1/schemas/billing.ledger.response.json +5 -0
  98. package/generated/v1/schemas/billing.notificationsettingsupdate.request.json +24 -17
  99. package/generated/v1/schemas/billing.paymenthistory.query.json +16 -0
  100. package/generated/v1/schemas/billing.paymenthistory.response.json +182 -0
  101. package/generated/v1/schemas/billing.paymentmethod.response.json +137 -0
  102. package/generated/v1/schemas/billing.paymentmethodconfirm.request.json +14 -0
  103. package/generated/v1/schemas/billing.paymentmethodconfirm.response.json +137 -0
  104. package/generated/v1/schemas/billing.paymentmethodremove.request.json +12 -0
  105. package/generated/v1/schemas/billing.paymentmethodremove.response.json +137 -0
  106. package/generated/v1/schemas/billing.paymentmethodsetup.request.json +12 -0
  107. package/generated/v1/schemas/billing.paymentmethodsetup.response.json +11 -0
  108. package/generated/v1/schemas/billing.purchase.request.json +4 -0
  109. package/generated/v1/schemas/context.read.response.json +1 -0
  110. package/generated/v1/schemas/credentials.connection.response.json +1 -0
  111. package/generated/v1/schemas/credentials.create.request.json +1 -0
  112. package/generated/v1/schemas/credentials.create.response.json +1 -0
  113. package/generated/v1/schemas/credentials.list.response.json +1 -0
  114. package/generated/v1/schemas/credentials.revoke.response.json +1 -0
  115. package/generated/v1/schemas/credentials.rotate.response.json +2 -0
  116. package/generated/v1/schemas/endpoints.acknowledgeSigningKeyRotation.response.json +59 -0
  117. package/generated/v1/schemas/endpoints.create.request.json +74 -0
  118. package/generated/v1/schemas/endpoints.create.response.json +59 -0
  119. package/generated/v1/schemas/endpoints.disable.response.json +59 -0
  120. package/generated/v1/schemas/endpoints.enable.response.json +59 -0
  121. package/generated/v1/schemas/endpoints.ensure.request.json +91 -0
  122. package/generated/v1/schemas/endpoints.ensure.response.json +169 -0
  123. package/generated/v1/schemas/endpoints.list.response.json +59 -0
  124. package/generated/v1/schemas/endpoints.read.response.json +59 -0
  125. package/generated/v1/schemas/endpoints.rotateSigningKey.response.json +59 -0
  126. package/generated/v1/schemas/endpoints.update.request.json +74 -0
  127. package/generated/v1/schemas/endpoints.update.response.json +59 -0
  128. package/generated/v1/schemas/forecast.read.request-headers.json +10 -0
  129. package/generated/v1/schemas/forecast.read.response.json +148 -0
  130. package/generated/v1/schemas/grants.list.response.json +1 -0
  131. package/generated/v1/schemas/grants.revoke.response.json +1 -0
  132. package/generated/v1/schemas/invitations.create.request-headers.json +13 -0
  133. package/generated/v1/schemas/invitations.create.request.json +24 -0
  134. package/generated/v1/schemas/invitations.create.response.json +31 -0
  135. package/generated/v1/schemas/invitations.list.response.json +40 -0
  136. package/generated/v1/schemas/invitations.resend.request-headers.json +13 -0
  137. package/generated/v1/schemas/invitations.resend.request.json +6 -0
  138. package/generated/v1/schemas/invitations.resend.response.json +27 -0
  139. package/generated/v1/schemas/invitations.revoke.request-headers.json +13 -0
  140. package/generated/v1/schemas/invitations.revoke.request.json +12 -0
  141. package/generated/v1/schemas/invitations.revoke.response.json +27 -0
  142. package/generated/v1/schemas/limits.read.response.json +79 -0
  143. package/generated/v1/schemas/members.list.response.json +53 -0
  144. package/generated/v1/schemas/members.remove.request-headers.json +13 -0
  145. package/generated/v1/schemas/members.remove.request.json +12 -0
  146. package/generated/v1/schemas/members.remove.response.json +27 -0
  147. package/generated/v1/schemas/members.role.request-headers.json +13 -0
  148. package/generated/v1/schemas/members.role.request.json +12 -0
  149. package/generated/v1/schemas/members.role.response.json +27 -0
  150. package/generated/v1/schemas/occurrences.redeliver.response.json +15 -0
  151. package/generated/v1/schemas/projectmembers.add.request-headers.json +13 -0
  152. package/generated/v1/schemas/projectmembers.add.request.json +6 -0
  153. package/generated/v1/schemas/projectmembers.add.response.json +27 -0
  154. package/generated/v1/schemas/projectmembers.remove.request-headers.json +13 -0
  155. package/generated/v1/schemas/projectmembers.remove.request.json +12 -0
  156. package/generated/v1/schemas/projectmembers.remove.response.json +27 -0
  157. package/generated/v1/schemas/schedules.archive.response.json +138 -1
  158. package/generated/v1/schemas/schedules.cancel.response.json +138 -1
  159. package/generated/v1/schemas/schedules.create.request.json +150 -1
  160. package/generated/v1/schemas/schedules.create.response.json +156 -1
  161. package/generated/v1/schemas/schedules.list.response.json +138 -1
  162. package/generated/v1/schemas/schedules.pause.response.json +138 -1
  163. package/generated/v1/schemas/schedules.read.response.json +138 -1
  164. package/generated/v1/schemas/schedules.replace.request.json +150 -1
  165. package/generated/v1/schemas/schedules.replace.response.json +156 -1
  166. package/generated/v1/schemas/schedules.resume.response.json +138 -1
  167. package/generated/v1/snippets/billing.fundingconfirm.json +6 -0
  168. package/generated/v1/snippets/billing.invoicehistory.json +6 -0
  169. package/generated/v1/snippets/billing.invoices.json +6 -0
  170. package/generated/v1/snippets/billing.notificationsettingsupdate.json +1 -1
  171. package/generated/v1/snippets/billing.paymenthistory.json +6 -0
  172. package/generated/v1/snippets/billing.paymentmethod.json +6 -0
  173. package/generated/v1/snippets/billing.paymentmethodconfirm.json +6 -0
  174. package/generated/v1/snippets/billing.paymentmethodremove.json +6 -0
  175. package/generated/v1/snippets/billing.paymentmethodsetup.json +6 -0
  176. package/generated/v1/snippets/endpoints.create.json +1 -1
  177. package/generated/v1/snippets/endpoints.ensure.json +6 -0
  178. package/generated/v1/snippets/forecast.windows.json +1 -1
  179. package/generated/v1/snippets/invitations.create.json +6 -0
  180. package/generated/v1/snippets/invitations.list.json +6 -0
  181. package/generated/v1/snippets/invitations.resend.json +6 -0
  182. package/generated/v1/snippets/invitations.revoke.json +6 -0
  183. package/generated/v1/snippets/journey/create-destination.json +1 -1
  184. package/generated/v1/snippets/limits.read.json +6 -0
  185. package/generated/v1/snippets/members.list.json +6 -0
  186. package/generated/v1/snippets/members.remove.json +6 -0
  187. package/generated/v1/snippets/members.role.json +6 -0
  188. package/generated/v1/snippets/projectmembers.add.json +6 -0
  189. package/generated/v1/snippets/projectmembers.remove.json +6 -0
  190. package/package.json +7 -2
package/dist/usage.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from "./zod.js";
2
+ import { MAX_USAGE_WINDOW_DAYS } from "./configuration-bounds.js";
2
3
  import { timestampSchema } from "./time.js";
3
4
  /**
4
5
  * A legacy operational aggregate of terminal occurrences.
@@ -67,7 +68,7 @@ export const USAGE_BOUNDS = {
67
68
  * never older than that. It is a contract ceiling rather than a plan one: a
68
69
  * plan may bring it closer and may never push it out.
69
70
  */
70
- maxWindowDays: 366,
71
+ maxWindowDays: MAX_USAGE_WINDOW_DAYS,
71
72
  };
72
73
  /** How a terminal occurrence ended. The four retained terminal states. */
73
74
  export const BILLABLE_TERMINAL_STATES = [
@@ -202,26 +203,10 @@ export const usageSchema = z
202
203
  */
203
204
  freshness: z.object({ kind: z.literal("authoritative") }),
204
205
  /**
205
- * How much of this deployment's daily attempt allowance has been spent.
206
- *
207
- * **Because nothing else could say it, and something had to.** The runtime
208
- * refuses admission once an organization has made
209
- * `dailyAttemptCeiling` attempts in a UTC day, and defers every schedule to
210
- * the next day boundary rather than failing them. Nothing lost, nothing
211
- * failed — and nothing running either, for up to a day, on a product whose
212
- * whole job is to run things. The operator found his own account in that
213
- * state during the W4-10 walk and no screen anywhere named it: the runs
214
- * read "Delivering", the dashboard had no action waiting, and the only
215
- * visible trace was an unremarkable number on the billing panel.
216
- *
217
- * The disposition, the ceiling and the count all lived inside
218
- * `DialerWorker` and `EntitlementPolicy`; neither ever left
219
- * `packages/application`, and `days` above counts settled *occurrences*
220
- * rather than attempts, so it could not be derived either.
221
- *
222
- * Absent when this deployment sets no ceiling, which is the honest shape
223
- * for "there is no allowance to be near the end of" — a surface must not
224
- * render a limit nobody has.
206
+ * Legacy daily-allowance projection, retained for installed clients and
207
+ * mixed-version responses. W0-15 retires the daily quota; current authority
208
+ * readers omit this optional object rather than querying an obsolete count.
209
+ * Older servers can still explain parked work to compatible dashboards.
225
210
  */
226
211
  plan: z
227
212
  .object({
@@ -1,3 +1,3 @@
1
1
  /** The exact Zod constructors used by delivery-runtime contract modules. */
2
- export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
3
- export type { RefinementCtx, ZodType, ZodTypeAny, infer } from "zod";
2
+ export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, never, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
3
+ export type { RefinementCtx, ZodType, ZodTypeAny, infer, input } from "zod";
@@ -1,2 +1,2 @@
1
1
  /** The exact Zod constructors used by delivery-runtime contract modules. */
2
- export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
2
+ export { ZodError, ZodIssueCode, array, boolean, discriminatedUnion, enum, int, json, literal, number, never, object, partialRecord, record, strictObject, string, toJSONSchema, tuple, union, unknown, url, } from "zod";
@@ -5,12 +5,14 @@
5
5
  "classifiedAt": "2026-07-28T15:00:00.071Z",
6
6
  "delivery": "dlv_01h8xyz9k2m4n6p8r0t2v4w6y8",
7
7
  "diagnostic": "http_retryable",
8
+ "dispatchRecoveries": 0,
8
9
  "durationMs": 71,
9
10
  "firstAttemptLatenessMs": 0,
10
11
  "firstAttemptStartedAt": "2026-07-28T15:00:00.000Z",
11
12
  "timingEligibility": "eligible",
12
13
  "timingPolicyVersion": "payg-v1",
13
14
  "id": "att_01h8xyz9k2m4n6p8r0t2v4w6y8",
15
+ "localReceiptRecoveries": 0,
14
16
  "occurrence": "occ_01h8xyz9k2m4n6p8r0t2v4w6y8",
15
17
  "remediation": "review_retry_policy",
16
18
  "responseStatus": 503,
@@ -4,12 +4,14 @@
4
4
  "classifiedAt": "2026-07-28T15:02:00.000Z",
5
5
  "delivery": "dlv_11h8xyz9k2m4n6p8r0t2v4w6y8",
6
6
  "diagnostic": "network_ambiguous",
7
+ "dispatchRecoveries": 2,
7
8
  "durationMs": 10000,
8
9
  "firstAttemptLatenessMs": 0,
9
10
  "firstAttemptStartedAt": "2026-07-28T15:00:00.000Z",
10
11
  "timingEligibility": "eligible",
11
12
  "timingPolicyVersion": "payg-v1",
12
13
  "id": "att_11h8xyz9k2m4n6p8r0t2v4w6y8",
14
+ "localReceiptRecoveries": 1,
13
15
  "occurrence": "occ_01h8xyz9k2m4n6p8r0t2v4w6y8",
14
16
  "remediation": "review_before_redelivery",
15
17
  "startedAt": "2026-07-28T15:01:50.000Z",
@@ -0,0 +1,120 @@
1
+ {
2
+ "automaticExecutionTopUp": {
3
+ "ceiling": {
4
+ "currency": "USD",
5
+ "microdollars": "50000000",
6
+ "scale": 6
7
+ },
8
+ "currentPeriod": {
9
+ "end": "2026-10-01T00:00:00.000Z",
10
+ "pending": {
11
+ "currency": "USD",
12
+ "microdollars": "10830000",
13
+ "scale": 6
14
+ },
15
+ "remaining": {
16
+ "currency": "USD",
17
+ "microdollars": "29170000",
18
+ "scale": 6
19
+ },
20
+ "settled": {
21
+ "currency": "USD",
22
+ "microdollars": "10000000",
23
+ "scale": 6
24
+ },
25
+ "start": "2026-09-01T00:00:00.000Z"
26
+ },
27
+ "rule": {
28
+ "cooldownUntil": null,
29
+ "desired": {
30
+ "ceiling": {
31
+ "currency": "USD",
32
+ "microdollars": "50000000",
33
+ "scale": 6
34
+ },
35
+ "credit": {
36
+ "currency": "USD",
37
+ "microdollars": "10000000",
38
+ "scale": 6
39
+ },
40
+ "triggerBelow": {
41
+ "currency": "USD",
42
+ "microdollars": "2000000",
43
+ "scale": 6
44
+ }
45
+ },
46
+ "effective": {
47
+ "ceiling": {
48
+ "currency": "USD",
49
+ "microdollars": "50000000",
50
+ "scale": 6
51
+ },
52
+ "credit": {
53
+ "currency": "USD",
54
+ "microdollars": "10000000",
55
+ "scale": 6
56
+ },
57
+ "triggerBelow": {
58
+ "currency": "USD",
59
+ "microdollars": "2000000",
60
+ "scale": 6
61
+ }
62
+ },
63
+ "state": "ready",
64
+ "suspension": null
65
+ },
66
+ "revision": 3
67
+ },
68
+ "credit": {
69
+ "amountOwed": {
70
+ "currency": "USD",
71
+ "microdollars": "0",
72
+ "scale": 6
73
+ },
74
+ "available": {
75
+ "currency": "USD",
76
+ "microdollars": "9000000",
77
+ "scale": 6
78
+ },
79
+ "reserved": {
80
+ "currency": "USD",
81
+ "microdollars": "10",
82
+ "scale": 6
83
+ }
84
+ },
85
+ "freshness": {
86
+ "kind": "authoritative"
87
+ },
88
+ "paymentOperations": [
89
+ {
90
+ "createdAt": "2026-09-10T12:00:00.000Z",
91
+ "credit": {
92
+ "currency": "USD",
93
+ "microdollars": "10000000",
94
+ "scale": 6
95
+ },
96
+ "gross": {
97
+ "currency": "USD",
98
+ "microdollars": "10830000",
99
+ "scale": 6
100
+ },
101
+ "id": "funding-operation-example",
102
+ "kind": "automatic",
103
+ "paymentUrl": "https://pay.stripe.com/receipts/acct_example/example",
104
+ "reason": "payment-required",
105
+ "state": "pending",
106
+ "tax": {
107
+ "currency": "USD",
108
+ "microdollars": "830000",
109
+ "scale": 6
110
+ },
111
+ "taxStatus": "confirmed",
112
+ "updatedAt": "2026-09-10T12:00:01.000Z"
113
+ }
114
+ ],
115
+ "subscribedProjectFees": {
116
+ "currency": "USD",
117
+ "microdollars": "5000000",
118
+ "scale": 6
119
+ }
120
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "data": [],
3
+ "freshness": {
4
+ "kind": "authoritative"
5
+ }
6
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "id": "in_example_project_charge",
5
+ "createdAt": "2026-09-01T12:00:00.000Z",
6
+ "amount": {
7
+ "currency": "USD",
8
+ "microdollars": "5000000",
9
+ "scale": 6
10
+ },
11
+ "state": "paid",
12
+ "receiptUrl": "https://invoice.stripe.com/i/acct_example/example"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "data": [],
3
+ "freshness": {
4
+ "kind": "authoritative"
5
+ }
6
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "card": {
3
+ "brand": "visa",
4
+ "last4": "4242",
5
+ "expMonth": 12,
6
+ "expYear": 2030
7
+ },
8
+ "method": {
9
+ "brand": "visa",
10
+ "last4": "4242",
11
+ "expMonth": 12,
12
+ "expYear": 2030,
13
+ "type": "card",
14
+ "label": "Visa ending in 4242"
15
+ }
16
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "checkoutSession": "cs_example_card_setup"
3
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "card": {
3
+ "brand": "visa",
4
+ "last4": "4242",
5
+ "expMonth": 12,
6
+ "expYear": 2030
7
+ },
8
+ "method": {
9
+ "brand": "visa",
10
+ "last4": "4242",
11
+ "expMonth": 12,
12
+ "expYear": 2030,
13
+ "type": "card",
14
+ "label": "Visa ending in 4242"
15
+ }
16
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "confirmed": true
3
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "card": null,
3
+ "method": null
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "url": "https://checkout.stripe.com/c/pay/example-card-setup"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "url": "https://hooks.example.com/greatwait"
3
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "createdAt": "2026-08-05T15:00:00.000Z",
3
+ "environmentKind": "test",
4
+ "id": "ep_01h8xyz9k2m4n6p8r0t2v4w6y8",
5
+ "name": "https://hooks.example.com/greatwait",
6
+ "project": "proj_01h8xyz9k2m4n6p8r0t2v4w6y8",
7
+ "signingKeys": {
8
+ "current": "csk_01h8xyz9k2m4n6p8r0t2v4w6y8"
9
+ },
10
+ "status": "active",
11
+ "updatedAt": "2026-08-05T15:00:00.000Z",
12
+ "url": "https://hooks.example.com/greatwait",
13
+ "version": 1,
14
+ "created": true,
15
+ "signingSecret": {
16
+ "guidance": "GreatWait signs every callback to this endpoint. The signing secret is never returned here; a signed-in member of the project reveals it on the endpoint's page in the GreatWait dashboard, and your receiver uses it to verify that a callback came from GreatWait.",
17
+ "returned": false,
18
+ "revealUrl": "https://app.greatwait.dev/o/org_2example0organization0id/p/proj_01h8xyz9k2m4n6p8r0t2v4w6y8/test/settings/endpoints/ep_01h8xyz9k2m4n6p8r0t2v4w6y8"
19
+ }
20
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "email": "teammate@example.com",
3
+ "role": "member",
4
+ "projects": ["proj_01h8xyz9k2m4n6p8r0t2v4w6y8"]
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "inv_0123456789abcdef0123456789",
3
+ "email": "teammate@example.com",
4
+ "role": "member",
5
+ "projects": ["proj_01h8xyz9k2m4n6p8r0t2v4w6y8"],
6
+ "status": "pending"
7
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "id": "inv_0123456789abcdef0123456789",
5
+ "email": "teammate@example.com",
6
+ "role": "member",
7
+ "projects": ["proj_01h8xyz9k2m4n6p8r0t2v4w6y8"],
8
+ "status": "pending"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "inv_0123456789abcdef0123456789"
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "confirmed": true
3
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "inv_0123456789abcdef0123456789"
4
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "limits": {
3
+ "inlinePayloadBytes": 65536,
4
+ "forecastHorizonSeconds": 90000,
5
+ "usageWindowDays": 366
6
+ },
7
+ "provenance": {
8
+ "inlinePayloadBytes": "default",
9
+ "forecastHorizonSeconds": "default",
10
+ "usageWindowDays": "default"
11
+ },
12
+ "revision": {
13
+ "global": 0,
14
+ "organization": 0
15
+ }
16
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "id": "mem_0123456789abcdef0123456789",
5
+ "email": "teammate@example.com",
6
+ "name": "Teammate",
7
+ "role": "member",
8
+ "projects": ["proj_01h8xyz9k2m4n6p8r0t2v4w6y8"],
9
+ "allProjects": false,
10
+ "self": false
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "confirmed": true
3
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "mem_0123456789abcdef0123456789"
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "role": "member"
3
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "mem_0123456789abcdef0123456789"
4
+ }
@@ -2,7 +2,9 @@
2
2
  "attempt": {
3
3
  "attemptNumber": 3,
4
4
  "delivery": "dlv_21h8xyz9k2m4n6p8r0t2v4w6y8",
5
+ "dispatchRecoveries": 0,
5
6
  "id": "att_21h8xyz9k2m4n6p8r0t2v4w6y8",
7
+ "localReceiptRecoveries": 0,
6
8
  "occurrence": "occ_01h8xyz9k2m4n6p8r0t2v4w6y8",
7
9
  "startedAt": "2026-07-28T15:05:00.000Z",
8
10
  "trigger": {
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "mem_0123456789abcdef0123456789"
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "confirmed": true
3
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "completed": true,
3
+ "id": "mem_0123456789abcdef0123456789"
4
+ }
@@ -2,20 +2,20 @@
2
2
  "contractVersion": "2026-08-22",
3
3
  "prerequisites": [
4
4
  {
5
- "action": "Accept your Greatwait invitation, sign in, and create a project in the dashboard.",
5
+ "action": "Accept your GreatWait invitation, sign in, and create a project in the dashboard.",
6
6
  "because": "projects.create accepts only a signed-in member, so a project is created by a person rather than by an API credential.",
7
7
  "id": "project",
8
8
  "title": "A project"
9
9
  },
10
10
  {
11
- "action": "In that project, create an API credential and copy the secret it shows once.",
11
+ "action": "In that project, create an API credential with endpoints:write, occurrences:read, schedules:read and schedules:write, and copy the secret it shows once. The key picker starts with nothing selected and refuses an empty one, so those four are the boxes to tick.",
12
12
  "because": "credentials.create accepts only a signed-in member: a credential that could mint another credential would make revoking one meaningless.",
13
13
  "id": "credential",
14
14
  "title": "An API credential"
15
15
  },
16
16
  {
17
17
  "action": "Have an HTTPS URL of your own that answers POST with a 2xx status, and can be reached from the public internet.",
18
- "because": "Greatwait delivers your callback to an address you control. It does not offer a shared receiver to try, and it will not send your payload to a third-party inspection service on your behalf.",
18
+ "because": "GreatWait delivers your callback to an address you control. It does not offer a shared receiver to try, and it will not send your payload to a third-party inspection service on your behalf.",
19
19
  "id": "receiver",
20
20
  "title": "An HTTPS receiver you control"
21
21
  }
@@ -28,7 +28,7 @@
28
28
  "observe": "The service name and the environment you meant to work in. If the environment is not the one you expect, stop and fix GREATWAIT_API_URL before creating anything.",
29
29
  "operationId": "meta.version",
30
30
  "path": "/__greatwait/version",
31
- "purpose": "Confirms the origin you are pointed at is a Greatwait API and says which environment it serves. It needs no credential, so it separates 'wrong URL' from 'wrong key'.",
31
+ "purpose": "Confirms the origin you are pointed at is a GreatWait API and says which environment it serves. It needs no credential, so it separates 'wrong URL' from 'wrong key'.",
32
32
  "recovery": [
33
33
  {
34
34
  "nextMove": "Something answered, but not this service. Check GREATWAIT_API_URL — a 404 here comes from a proxy in front of the API rather than from the API, so it carries no problem document to read.",
@@ -39,7 +39,11 @@
39
39
  "when": "no-response"
40
40
  }
41
41
  ],
42
- "problems": ["rate_limited", "service_unavailable"],
42
+ "problems": [
43
+ "capability_not_configured",
44
+ "rate_limited",
45
+ "service_unavailable"
46
+ ],
43
47
  "scopes": [],
44
48
  "successStatus": 200,
45
49
  "title": "Check which service and environment you reached",
@@ -76,6 +80,7 @@
76
80
  ],
77
81
  "problems": [
78
82
  "authentication_required",
83
+ "capability_not_configured",
79
84
  "credential_expired",
80
85
  "credential_revoked",
81
86
  "invalid_request",
@@ -106,7 +111,7 @@
106
111
  ],
107
112
  "key": "create-destination",
108
113
  "method": "POST",
109
- "observe": "An endpoint identifier, and a signing secret returned by this call and by no other. Store the secret now: reading the endpoint back later will not show it again.",
114
+ "observe": "An endpoint identifier, and a signing secret. Store it now: this is the only call that returns it, and reading the endpoint back shows a redacted prefix instead. It is not gone if you lose it — a signed-in member can read it again on the endpoint's own page in the dashboard, which is the one caller `endpoints.revealSigningSecret` accepts.",
110
115
  "operationId": "endpoints.create",
111
116
  "path": "/v1/endpoints",
112
117
  "purpose": "Registers the address every occurrence of this schedule is delivered to, and mints the per-endpoint signing key your receiver verifies callbacks with.",
@@ -118,6 +123,10 @@
118
123
  {
119
124
  "nextMove": "This project is at its destination ceiling. Disable a destination you no longer deliver to; disabled ones still count, because they stay readable for audit.",
120
125
  "when": "plan_limit_reached"
126
+ },
127
+ {
128
+ "nextMove": "An active destination already delivers to this address in this project — usually one a previous run of this journey created. Reuse that destination, disable it first, or give the new one a name of its own.",
129
+ "when": "state_conflict"
121
130
  }
122
131
  ],
123
132
  "request": {
@@ -125,6 +134,7 @@
125
134
  },
126
135
  "problems": [
127
136
  "authentication_required",
137
+ "capability_not_configured",
128
138
  "credential_expired",
129
139
  "credential_revoked",
130
140
  "invalid_request",
@@ -179,7 +189,7 @@
179
189
  "when": "invalid_request"
180
190
  },
181
191
  {
182
- "nextMove": "This organization is at a plan ceiling — live schedules, distinct partition keys, or payload size. Nothing was created; reduce the payload or archive a schedule and retry.",
192
+ "nextMove": "This organization is at a plan ceiling — the payload is larger than its plan carries, or the schedule names a new partition key when the organization's keys are full. Nothing was created; send a smaller payload or reuse a partition key that is already live, and retry.",
183
193
  "when": "plan_limit_reached"
184
194
  },
185
195
  {
@@ -199,6 +209,7 @@
199
209
  },
200
210
  "problems": [
201
211
  "authentication_required",
212
+ "capability_not_configured",
202
213
  "credential_expired",
203
214
  "credential_revoked",
204
215
  "idempotency_key_reused",
@@ -255,6 +266,7 @@
255
266
  },
256
267
  "problems": [
257
268
  "authentication_required",
269
+ "capability_not_configured",
258
270
  "credential_expired",
259
271
  "credential_revoked",
260
272
  "idempotency_key_reused",
@@ -288,6 +300,7 @@
288
300
  ],
289
301
  "problems": [
290
302
  "authentication_required",
303
+ "capability_not_configured",
291
304
  "credential_expired",
292
305
  "credential_revoked",
293
306
  "invalid_request",
@@ -323,6 +336,7 @@
323
336
  ],
324
337
  "problems": [
325
338
  "authentication_required",
339
+ "capability_not_configured",
326
340
  "credential_expired",
327
341
  "credential_revoked",
328
342
  "invalid_request",
@@ -351,12 +365,13 @@
351
365
  "when": "attempt-failed"
352
366
  },
353
367
  {
354
- "nextMove": "Nothing reached your receiver. Confirm the URL answers a POST from the public internet, and that it is not behind an allowlist Greatwait is not on.",
368
+ "nextMove": "Nothing reached your receiver. Confirm the URL answers a POST from the public internet, and that it is not behind an allowlist GreatWait is not on.",
355
369
  "when": "receiver-unreachable"
356
370
  }
357
371
  ],
358
372
  "problems": [
359
373
  "authentication_required",
374
+ "capability_not_configured",
360
375
  "credential_expired",
361
376
  "credential_revoked",
362
377
  "invalid_request",
@@ -387,6 +402,7 @@
387
402
  ],
388
403
  "problems": [
389
404
  "authentication_required",
405
+ "capability_not_configured",
390
406
  "credential_expired",
391
407
  "credential_revoked",
392
408
  "invalid_request",