@1claw/openapi-spec 0.61.43 → 0.61.45

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 (3) hide show
  1. package/openapi.json +256 -1
  2. package/openapi.yaml +147 -1
  3. package/package.json +2 -2
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "1Claw API",
5
- "version": "0.61.43",
5
+ "version": "0.61.45",
6
6
  "description": "Secure secret management for AI agents. Provides vaults, secrets,\npolicy-based access control, agent identity, Intents API,\nsharing, billing, and audit logging. Automations (workflow_spec,\nwebhook tokens, event triggers, Assist), cloud runtimes with\ninteractive shell sessions, agent memory, and discovery.\n\n## Domains\n\n`api.1claw.co` is canonical: it is the OIDC issuer, the `aud` the API\nmints, and the first entry in `servers` — a generated client takes its\nbase URL from there, and the previous ordering pointed every SDK at the\ndomain the issuer had already left. `api.1claw.xyz` still answers and is\nstill accepted on token validation, because tokens minted before the\nmove carry it; it is never minted now.\n\nOne deliberate exception: the Shroud attestation identity token is\nrequested from GCP with `audience: https://api.1claw.xyz`, so\n`/v1/shroud/attestation` reports that as its `expected_audience`. That\nis accurate rather than stale — the audience is a verification contract\nwith anyone already checking the token, and moving it is a breaking\nchange for them, not a rename.\n\nAll endpoints require JWT Bearer authentication unless marked with\n`security: []`.\n",
7
7
  "contact": {
8
8
  "email": "ops@1claw.co"
@@ -28151,6 +28151,261 @@
28151
28151
  }
28152
28152
  }
28153
28153
  },
