accounts.addSeats

Buy seats on the workspace's active subscription.

Prerequisites

  • A Curviate API key, passed as apiKey when you construct the client. Quickstart shows how to create one.

Signature

addSeats(body: SeatAddBody): Promise<SeatAddResult>

Example

import { Curviate } from "@curviate/sdk";
 
const curviate = new Curviate({
  apiKey: "cvt_live_...",
  baseUrl: "https://api.curviate.com",
});
 
const { seat_ids } = await curviate.accounts.addSeats({ qty: 1 });

Parameters

NameTypeRequiredDescription
qtynumberYesBody parameter.

Returns

Resolves to SeatAddResult. Top-level fields: charged_today, currency, charged_today_eur, next_invoice_at, seat_ids, safety_warning.

Error codes

CodeWhat it means, and what to do
UNAUTHORIZEDThe API key is missing, malformed, or revoked. Check the key you passed to the client.
INVALID_REQUESTA parameter failed validation. The message names the offending field; fix the request rather than retrying it.
RATE_LIMIT_ACCOUNTThis account's own quota is exhausted. Wait for the window in the Retry-After header, then retry.
RATE_LIMIT_TENANTThe tenant-wide quota is exhausted across all accounts. Slow the whole workload, not just this call.
PLATFORM_ERRORAn upstream failure, usually transient: retry once with backoff before treating it as a real error. Check the response first, though. When it carries retry_likely_to_succeed: false and retry_hint: {kind: "never"}, retrying cannot help and backing off only delays the real answer.
ACCOUNT_DISPUTEDA payment on this workspace is disputed. Settle it with your bank or card issuer, or contact support; retrying will not help.
INSUFFICIENT_ROLEYour role in the team does not allow this action. Ask a team Owner to do it or to change your role; retrying will not help.
PAYLOAD_TOO_LARGEThree limits can trigger this. The platform's own ceiling on total request size is the lowest and the one you are most likely to hit: it starts rejecting at roughly 1 MB, so a handful of photo-sized images is refused even though it clears everything below. Above that, this API caps one attachment at 5 MiB of file content and the whole request body at 9 MiB. Attachments travel base64-encoded, which inflates them by about a third, so a 5 MiB file costs roughly 6.7 MiB of the body budget. Send fewer or smaller attachments; retrying unchanged will not help.
PAYMENT_FAILEDThe card was declined and nothing was added. Update the payment method, then retry.
PAYMENT_REQUIREDThe workspace has no active subscription, or its subscription is past due. Subscribe, or update the payment method, then retry.
STRIPE_DRIFT_DETECTEDThe seat price configured on our side does not match the price you were shown, so completing this would bill an amount you never saw. Nothing was charged. Not something you can fix by retrying: it fails identically until we correct the price, so stop and contact support.
SUBSCRIPTION_BUSYAnother change to this subscription was in progress. After a seat add, check the seat count before retrying, since the purchase may have gone through; otherwise retry in a few seconds.
SUBSCRIPTION_NOT_FOUNDNo active subscription exists for this tenant. Buy one first, then retry.
TRIAL_ACTIVE_SEAT_LIMITThe workspace is on a free trial, which cannot add or change seats. Buy a seat to convert to a paid subscription first.

Every code above is a stable CurviateError.code you can branch on. The full list, the response envelope, and retry semantics are in the Error codes reference.

Next steps

  • Quickstart: connect a LinkedIn account. An empty account list means the key works and nothing is connected yet.
  • accounts.list: List the tenant's connected LinkedIn accounts, cursor-paginated.
  • accounts.listSeats: List the workspace's live seats: each seat_id, whether an account occupied it, and that account_id (null when free).
  • SDK Quick Start: installation, the client, account scoping, and pagination.