Skip to content

Update a product's Stripe object โ€‹

PATCH /v1/admin/plans/products/{id}/stripe

  • Operation ID: updatePlanStripeProduct
  • Tags: Plans and pricing
  • Base URL: http://localhost:8787

Updates name, description, images, metadata or active flag on the linked Stripe product. Creates or changes the object in Stripe first (source of truth), then audits the change. Audited as plans.product.stripe_update.

Workflow: Integration guide.

Authentication: staff Bearer JWT with permission plans.write.

Authentication โ€‹

  • Auth: staff Bearer JWT (Authorization: Bearer <access_token>) with the permissions below.
  • Required permissions: plans.write

Parameters โ€‹

NameInTypeRequiredDescription
idpathstring<uuid>yes-

Request body โ€‹

Required: yes.

Content type: application/json

Schema: object

FieldTypeRequiredDescription
namestringnoMin length: 1. Max length: 200
descriptionstringnoMax length: 1000
imagesstring<uri>[]noMax items: 8
metadataobjectno-
activebooleanno-

Responses โ€‹

200 โ€‹

Stripe product updated.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object

FieldTypeRequiredDescription
idstring<uuid>yes-
stripeProductIdstringyes-
activebooleanyes-

Errors โ€‹

400 โ€‹

Request validation failed. validation_failed: the product is not linked to a Stripe product.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ValidationErrorBody) | object (ErrorBody)

FieldTypeRequiredDescription
(variant 1).successbooleanyesOne of: false
(variant 1).errorobjectyes-
(variant 1).error.namestringyesOne of: "ZodError"
(variant 1).error.issuesobject[]yes-
(variant 1).error.issues[].codestringyes-
(variant 1).error.issues[].path(string | number)[]yes-
(variant 1).error.issues[].messagestringyes-
(variant 2).errorstringyesStable machine-readable error code, e.g. forbidden, not_found.
(variant 2).detailsanynoOptional structured context. For 403 it is { perm }.

Request validation

json
{
  "success": false,
  "error": {
    "name": "ZodError",
    "issues": [
      {
        "code": "custom",
        "path": [
          "field"
        ],
        "message": "Invalid value"
      }
    ]
  }
}

Application error

json
{
  "error": "validation_failed"
}

401 โ€‹

Missing, malformed, expired or wrong-audience Bearer token (missing_token, invalid_token, invalid_audience).

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody)

FieldTypeRequiredDescription
errorstringyesStable machine-readable error code, e.g. forbidden, not_found.
detailsanynoOptional structured context. For 403 it is { perm }.

Error response

json
{
  "error": "missing_token"
}

403 โ€‹

Authenticated but lacking the required permission. details.perm lists the accepted permission keys.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody), fields as described above.

Error response

json
{
  "error": "forbidden",
  "details": {
    "perm": "plans.write"
  }
}

404 โ€‹

product: no product with this id.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody), fields as described above.

Error response

json
{
  "error": "product"
}

500 โ€‹

Unexpected server error (internal). No details are returned.

  • Header x-request-id: Request identifier; quote it when reporting an error. Content type: application/json

Schema: object (ErrorBody), fields as described above.

Error response

json
{
  "error": "internal"
}

Examples โ€‹

curl โ€‹

bash
curl -X PATCH 'http://localhost:8787/v1/admin/plans/products/3f6c2a1e-8b4d-4e7a-9c1f-2d5b6a7e8f90/stripe' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"name":"example","description":"example","images":["https://example.com/resource"],"metadata":{},"active":false}'

TypeScript โ€‹

ts
const accessToken = process.env.ACCESS_TOKEN; // user JWT from your sign-in flow

const response = await fetch("http://localhost:8787/v1/admin/plans/products/3f6c2a1e-8b4d-4e7a-9c1f-2d5b6a7e8f90/stripe", {
  method: "PATCH",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "name": "example",
    "description": "example",
    "images": [
      "https://example.com/resource"
    ],
    "metadata": {},
    "active": false
  }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
const data = response.status === 204 || response.status === 205
  ? undefined
  : response.headers.get("content-type")?.includes("json")
    ? await response.json()
    : await response.text();

Try this endpoint

Requests go directly from your browser to the API. Send request executes this endpoint against the selected server.

PATCH/v1/admin/plans/products/{id}/stripe

Your token stays in this tab's memory and is sent only when you press Send request.

Parameters
Request body (required)

Built for developers. Ready for agents.