reseller
POST /v1/reseller/clients/{orgId}/plan
Put a client on a plan — call this before provisioning their first service.
인증
Bearer 토큰으로 API 키를 전송하세요. 키는 반드시 reseller.provision 권한을 가지고 있어야 하며, 권한이 없는 키는 404가 아닌 403으로 거부됩니다.
조직 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