SelectwinSelectwin

Catálogo de Códigos de Erro

Este catálogo lista os valores de error.code que a API pode retornar, agrupados por status HTTP e por recurso. Para a estrutura do objeto de erro (envelope), veja Tratamento de Erros.

Status HTTP

A API usa códigos de status HTTP padrão. Cada error.code tem sempre o mesmo statusCode e a mesma category:

categoryStatusSignificado
validation400Requisição malformada ou parâmetro inválido (veja error.params)
authentication401Credencial (SelectKey / login) ausente, inválida ou revogada
payment402Pagamento recusado pelo emissor
authorization403Autenticado, mas sem permissão / conta não ativa
client404Recurso não encontrado
client409Conflito (estado incompatível, duplicidade, idempotência)
client413Corpo da requisição grande demais
validation422Entidade não processável (regra de negócio)
rate_limit429Limite de requisições excedido (veja API Limits)
server500Erro interno — tente novamente; se persistir, contate o suporte
server503Indisponibilidade temporária de um serviço — repita com backoff

Códigos comuns (cross-cutting)

Estes códigos vêm do kernel e podem aparecer em qualquer rota (recurso server, exceto onde indicado):

error.codeHTTPQuando ocorre
invalidParameters400Falha de validação de contrato (veja error.params para os campos) — inclusive metadata acima do limite (50 chaves, chave ≤ 40 caracteres, valor ≤ 500, objeto ≤ 8 KiB; veja Metadata)
unauthorized401SelectKey/token ausente, inválido ou revogado
actingAccountInvalid401X-Selectwin-Account com uma credencial que não é chave de API, com uma conta que não é sub-conta da sua plataforma, ou com a sua plataforma fora de active (Marketplace)
forbidden403Autenticado, mas sem permissão para a operação
payloadTooLarge413Corpo da requisição excede o limite (envie arquivos via /v1/assets)
tooManyRequests429Rate limit atingido (veja API Limits)
idempotencyInProgress409Já há uma requisição em andamento com esta X-Idempotency-Key
idempotencyOutcomeUnknown409A primeira requisição com esta chave não terminou de responder (há mais de 10 min) — pode ter executado; confira e repita com uma chave nova
idempotencyMismatch409Esta X-Idempotency-Key já foi usada com um payload diferente
accountLevelReadOnlyInSandbox409Recurso authentication. Escrita num recurso de conta (apps/integrações, pixels, área de membros, marketplace, gate do Repart, encerramento) com credencial sandbox (sk_test_… ou painel em Sandbox). Esses recursos têm uma cópia só, a de produção — leia à vontade, altere em live. Cada operação afetada vem marcada com x-account-level na OpenAPI
serverError500Erro interno inesperado

Erros de validação de campos trazem detalhes por campo em error.params:

JSON
{
  "error": {
    "status": "Bad Request",
    "statusCode": 400,
    "category": "validation",
    "code": "invalidParameters",
    "message": "Validation errors occurred.",
    "resource": "server",
    "params": [{ "amount": "amount must be a positive integer" }]
  }
}

Por recurso

Transactions

error.codeHTTPMensagem
transactionNotFound404Transaction not found
customerNotFound404The customer for this transaction was not found
cardNotFound404The card for this transaction was not found
addressNotFound404The billing address was not found
recipientNotFound404A split recipient was not found
disputeNotFound404No dispute was found for this transaction
cardCustomerMismatch422The card does not belong to the customer
transactionNotRefundable422This transaction cannot be refunded in its current status
refundAmountInvalid422Refund amount inválido (≤ 0 ou acima do total já cobrado)
refundInProgress409A refund for this transaction is already in progress
refundInsufficientBalance422The available balance does not cover this refund — the funds for this sale were already paid out
refundSplitRecipientInsufficientBalance422A split recipient of this sale does not have the available balance this refund draws from their released share
transactionNotCapturable422This transaction is not awaiting capture
captureAmountInvalid422Capture amount inválido (≤ 0 ou acima do autorizado)
transactionNotInDispute422Defense evidence só pode ser enviada com a transação em disputa
discountExceedsAmount422O desconto deixa a cobrança abaixo do mínimo
splitsExceedAmount422A soma dos splits excede o valor cobrado
splitsInvalid422Um split resolve para valor inválido (zero ou negativo)
installmentsExceedMax422Parcelas acima do máximo oferecido no momento
onBehalfOfInvalid422onBehalfOf deve referenciar uma sub-conta sua (marketplace habilitado)
sellerRatesMissing422Conta sem taxa configurada — não pode transacionar
chargeCompanyNotActive422Conta não está active — cobranças indisponíveis (numa cobrança onBehalfOf, avalia a SUB-conta)

