reseller

POST /v1/reseller/clients/{orgId}/plan

Put a client on a plan — call this before provisioning their first service.

所有 reseller 端点

身份验证

请将 API 密钥作为 bearer 令牌发送。该密钥必须具有 reseller.provision 权限;缺少该权限的密钥将被拒绝并返回 403 状态码,而非 404。

您的组织 ID 应填在此处

此端点直接在 URL 中接受您的组织 ID,即 orgId。请将其替换到路径中——没有其他标头或查询参数可以替代此操作。

您的组织ID位于控制面板的API密钥屏幕上,就在密钥本身的旁边。这是您在每次调用时使用的相同ID。

免费试用

将尖括号中的内容替换为您自己的值,并将键占位符替换为您仪表板中的一个键。

curl -X POST https://api.zinndigital.com/v1/reseller/clients/{orgId}/plan \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "plan_code": <string> }'

已登录?您仪表板中的 API 控制台会自动填入您真实的组织 ID 和您自己的密钥,并针对实时 API 运行请求,以便您查看实际的响应。 在 API 控制台中打开此端点

详细信息

Grants the client organization the plan your product sells, and returns the `subscription_id` to pass to `createSite`. Requires `reseller.provision`. ⛔⛔ **A provisioning module MUST call this before `createSite`, and omitting it is a silent, total loss of the invoice.** A newly created organization has no subscription, and `createSite` has no plan field — so a site provisioned without one lands with no plan at all. Your wholesale statement is built from your clients' live subscriptions, so there is no line for that service and Zinn® bills you nothing while the hosting runs; the client inherits no entitlements, so no quota is applied to their box; and `changeResellerServicePackage` has nothing to change, so an upgrade you sell cannot be performed. Nothing anywhere reports this — the site provisions and serves perfectly. **Your client is never invoiced by Zinn®.** The subscription is granted comped: it exists to carry entitlements and to put a line on *your* wholesale statement, and our renewal billing skips it. You bill your client; we bill you. **A second service for the same client.** On the **same** plan this is a no-op and returns `200` with `created: false` — the plan's own site allowance covers the extra site, so nothing further is granted and a retried provision cannot disturb the subscription it is re-establishing. On a **different** plan it is refused `422`, because replacing the live plan would leave one of the two services unbilled. Either sell both on the same plan, or set the client up as a separate client record. To move a client to a different plan, use `changeResellerServicePackage` on the service. `422` for an unknown plan code and for a plan that is not for sale. `409` when the client's existing usage does not fit the plan being granted, with the real numbers.

参数

名称类型必填内容简介
orgId (path)UuidOne of your client organizations.
org_id (query)UuidWhich of YOUR organizations is asking. Required only when you belong to more than one.

请求正文

名称类型必填内容简介
plan_codestringThe plan to put this client on, by code — the value your product's module settings carry. The newest active version of it is always what is granted.
intervalstringBilling interval for the wholesale line. Defaults to `monthly`.

响应

名称类型必填内容简介
client_org_idUuidUUIDv7 identifier — sortable by creation time (docs/02 §8).
subscription_idstringPass this as `subscription_id` on `createSite`. Null when the client is on no plan — provisioning a site in that state is what leaves it unbilled.
plan_codestring
plan_namestring
intervalstring
createdbooleanTrue when this call granted the plan, false when the client was already on it. A retried provision needs the difference without inferring it from a timestamp.
wholesale_amount_minorintegerWhat Zinn® charges you per period. `null`, never `0`, when unpriced.
wholesale_currencystring

此端点可能返回的错误

401 · 403 · 404 · 409 · 422 · 429