reseller
POST /v1/reseller/clients/{orgId}/plan
Put a client on a plan — call this before provisioning their first service.
身份验证
请将 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) | Uuid | 是 | One of your client organizations. |
org_id (query) | Uuid | 否 | Which of YOUR organizations is asking. Required only when you belong to more than one. |
请求正文
| 名称 | 类型 | 必填 | 内容简介 |
|---|---|---|---|
plan_code | string | 是 | The 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. |
interval | string | 否 | Billing interval for the wholesale line. Defaults to monthly. |
响应
| 名称 | 类型 | 必填 | 内容简介 |
|---|---|---|---|
client_org_id | Uuid | 是 | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
subscription_id | string | 否 | Pass 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_code | string | 否 | — |
plan_name | string | 否 | — |
interval | string | 否 | — |
created | boolean | 是 | True 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_minor | integer | 否 | What Zinn® charges you per period. null, never 0, when unpriced. |
wholesale_currency | string | 否 | — |
此端点可能返回的错误
401 · 403 · 404 · 409 · 422 · 429