Erros de processamento do pagamento (recurso payments):

error.codeHTTPMensagem
paymentDeclined402The payment was declined by the issuer
transactionNotFound404Transaction not found at the provider
providerUnavailable500The payment provider is temporarily unavailable

Marketplace

Sub-contas de uma plataforma (/v1/marketplace/* — guia). Recurso de conta: toda escrita com chave de sandbox responde 409 accountLevelReadOnlyInSandbox.

error.codeHTTPMensagem
marketplaceNotEnabled403A função de marketplace não está habilitada para esta conta
marketplaceNotApproved403A função está habilitada, mas aguarda a aprovação de compliance antes de criar sub-contas
marketplaceNested422Uma sub-conta não pode ser plataforma nem criar sub-contas
subAccountLimitReached422A conta atingiu o limite de sub-contas — fale com o seu gerente de conta
marketplaceUserRequired422A conta da plataforma não tem um titular registrado para receber a sub-conta — fale com o suporte
subAccountNotFound404Sub-conta não encontrada (ou não pertence à sua plataforma)
subAccountAlreadyActive422A sub-conta já está ativa — o link de credenciamento só vale para contas em cadastro
planNotFound404Plano de taxas não encontrado (ou não pertence à sua plataforma)
planFeeTypeMismatch422Um meio cobrado numa forma (percentual/fixo) diferente da sua própria taxa naquele meio (params: [{ method, field }])
platformRatesMissing422A sua conta ainda não tem taxa configurada, então o plano não pode ser validado
planReleaseBelowPlatform422Um prazo de liberação do plano é menor que o prazo em que a plataforma recebe aquele meio (params traz o mínimo por campo)
planInUse409O plano está atribuído a sub-contas e não pode ser excluído (params[0].subAccounts)
subAccountNameLocked422O nome só muda antes de o cadastro ser enviado — depois ele é parte do registro em análise
subAccountNotSuspendable422Só uma sub-conta active pode ser suspensa
subAccountNotReinstatable422A sub-conta não foi suspensa pela sua plataforma (ou não está disabled) — só a Selectwin reabilita; fale com o suporte
subAccountStatusConflict409O status da sub-conta mudou enquanto a requisição rodava — consulte e repita
closureRequestNotFound404A sub-conta não tem pedido de encerramento (consulta ou desistência) — recurso company
closureRequestNotCancelable409O encerramento já começou a ser executado e não pode mais ser desfeito — recurso company
kycLinkInvalid404O link de credenciamento é inválido, venceu, foi revogado — ou a sub-conta já está ativa
kycUploadLimitReached429Uploads demais pelo link de credenciamento na última hora (params[0].limit)

A plataforma agindo como a sub-conta (X-Selectwin-Account, guia) — recurso authentication:

error.codeHTTPMensagem
actingAccountInvalid401O cabeçalho veio com uma credencial que não é chave de API, com uma conta que não é sub-conta da sua plataforma, ou a sua plataforma não está ativa

Subscriptions

/v1/subscriptions é Selectwin-strict: a precificação vem das variantes recorrentes; não há campo amount nem preço manual.

error.codeHTTPMensagem
subscriptionNotFound404Subscription not found
customerNotFound404The customer for this subscription was not found
cardNotFound404The card for this subscription was not found
variantNotFound404One or more product variants were not found
cycleNotFound404The billing cycle was not found for this subscription
itemNotFound404The line item was not found for this subscription
splitNotFound404The split was not found for this subscription
splitRecipientNotFound404The split recipient company was not found
meteredItemNotFound404Metered subscription item not found
thresholdNotFound404Billing threshold not found
cardCustomerMismatch422The card does not belong to the customer
variantNotRecurring422A variant is not priced for recurring billing
subscriptionStartDateInPast422billing.startDate cannot be in the past (São Paulo calendar day)
subscriptionAlreadyCanceled422This subscription is already canceled
subscriptionNotModifiable422A canceled subscription cannot be modified
subscriptionNotPausable422This subscription cannot be paused in its current status
subscriptionNotResumable422Only a paused subscription can be resumed
noScheduledCycle422There is no scheduled cycle to renew for this subscription
subscriptionRequiresItem422A subscription must keep at least one line item
itemCurrencyMismatch422The item currency must match the subscription currency
duplicateSplitRecipient422A split already exists for this recipient
splitValueInvalid422A percentage split value must be between 0 and 100
usageOnNonMeteredItem422Usage can only be reported on metered items
usageActionUnsupported422Usage action not supported (only 'increment')
thresholdMisconfigured422Billing threshold misconfigured
thresholdAlreadyExists409A billing threshold already exists for this item
onBehalfOfInvalid422onBehalfOf deve referenciar uma sub-conta sua (marketplace habilitado)
fraudBlocked (recurso antifraud)403A criação foi recusada pelo antifraude (bloqueio ou pedido de revisão manual — a assinatura não espera revisão)

Customers

error.codeHTTPMensagem
customerNotFound404Customer not found
invalidCustomerId404The provided customer id is invalid
customerEmailTaken409A customer with this email already exists
customerDocumentTaken409A customer with this document already exists
customerHasActiveSubscription409Cliente com assinatura ativa não pode ser excluído (cancele a assinatura antes)

Cards

error.codeHTTPMensagem
cardIdNotFound404Card ID not found
cardInUseBySubscription422Uma assinatura de cartão viva deste cliente cobra este cartão no próximo ciclo; aponte a assinatura para outro antes de apagar. Assinaturas de pix/boleto não contam (geram QR/boleto novo a cada ciclo)
cardIdIsInvalid400Card ID is invalid
cardExpired400Card expired
invalidCardData422Invalid card data
cardBrandNotSupported422Card brand not supported
cardAssociationRateLimited429Muitas associações de cartão (ou recusas) em pouco tempo nesta conta. Aguarde e tente de novo; se não foi você, fale com o suporte

Addresses

error.codeHTTPMensagem
addressIdNotFound404Address not found

Wallets (contas bancárias)

error.codeHTTPMensagem
walletNotFound404Wallet not found
walletAlreadyExists409A wallet with these account details already exists
walletHasPendingWithdrawal409Wallet com saque em andamento não pode ser excluída
bankCodeNotSupported400This bank code is not supported

Withdrawals (saques)

error.codeHTTPMensagem
withdrawalNotFound404Withdrawal not found
withdrawalCreateNotEnabled400Withdrawals are not enabled for this company
withdrawalAmountLessThanMinimum400O valor do saque está abaixo do mínimo — error.params[0].minAmount traz o mínimo em centavos (o mesmo de GET /v1/companies/fees → withdrawal.minAmount)

Auto-cashout (saque automático)

error.codeHTTPMensagem
autoCashoutNotFound404Auto-cashout config not found
duplicateAutoCashoutForWallet400An auto-cashout config already exists for this wallet
percentageOverlapDetected400A soma das porcentagens habilitadas não pode exceder 100% (regras de conta removida não contam)
autoCashoutWalletArchived422A conta de destino da regra foi removida — envie o PUT com outro walletId antes de ligá-la

Finance (Balance / Receivables)

error.codeHTTPMensagem
balanceNotFound404No balance found for this company yet
balanceIsInsufficient422Insufficient available balance for this withdrawal
balanceHasNoDebt422Pedido de Pix de quitação (POST /v1/balance/debt-settlements) numa conta sem saldo negativo — não há dívida para quitar
debtSettlementInProgress409Outro pedido de quitação da mesma conta está emitindo o Pix neste instante. Aguarde alguns segundos e repita: o Pix em aberto será devolvido
withdrawalBlockedByDebt422A conta tem saldo negativo (dívida com a plataforma — em geral estorno ou chargeback depois de um saque). O saque fica bloqueado até a dívida ser quitada, e ela é abatida automaticamente pelos próximos recebíveis liberados. O valor em aberto vem em params[0].owedAmount (centavos)
withdrawalDuplicateSuspected409Um segundo POST /v1/withdrawals idêntico (mesma carteira, mesmo valor) chegou em menos de 10 segundos sem X-Idempotency-Key. Nada foi debitado; params[0].withdrawalId é o saque que já existe. Mande sempre a chave de idempotência para reenviar com segurança
receivableNotFound404Receivable not found

Products & Variants

error.codeHTTPMensagem
productNotFound404Product not found
variantNotFound404Variant not found
invalidPricing422Invalid advanced pricing configuration
pricingTypeImmutable422pricing.type is immutable
pricingSchemaImmutable422pricing.schema is immutable
variantRenewalRulesUnavailable503The renewal rules cannot be saved yet

Coupons

error.codeHTTPMensagem
couponNotFound404The coupon code was not found
couponCodeConflict409A coupon with this code already exists
couponDisabled422This coupon is no longer active
couponNotYetActive422This coupon is not active yet
couponExpired422This coupon has expired
couponMinCartAmount422Cart total abaixo do mínimo do cupom
couponMaxCartAmount422Cart total acima do máximo do cupom
couponMinCartItems422Menos itens do que o cupom exige
couponMaxCartItems422Mais itens do que o cupom permite
couponNotApplicable422This coupon does not apply to this cart
couponUsageLimitReached422This coupon has reached its usage limit
couponCustomerLimitReached422This coupon has already been used by this customer
couponExceedsTotal422The coupon discount exceeds the chargeable total
couponAlreadyApplied422O mesmo cupom foi aplicado mais de uma vez na mesma cobrança
couponNotCumulative422Cupom isCumulative:false enviado junto de outro cupom

Checkout

error.codeHTTPMensagem
checkoutSessionNotFound404Checkout session not found
sessionHasActivePayment409Já há um pagamento em voo: 2º submit, ou patch nos campos que a cobrança usa (items, coupons, customer, address, shippingOptionId) (params[0].jobId)
sessionAlreadyPaid409A compra desta sessão já está paga, ou aguardando o comprador, por OUTRO pagamento dela — nunca um 2º pagamento da mesma compra (params[0].transactionId, só no submit do lojista)
checkoutCartChangedDuringPayment409items/coupons mudaram entre o cálculo do total e o claim do /pay; refaça /totals e /pay com o carrinho atual
checkoutTemplateMismatch409O templateId do corpo não é o template com que a sessão nasceu; omita-o ou mande o da sessão
checkoutCartNotEditable422O link (editable:false) ou o template trava essa mudança do carrinho (params[0].rule: quantity, removal ou addition)
exitCouponNotOffered404Não há cupom de saída para esta sessão (popup desligado, sem código, ou código que não vale agora)
invalidOrderbump400Linha de order bump com quantidade que o lojista não ofereceu, ou a mesma variante marcada como bump duas vezes
upsellPriceChanged409O expectedAmount/expectedPricingType do aceite não bate com a oferta viva; nada foi cobrado. A oferta atual vem em params[0] ({upsellId, amount, pricingType, currency}) — releia GET /checkout/v1/upsells e mostre o preço que está de fato à venda, nunca reenvie às cegas
checkoutSessionNotUpdatable409A completed checkout session can no longer be updated
checkoutSessionNotPayable409This checkout session is not in a payable state
variantIdIsInvalid422Um item referencia uma variante que não existe, está desligada, pertence a um produto desligado ou ao outro ambiente — error.params[0].items diz qual
onBehalfOfInvalid422onBehalfOf deve referenciar uma sub-conta sua (marketplace habilitado)
checkoutPaymentLinkNotFound404Payment link not found
checkoutPaymentLinkCreateFailed500The payment link could not be created
checkoutTemplateNotFound404Checkout template not found
checkoutTemplateIdIsInvalid422The checkout template does not exist
orderbumpNotFound404Order bump not found
reviewNotFound404Checkout review not found
shippingOptionNotFound404Shipping option not found
shippingOptionRequiresTemplateOrGlobal422A shipping option must be global or bound to a checkout template
checkoutPixelNotFound404Checkout tracking pixel not found
upsellNotFound / upsellOfferNotFound404Upsell offer not found
upsellParentNotFound404Parent transaction not found
upsellParentNotApproved422A transação pai precisa estar aprovada para cobrar um upsell
upsellOfferExpired422This upsell offer has expired
upsellOfferNotEligible422This upsell offer is not eligible for the parent purchase
upsellAmountTooLow422The upsell amount is below the minimum chargeable value

Webhooks

error.codeHTTPMensagem
webhookEndpointNotFound404Webhook endpoint not found
webhookEventNotFound404Webhook event not found
webhookDispatchNotFound404Webhook dispatch not found
webhookUnknownResource422Unknown event resource — cannot build payload
webhookSigningDisabled422This endpoint has signing disabled (no secret)

Domains

error.codeHTTPMensagem
domainIdIsInvalid404Domain ID is invalid (not found for this company)
domainAlreadyExists409Domain already exists
domainLimitExceeded409Domain limit exceeded
domainUpdateFailed400Domain update failed
domainEdgeProvisionFailed422Domain edge provisioning failed

Permissões da conta

Quando a conta tem uma lista de permissões (recursos e operações liberados), uma chave de API que tenta sair dela recebe:

error.codeHTTPMensagem
resourceNotAllowed403This resource is not allowed for this client
operationMethodNotAllowed403This operation is not allowed for this client

Exports

error.codeHTTPMensagem
exportNotFound404The export was not found
exportNotCancelable422This export can no longer be canceled
exportTooLarge422The export exceeds the maximum allowed row count
exportTooManyOpen429Too many exports are still open for this account — at most 3 can be pending or processing at once; wait for one to finish or cancel one

Assets (upload)

error.codeHTTPMensagem
assetNotFound404The asset was not found
assetUploadIncomplete422No uploaded object was found for this asset yet
assetContentTypeMismatch422The uploaded file is not of the declared contentType; it was discarded (suba de novo com o Content-Type de upload.headers)
assetContentTypeUnverified503The storage could not report the uploaded file type yet; nothing was discarded (chame o confirm de novo — não precisa subir o arquivo outra vez)
assetCompanyUnresolved422Could not resolve the company for this upload
storageNotConfigured503Object storage is not configured (indisponibilidade temporária)

Como tratar erros (recomendado)

JavaScript
const res = await fetch(url, { headers: { SelectKey: process.env.SELECTWIN_API_KEY } });
if (!res.ok) {
  const { error } = await res.json();
  switch (error.code) {                       // ← key no code, nunca na message
    case 'customerNotFound':
      return handleMissingCustomer();
    case 'balanceIsInsufficient':
      return promptTopUp();
    case 'paymentDeclined':
      return promptAnotherCard();
    default:
      if (error.statusCode === 429) return retryWithBackoff();   // rate limit
      if (error.statusCode >= 500)  return retryWithBackoff();   // transitório
      throw new Error(`${error.code}: ${error.message}`);
  }
}

Atualizado em 21 de outubro de 2026

Preferências de cookies

Hoje o site usa só cookies essenciais: nenhuma ferramenta de medição ou de anúncios está ligada, e nada é compartilhado com terceiros. Se isso mudar, você decide aqui antes de qualquer coisa ser carregada.

  • Mantêm o site funcionando: segurança, a sua escolha sobre cookies e preferências como a versão da documentação. Não dependem de consentimento.

    Sempre ativos