Skip to content

Quote a license order into the MSP pool

MSP only. Step 1 of 2 (D28): creates a pool opportunity with its priced quote in Salesforce (partner pricebook) and answers 200 with the lines, prices, license term dates, the terms version/URL and the quote expiry. Nothing is ordered or billed until acceptPoolOrder; an unaccepted quote expires after 24 h. Idempotent on requestId (an identical replay returns the same quote). Errors: 400 SELF_PROVISIONING_DISABLED, SKU_NOT_ALLOWED, QUANTITY_INVALID, AUTO_RENEW_REQUIRED, PROVISION_CAP_EXCEEDED (detail = remainingToday; caps are only pre-checked here), APEX_VALIDATION / SKU_NOT_IN_PRICEBOOK (detail = the Salesforce message); 403 NOT_VERIFIED_MSP; 409 PROVISION_REPLAY_MISMATCH (same requestId, different SKU, quantity or auto-renew); 429 QUOTE_RATE_LIMITED (quotes per organization per minute); 503 SALESFORCE_UNAVAILABLE (nothing created; retry with the SAME requestId). Prices appear only here and on getPool orders. No claim code ever appears in any response.

POST/api/partner/license/quotePoolOrder

Authorizations

x-auth-apikeystringheaderrequired

Your Rhombus API key. Must be accompanied by the x-auth-scheme header set to api-token (or partner-api-token for partner endpoints).

Authorizationstringheader

Instead of an API key, an OAuth access token: Bearer <token>, with the write scope.

OAuth explains tokens and scopes.

Headers

x-auth-schemeenum<string>headerdefault: partner-api-token

Authentication scheme identifier. Use api-token or partner-api-token with the x-auth-apikey header, api or partner-api with x-auth-apikey plus a client certificate, api-oauth-token or partner-api-oauth-token with x-auth-access-token, and federated-token with x-auth-ft. A request with Authorization: Bearer <token> and no x-auth-scheme is treated as OAuth, and federated-token may also be sent as the x-auth-scheme and x-auth-ft query parameters.

Available options: api-token, api, api-oauth-token, federated-token, partner-api-token, partner-api, partner-api-oauth-token

x-auth-orgstring<RUUID>header

Client organization UUID (22-character RUUID), for partner credentials only. With it the call runs in that client organization with the partner support authority's role. Without it a partner credential runs as the partner organization, which outside the partner endpoints is deprecated (responses carry Deprecation and Sunset: Tue, 05 Jan 2027 00:00:00 GMT). A malformed value returns 400 INVALID_AUTH_ORG; a client organization the partner cannot access returns 403 PARTNER_CLIENT_ACCESS_DENIED.

Length: 22 to 22

Body

application/json · object

Ask for a priced quote for new licenses into the MSP's own pool: a pool opportunity with its quote is created in Salesforce and left un-accepted; nothing is ordered until acceptPoolOrder.

autoRenewboolean | nullbody

Required. True: Salesforce creates and bills a renewal order itself when the term ends (D27); the acknowledgement at acceptPoolOrder covers auto-renewal (D30). Only allowed while getPool.selfProvisioningAutoRenewEnabled is true (deferred after V1; otherwise 400 FEATURE_DISABLED).

productCodestring | nullbody
quantityinteger<int32> | nullbody

1 <= quantity <= maxPerRequest (see getCatalog).

requestIdstring | nullbody

Client-generated id, ONE per dialog open ([A-Za-z0-9_-]{1,64}). Retrying with the same id is idempotent: the same opportunity and its current quote come back (409 PROVISION_REPLAY_MISMATCH if the SKU, quantity or auto-renew differ).

Response

200 Quoted

application/json · object

200: the pool opportunity exists in Salesforce with its priced quote and awaits acceptance (acceptPoolOrder) until the quote expires. Nothing has been ordered. Never carries a claim code or key.

autoRenewboolean | null
errorboolean | null
errorCodestring | null

Stable, machine-readable code for the failure (one of the ApiErrorCode catalog) when error is true. Branch on this, not on errorMsg.

errorMsgstring | null
orderIdstring | null