28154
+ "/v1/marketing/unsubscribe": {
28155
+ "get": {
28156
+ "tags": [
28157
+ "Billing"
28158
+ ],
28159
+ "summary": "Unsubscribe an address from offers and announcements",
28160
+ "description": "Public and session-less by necessity: the link lives in an email, and an unsubscribe that asks the reader to log in first is one they abandon — they mark the next message as spam instead, which costs the sending domain far more. The `t` parameter is an HMAC over the address, which is what stops a stranger unsubscribing somebody else.\n\nOffers and announcements only. Transactional mail — sign-in codes, approval requests, invitations, reports the recipient asked for — does not consult this flag and is unaffected; turning it off must never lock someone out of their account.\n\nIdempotent, and the answer is the same whether or not the address has an account. \"Stop emailing me\" is always answered \"done\", and a 404 here would tell a caller holding a valid token which addresses are registered.\n",
28161
+ "operationId": "marketing_unsubscribe",
28162
+ "security": [],
28163
+ "parameters": [
28164
+ {
28165
+ "name": "email",
28166
+ "in": "query",
28167
+ "required": true,
28168
+ "schema": {
28169
+ "type": "string",
28170
+ "format": "email"
28171
+ }
28172
+ },
28173
+ {
28174
+ "name": "t",
28175
+ "in": "query",
28176
+ "required": true,
28177
+ "schema": {
28178
+ "type": "string"
28179
+ },
28180
+ "description": "HMAC over the address, from the link."
28181
+ },
28182
+ {
28183
+ "name": "c",
28184
+ "in": "query",
28185
+ "required": false,
28186
+ "schema": {
28187
+ "type": "string"
28188
+ },
28189
+ "description": "Campaign the link came from. Recorded, not trusted."
28190
+ }
28191
+ ],
28192
+ "responses": {
28193
+ "200": {
28194
+ "description": "Unsubscribed (or already was)",
28195
+ "content": {
28196
+ "application/json": {
28197
+ "schema": {
28198
+ "type": "object",
28199
+ "required": [
28200
+ "unsubscribed",
28201
+ "email",
28202
+ "message"
28203
+ ],
28204
+ "properties": {
28205
+ "unsubscribed": {
28206
+ "type": "boolean"
28207
+ },
28208
+ "email": {
28209
+ "type": "string"
28210
+ },
28211
+ "message": {
28212
+ "type": "string"
28213
+ }
28214
+ }
28215
+ }
28216
+ }
28217
+ }
28218
+ },
28219
+ "400": {
28220
+ "description": "The link's signature did not verify"
28221
+ }
28222
+ }
28223
+ },
28224
+ "post": {
28225
+ "tags": [
28226
+ "Billing"
28227
+ ],
28228
+ "summary": "Unsubscribe (one-click)",
28229
+ "description": "Identical to the GET. Present because `List-Unsubscribe-Post: List-Unsubscribe=One-Click` makes Gmail and Yahoo POST here without ever opening the page, and both require that header on bulk mail — an endpoint that only answered GET would look like a working unsubscribe to a person and a broken one to the providers scoring the domain.\n",
28230
+ "operationId": "marketing_unsubscribe_post",
28231
+ "security": [],
28232
+ "parameters": [
28233
+ {
28234
+ "name": "email",
28235
+ "in": "query",
28236
+ "required": true,
28237
+ "schema": {
28238
+ "type": "string",
28239
+ "format": "email"
28240
+ }
28241
+ },
28242
+ {
28243
+ "name": "t",
28244
+ "in": "query",
28245
+ "required": true,
28246
+ "schema": {
28247
+ "type": "string"
28248
+ },
28249
+ "description": "HMAC over the address, from the link."
28250
+ },
28251
+ {
28252
+ "name": "c",
28253
+ "in": "query",
28254
+ "required": false,
28255
+ "schema": {
28256
+ "type": "string"
28257
+ },
28258
+ "description": "Campaign the link came from. Recorded, not trusted."
28259
+ }
28260
+ ],
28261
+ "responses": {
28262
+ "200": {
28263
+ "description": "Unsubscribed (or already was)",
28264
+ "content": {
28265
+ "application/json": {
28266
+ "schema": {
28267
+ "type": "object",
28268
+ "required": [
28269
+ "unsubscribed",
28270
+ "email",
28271
+ "message"
28272
+ ],
28273
+ "properties": {
28274
+ "unsubscribed": {
28275
+ "type": "boolean"
28276
+ },
28277
+ "email": {
28278
+ "type": "string"
28279
+ },
28280
+ "message": {
28281
+ "type": "string"
28282
+ }
28283
+ }
28284
+ }
28285
+ }
28286
+ }
28287
+ },
28288
+ "400": {
28289
+ "description": "The link's signature did not verify"
28290
+ }
28291
+ }
28292
+ }
28293
+ },
28294
+ "/v1/billing/promo/preview": {
28295
+ "get": {
28296
+ "tags": [
28297
+ "Billing"
28298
+ ],
28299
+ "summary": "What a promotion code does to a plan",
28300
+ "description": "Public, and deliberately so: a promo advertised on social media is read by people who have no account yet, and the price they were promised has to be on the pricing page before they make one. It resolves a Stripe promotion code and one configured plan price; no tenant data is reachable through it.\n\nDistinct from `/v1/billing/promo/validate`, which answers for the `promo_codes` grants an authenticated org can redeem in place. This one describes a checkout discount, which needs a card and therefore has to go through `POST /v1/billing/subscribe` with `promo_code`.\n",
28301
+ "operationId": "preview_promo",
28302
+ "security": [],
28303
+ "parameters": [
28304
+ {
28305
+ "name": "code",
28306
+ "in": "query",
28307
+ "required": true,
28308
+ "schema": {
28309
+ "type": "string",
28310
+ "maxLength": 64
28311
+ },
28312
+ "description": "The promotion code, as advertised."
28313
+ },
28314
+ {
28315
+ "name": "tier",
28316
+ "in": "query",
28317
+ "required": false,
28318
+ "schema": {
28319
+ "type": "string",
28320
+ "enum": [
28321
+ "pro",
28322
+ "team",
28323
+ "business"
28324
+ ],
28325
+ "default": "pro"
28326
+ }
28327
+ },
28328
+ {
28329
+ "name": "interval",
28330
+ "in": "query",
28331
+ "required": false,
28332
+ "schema": {
28333
+ "type": "string",
28334
+ "enum": [
28335
+ "monthly",
28336
+ "annual"
28337
+ ],
28338
+ "default": "monthly"
28339
+ }
28340
+ }
28341
+ ],
28342
+ "responses": {
28343
+ "200": {
28344
+ "description": "The offer, or why the code cannot be used. A code that does not apply answers 200 with `valid: false` and a message, not an error status — \"this code is not for annual billing\" is an answer, not a failure.\n",
28345
+ "content": {
28346
+ "application/json": {
28347
+ "schema": {
28348
+ "type": "object",
28349
+ "required": [
28350
+ "valid",
28351
+ "tier",
28352
+ "interval"
28353
+ ],
28354
+ "properties": {
28355
+ "valid": {
28356
+ "type": "boolean"
28357
+ },
28358
+ "code": {
28359
+ "type": "string",
28360
+ "nullable": true,
28361
+ "description": "The code as Stripe stores it, not the caller's casing."
28362
+ },
28363
+ "headline": {
28364
+ "type": "string",
28365
+ "nullable": true,
28366
+ "description": "The offer in one sentence, derived from the coupon — e.g. \"$5/mo for your first 6 months, then $29/mo\". Rendered rather than composed by the client, so a page cannot advertise terms different from the ones charged.\n"
28367
+ },
28368
+ "tier": {
28369
+ "type": "string"
28370
+ },
28371
+ "interval": {
28372
+ "type": "string"
28373
+ },
28374
+ "list_cents": {
28375
+ "type": "integer",
28376
+ "nullable": true
28377
+ },
28378
+ "first_cents": {
28379
+ "type": "integer",
28380
+ "nullable": true,
28381
+ "description": "What the first invoice comes to, after the discount."
28382
+ },
28383
+ "duration_months": {
28384
+ "type": "integer",
28385
+ "nullable": true,
28386
+ "description": "How many invoices the discount covers."
28387
+ },
28388
+ "expires_at": {
28389
+ "type": "string",
28390
+ "format": "date-time",
28391
+ "nullable": true,
28392
+ "description": "Last moment the code can be redeemed. Someone who subscribes before this keeps the discount for its full length.\n"
28393
+ },
28394
+ "message": {
28395
+ "type": "string",
28396
+ "nullable": true
28397
+ }
28398
+ }
28399
+ }
28400
+ }
28401
+ }
28402
+ },
28403
+ "400": {
28404
+ "description": "Unknown tier or interval"
28405
+ }
28406
+ }
28407
+ }
28408
+ },
28154
28409
  "/v1/billing/promo/validate": {
28155
28410
  "get": {
28156
28411
  "tags": [
package/openapi.yaml CHANGED
@@ -2,7 +2,7 @@ openapi: 3.1.0
2
2
 
3
3
  info:
4
4
  title: 1Claw API
5
- version: "0.61.43"
5
+ version: "0.61.45"
6
6
  description: |
7
7
  Secure secret management for AI agents. Provides vaults, secrets,
8
8
  policy-based access control, agent identity, Intents API,
@@ -18000,6 +18000,152 @@ paths:
18000
18000
  description: Forbidden, or the plan does not include this
18001
18001
  '404':
18002
18002
  description: Not found
18003
+ /v1/marketing/unsubscribe:
18004
+ get: &marketing_unsubscribe
18005
+ tags: [Billing]
18006
+ summary: "Unsubscribe an address from offers and announcements"
18007
+ description: >
18008
+ Public and session-less by necessity: the link lives in an
18009
+ email, and an unsubscribe that asks the reader to log in
18010
+ first is one they abandon — they mark the next message as
18011
+ spam instead, which costs the sending domain far more.
18012
+ The `t` parameter is an HMAC over the address, which is what
18013
+ stops a stranger unsubscribing somebody else.
18014
+
18015
+
18016
+ Offers and announcements only. Transactional mail — sign-in
18017
+ codes, approval requests, invitations, reports the recipient
18018
+ asked for — does not consult this flag and is unaffected;
18019
+ turning it off must never lock someone out of their account.
18020
+
18021
+
18022
+ Idempotent, and the answer is the same whether or not the
18023
+ address has an account. "Stop emailing me" is always
18024
+ answered "done", and a 404 here would tell a caller holding
18025
+ a valid token which addresses are registered.
18026
+ operationId: marketing_unsubscribe
18027
+ security: []
18028
+ parameters:
18029
+ - name: email
18030
+ in: query
18031
+ required: true
18032
+ schema: { type: string, format: email }
18033
+ - name: t
18034
+ in: query
18035
+ required: true
18036
+ schema: { type: string }
18037
+ description: HMAC over the address, from the link.
18038
+ - name: c
18039
+ in: query
18040
+ required: false
18041
+ schema: { type: string }
18042
+ description: Campaign the link came from. Recorded, not trusted.
18043
+ responses:
18044
+ '200':
18045
+ description: Unsubscribed (or already was)
18046
+ content:
18047
+ application/json:
18048
+ schema:
18049
+ type: object
18050
+ required: [unsubscribed, email, message]
18051
+ properties:
18052
+ unsubscribed: { type: boolean }
18053
+ email: { type: string }
18054
+ message: { type: string }
18055
+ '400':
18056
+ description: The link's signature did not verify
18057
+ post:
18058
+ <<: *marketing_unsubscribe
18059
+ summary: "Unsubscribe (one-click)"
18060
+ description: >
18061
+ Identical to the GET. Present because
18062
+ `List-Unsubscribe-Post: List-Unsubscribe=One-Click` makes
18063
+ Gmail and Yahoo POST here without ever opening the page, and
18064
+ both require that header on bulk mail — an endpoint that only
18065
+ answered GET would look like a working unsubscribe to a
18066
+ person and a broken one to the providers scoring the domain.
18067
+ operationId: marketing_unsubscribe_post
18068
+ /v1/billing/promo/preview:
18069
+ get:
18070
+ tags: [Billing]
18071
+ summary: "What a promotion code does to a plan"
18072
+ description: >
18073
+ Public, and deliberately so: a promo advertised on social media
18074
+ is read by people who have no account yet, and the price they
18075
+ were promised has to be on the pricing page before they make
18076
+ one. It resolves a Stripe promotion code and one configured
18077
+ plan price; no tenant data is reachable through it.
18078
+
18079
+
18080
+ Distinct from `/v1/billing/promo/validate`, which answers for
18081
+ the `promo_codes` grants an authenticated org can redeem in
18082
+ place. This one describes a checkout discount, which needs a
18083
+ card and therefore has to go through
18084
+ `POST /v1/billing/subscribe` with `promo_code`.
18085
+ operationId: preview_promo
18086
+ security: []
18087
+ parameters:
18088
+ - name: code
18089
+ in: query
18090
+ required: true
18091
+ schema: { type: string, maxLength: 64 }
18092
+ description: The promotion code, as advertised.
18093
+ - name: tier
18094
+ in: query
18095
+ required: false
18096
+ schema: { type: string, enum: [pro, team, business], default: pro }
18097
+ - name: interval
18098
+ in: query
18099
+ required: false
18100
+ schema: { type: string, enum: [monthly, annual], default: monthly }
18101
+ responses:
18102
+ '200':
18103
+ description: >
18104
+ The offer, or why the code cannot be used. A code that
18105
+ does not apply answers 200 with `valid: false` and a
18106
+ message, not an error status — "this code is not for
18107
+ annual billing" is an answer, not a failure.
18108
+ content:
18109
+ application/json:
18110
+ schema:
18111
+ type: object
18112
+ required: [valid, tier, interval]
18113
+ properties:
18114
+ valid: { type: boolean }
18115
+ code:
18116
+ type: string
18117
+ nullable: true
18118
+ description: The code as Stripe stores it, not the caller's casing.
18119
+ headline:
18120
+ type: string
18121
+ nullable: true
18122
+ description: >
18123
+ The offer in one sentence, derived from the coupon —
18124
+ e.g. "$5/mo for your first 6 months, then $29/mo".
18125
+ Rendered rather than composed by the client, so a page
18126
+ cannot advertise terms different from the ones charged.
18127
+ tier: { type: string }
18128
+ interval: { type: string }
18129
+ list_cents: { type: integer, nullable: true }
18130
+ first_cents:
18131
+ type: integer
18132
+ nullable: true
18133
+ description: What the first invoice comes to, after the discount.
18134
+ duration_months:
18135
+ type: integer
18136
+ nullable: true
18137
+ description: How many invoices the discount covers.
18138
+ expires_at:
18139
+ type: string
18140
+ format: date-time
18141
+ nullable: true
18142
+ description: >
18143
+ Last moment the code can be redeemed. Someone who
18144
+ subscribes before this keeps the discount for its
18145
+ full length.
18146
+ message: { type: string, nullable: true }
18147
+ '400':
18148
+ description: Unknown tier or interval
18003
18149
  /v1/billing/promo/validate:
18004
18150
  get:
18005
18151
  tags: [Billing]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@1claw/openapi-spec",
3
- "version": "0.61.43",
4
- "description": "OpenAPI 3.1.0 specification for the 1Claw Vault API \u2014 generate clients in any language",
3
+ "version": "0.61.45",
4
+ "description": "OpenAPI 3.1.0 specification for the 1Claw Vault API — generate clients in any language",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",