Salesforce opportunity id: the order reference, passed to acceptPoolOrder / cancelPoolOrder.

quoteobject

A priced quote for a pool order, from the partner's Salesforce pricebook (CPQ); the prices and terms the partner acknowledges at acceptPoolOrder. While uncalculated is true CPQ is still pricing it: replay quotePoolOrder with the same requestId until it is false before showing prices.

Show child attributes
currencystring | null

ISO 4217 code of every price in the quote, e.g. USD.

expiresAtMillisinteger<int64> | null

After this the quote can no longer be accepted (410 QUOTE_EXPIRED); null while quote expiry is not in use (deferred after V1).

linesobject[] | null
Show child attributes
durationMonthsinteger<int32> | null
endMillisinteger<int64> | null

License term end (start + durationMonths).

namestring | null

Product name as Salesforce sells it.

productCodestring | null
quantityinteger<int32> | null
startMillisinteger<int64> | null

License term start (contract start date set by Salesforce).

totalPricenumber | null

Net line total (quantity x unit price) in the quote's currency.

unitPricenumber | null

Net unit price in the quote's currency.

quoteIdstring | null

The Salesforce CPQ quote id (SBQQ__Quote__c) the prices come from.

termsUrlstring | null

Where the terms can be read.

termsVersionstring | null

Version of the MSP pool order terms this quote is made under (this host's configured value, else Salesforce's); informational.

totalnumber | null

Net total of all lines, as CPQ last calculated it.

uncalculatedboolean | null

True while CPQ is still calculating the quote (SBQQ__Uncalculated__c): the lines and total may change; poll by replaying quotePoolOrder. acceptPoolOrder answers 409 QUOTE_RECALCULATING while true.

replayboolean | null

True when this requestId had already been quoted; the earlier opportunity and its current quote are returned and nothing new was created.

requestIdstring | null

The client request id the quote was asked under.

warningMsgstring | null

Errors

Like every operation, this one can also answer with the standard error body (errorCode, errorMsg). Errors explains each status and how to retry.

  • 400 Bad Request. errorCode is one of: BAD_REQUEST, VALIDATION_FAILED, MISSING_REQUIRED_FIELD, INVALID_JSON, INVALID_REQUEST_BODY, FEATURE_NOT_ENABLED, INVALID_AUTH_ORG, LOCATION_NOT_FOUND, SELF_PROVISIONING_DISABLED, SKU_NOT_ALLOWED, QUANTITY_INVALID, AUTO_RENEW_REQUIRED, PROVISION_CAP_EXCEEDED, ACKNOWLEDGEMENT_REQUIRED, SIGNATURE_REQUIRED, APEX_VALIDATION, SKU_NOT_IN_PRICEBOOK.
  • 401 Unauthorized. errorCode is one of: UNAUTHENTICATED, INVALID_CREDENTIAL, CREDENTIAL_EXPIRED, CREDENTIAL_REVOKED, CERTIFICATE_MISMATCH.
  • 403 Forbidden. errorCode is one of: FORBIDDEN, DOMAIN_NOT_ALLOWED, DEVICE_SCOPE_MISMATCH, ROLE_NOT_PERMITTED, FUNCTIONALITY_REQUIRED, PARTNER_FUNCTIONALITY_REQUIRED, PERMISSION_REQUIRED, PARTNER_CLIENT_ACCESS_DENIED, HARDWARE_NOT_AVAILABLE, HARDWARE_ALREADY_REGISTERED, PARTNER_PORTAL_NOT_ENABLED, MANAGED_BY_MSP, SUPER_ADMIN_RESTRICTED_BY_MSP, MSP_DESIGNATION_INVALID, NOT_MANAGED_CLIENT, NOT_VERIFIED_MSP, ORDER_NOT_YOURS.
  • 429 Too Many Requests. errorCode is one of: RATE_LIMITED, QUOTE_RATE_LIMITED.
  • 500 Internal Server Error. errorCode is one of: INTERNAL_ERROR.
  • 503 Service Unavailable. errorCode is one of: SERVICE_UNAVAILABLE, SALESFORCE_UNAVAILABLE.