Ir para o conteúdo
DocsAPI 2026-11-13

Referência da API

Dois cartões

Pagamento dividido em dois cartões.

Pagamento com dois cartões

POST/v1/payment-groupsImplementada

Chave de API (Authorization: Bearer ep_…)· escopo payments:write· createTwoCardGroup

Paga um pedido com dois cartões. As duas partes são pré-autorizadas e só são capturadas quando ambas forem aprovadas; se uma falhar, a outra é compensada por estorno, sem cobrança dupla. O pedido só é liberado com o grupo pago. Responde 202 com a operação.

Escopo da chave: payments:write.

Idempotência: exige o header Idempotency-Key.

Headers de createTwoCardGroup
HeaderObrigatórioDescrição
X-Account-IdsimConta permitida pelos grants do principal.
Idempotency-KeysimChave única por intenção (16 a 128 caracteres visíveis). Ao refazer a mesma chamada, repita a mesma chave: o resultado gravado é devolvido. Mesma chave com outro conteúdo responde 409 IDEMPOTENCY_CONFLICT.
Parâmetros de createTwoCardGroup
ParâmetroOndeTipoDescrição
Eclipta-Pay-Versionheader"2026-11-13"Versão de data do contrato. Opcional; a resposta sempre informa a versão usada. Valor desconhecido responde 400 UNSUPPORTED_API_VERSION.

Corpo da requisição

Campos do corpo de createTwoCardGroup
CampoTipoDescrição
orderId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
legs obrigatóriolista de PaymentLegInput 2–2 itens
legs[].clientLegReference obrigatóriotexto 1–60 caracteres
legs[].amountCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
legs[].paymentMethodId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
legs[].installments obrigatóriointeiro 1 a 21
consent obrigatórioConsent
consent.termsVersion obrigatóriotexto 1–∞ caracteres
consent.accepted obrigatóriotrue
consent.displayedScheduleHash obrigatóriotexto formato ^[a-f0-9]{64}$
Exemplo
curl -X POST "$ECLIPTA_PAY_API/v1/payment-groups" \
  -H "Authorization: Bearer $ECLIPTA_PAY_KEY" \
  -H "X-Account-Id: $ECLIPTA_PAY_ACCOUNT" \
  -H "Idempotency-Key: <uma chave por intenção>" \
  -H "Content-Type: application/json" \
  -d '{"orderId":"ord_01JDY8B1B2C3D4E5F6G7H8J9KB","legs":[{"clientLegReference":"cartao-1","amountCents":"30000","paymentMethodId":"pm_01JDY8G1B2C3D4E5F6G7H8J9KK","installments":1},{"clientLegReference":"cartao-2","amountCents":"20000","paymentMethodId":"pm_01JDYB61B2C3D4E5F6G7H8J9KF","installments":1}],"consent":{"termsVersion":"dois-cartoes-2026-11-14","accepted":true,"displayedScheduleHash":"3b1f6c0e9a2d4b7c8e5f1a0d2c4b6e8f0a1c3e5b7d9f2a4c6e8b0d1f3a5c7e9b"}}'

Resposta 202: Aceito: a intenção foi registrada; acompanhe o resultado (não é transação concluída).

Campos da resposta 202 de createTwoCardGroup
CampoTipoDescrição
id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
status obrigatório"ACCEPTED" | "DISPATCHING" | "UNKNOWN" | "SUCCEEDED" | "FAILED" | "MANUAL_REVIEW"
kind obrigatóriotexto
resourceIdId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
statusUrl obrigatóriotexto
nextAction obrigatório"WAIT" | "UPDATE_PAYMENT_METHOD" | "COMPLETE_3DS" | "CONTACT_SUPPORT" | "NONE"
challengeUrltextoSomente URL obtida do provedor e validada.
errorError
error.code obrigatóriotextoCódigo estável em UPPER_SNAKE.
error.message obrigatóriotexto
error.requestId obrigatóriotexto
error.fieldErrorslista de objeto
error.fieldErrors[].field obrigatóriotexto
error.fieldErrors[].code obrigatóriotexto
createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Exemplo 202
{
  "id": "op_01JDY8D1B2C3D4E5F6G7H8J9KD",
  "status": "ACCEPTED",
  "kind": "AUTHORIZE_GROUP_LEG",
  "resourceId": "grp_01JDYB11B2C3D4E5F6G7H8J9KA",
  "statusUrl": "/v1/operations/op_01JDY8D1B2C3D4E5F6G7H8J9KD",
  "nextAction": "WAIT",
  "createdAt": "2026-11-13T13:00:00.000Z"
}

Erros

Erros de createTwoCardGroup
HTTPExemplo de codeQuando
400INVALID_REQUESTRequisição inválida: fieldErrors aponta cada campo.
401INVALID_API_KEYChave de API ausente, inválida, expirada ou revogada.
403SCOPE_MISSINGEscopo ausente, conta não permitida em X-Account-Id, IP fora da lista ou conta suspensa.
409IDEMPOTENCY_CONFLICTConflito de idempotência (IDEMPOTENCY_CONFLICT), requisição em andamento com a mesma chave (REQUEST_IN_PROGRESS) ou estado do recurso.
422CAPABILITY_UNAVAILABLERegra de negócio ou capacidade indisponível para a conta.
429TOO_MANY_REQUESTSLimite de requisições da chave atingido (rajada de 100 e 6.000 por minuto). Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; o 429 traz Retry-After em segundos. Aguarde e repita com a mesma Idempotency-Key.

Listar grupos de dois cartões (filtro por pedido)

GET/v1/payment-groupsImplementada

Chave de API (Authorization: Bearer ep_…)· escopo payments:read· listGroups

Lista os grupos de dois cartões da conta, com filtro opcional por pedido (orderId).

Escopo da chave: payments:read.

Headers de listGroups
HeaderObrigatórioDescrição
X-Account-IdsimConta permitida pelos grants do principal.
Parâmetros de listGroups
ParâmetroOndeTipoDescrição
cursorquerytexto0–200 caracteres
limitqueryinteiro1 a 100 · padrão 20
orderIdqueryId (texto)8–160 caracteres · formato ^[A-Za-z0-9_]+$
Eclipta-Pay-Versionheader"2026-11-13"Versão de data do contrato. Opcional; a resposta sempre informa a versão usada. Valor desconhecido responde 400 UNSUPPORTED_API_VERSION.
Exemplo
curl -X GET "$ECLIPTA_PAY_API/v1/payment-groups" \
  -H "Authorization: Bearer $ECLIPTA_PAY_KEY" \
  -H "X-Account-Id: $ECLIPTA_PAY_ACCOUNT"

Resposta 200: Sucesso.

Campos da resposta 200 de listGroups
CampoTipoDescrição
data obrigatóriolista de PaymentGroup
data[].id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
data[].orderId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
data[].status obrigatório"DRAFT" | "AUTHORIZING" | "AUTHORIZED" | "CAPTURING" | "PAID" | "UNKNOWN" | "PARTIALLY_CAPTURED" | "COMPENSATING" | "COMPENSATED" | "FAILED" | "MANUAL_REVIEW"
data[].outcome obrigatório"PROCESSING" | "UNCERTAIN" | "PAID" | "NOT_COMPLETED_RELEASING" | "NOT_COMPLETED_REFUNDING" | "NOT_COMPLETED" | "MANUAL_REVIEW"Resumo para o pagador/lojista. Autorização nunca libera entrega (TWO-002).
data[].expectedTotalCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
data[].confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
data[].refundedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
data[].fulfillmentEligible obrigatóriobooleanoSó com as duas partes confirmadas (ON_FULLY_PAID obrigatório).
data[].legs obrigatóriolista de PaymentLeg 2–2 itens
data[].legs[].id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
data[].legs[].index obrigatóriointeiro 1 a 2
data[].legs[].clientLegReference obrigatóriotexto
data[].legs[].amountCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
data[].legs[].confirmedCents obrigatórioCents (texto)Capturado e confirmado pelo provedor. formato ^(0|[1-9][0-9]{0,14})$
data[].legs[].refundedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
data[].legs[].installmentCount obrigatóriointeiro 1 a 9007199254740991
data[].legs[].status obrigatório"PENDING" | "AUTHORIZING" | "AUTHORIZED" | "DECLINED" | "AUTH_UNKNOWN" | "CAPTURING" | "CAPTURED" | "CAPTURE_FAILED" | "CAPTURE_UNKNOWN" | "RELEASE_PENDING" | "RELEASED" | "REFUNDING" | "REFUNDED" | "MANUAL_REVIEW"
data[].legs[].display obrigatórioobjeto
data[].legs[].display.label obrigatóriotexto
data[].legs[].display.variant obrigatório"info" | "warn" | "accent" | "ok" | "bad" | "neutral"
data[].legs[].paymentId obrigatórioId (texto) ou nulo
data[].legs[].brand obrigatóriotexto ou nulo
data[].legs[].last4 obrigatóriotexto ou nulo
data[].legs[].reservationExpiresAt obrigatóriodata e hora (ISO 8601) ou nuloFim da validade documentada da reserva (pré-autorização).
data[].legs[].challengeUrl obrigatóriotexto ou nuloDesafio 3DS do emissor desta parte (só enquanto autoriza). Não prova pagamento.
data[].refunds obrigatóriolista de GroupRefund
data[].refunds[].id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
data[].refunds[].kind obrigatório"COMPENSATION" | "MERCHANT_REFUND"
data[].refunds[].status obrigatóriotexto
data[].refunds[].requestedCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
data[].refunds[].confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
data[].refunds[].allocations obrigatóriolista de objeto
data[].refunds[].allocations[].legId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
data[].refunds[].allocations[].requestedCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
data[].refunds[].allocations[].confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
data[].refunds[].allocations[].status obrigatóriotexto
data[].refunds[].createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
data[].version obrigatóriointeiro 1 a 9007199254740991
data[].createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
data[].asOf obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
nextCursor obrigatóriotexto ou nulo
Exemplo 200
{
  "data": [
    {
      "id": "grp_01JDYB11B2C3D4E5F6G7H8J9KA",
      "orderId": "ord_01JDY8B1B2C3D4E5F6G7H8J9KB",
      "status": "PAID",
      "outcome": "PAID",
      "expectedTotalCents": "50000",
      "confirmedCents": "50000",
      "refundedCents": "0",
      "fulfillmentEligible": true,
      "legs": [
        {
          "id": "leg_01JDYB21B2C3D4E5F6G7H8J9KB",
          "index": 1,
          "clientLegReference": "cartao-1",
          "amountCents": "30000",
          "confirmedCents": "30000",
          "refundedCents": "0",
          "installmentCount": 1,
          "status": "CAPTURED",
          "display": {
            "label": "Capturado",
            "variant": "ok"
          },
          "paymentId": "pay_01JDY8C1B2C3D4E5F6G7H8J9KC",
          "brand": "VISA",
          "last4": "1111",
          "reservationExpiresAt": null,
          "challengeUrl": null
        },
        {
          "id": "leg_01JDYB31B2C3D4E5F6G7H8J9KC",
          "index": 2,
          "clientLegReference": "cartao-2",
          "amountCents": "20000",
          "confirmedCents": "20000",
          "refundedCents": "0",
          "installmentCount": 1,
          "status": "CAPTURED",
          "display": {
            "label": "Capturado",
            "variant": "ok"
          },
          "paymentId": "pay_01JDYB71B2C3D4E5F6G7H8J9KH",
          "brand": "MASTERCARD",
          "last4": "4444",
          "reservationExpiresAt": null,
          "challengeUrl": null
        }
      ],
      "refunds": [],
      "version": 6,
      "createdAt": "2026-11-13T13:00:00.000Z",
      "asOf": "2026-11-13T13:00:00.000Z"
    }
  ],
  "nextCursor": null
}

Erros

Erros de listGroups
HTTPExemplo de codeQuando
400INVALID_REQUESTRequisição inválida: fieldErrors aponta cada campo.
401INVALID_API_KEYChave de API ausente, inválida, expirada ou revogada.
403SCOPE_MISSINGEscopo ausente, conta não permitida em X-Account-Id, IP fora da lista ou conta suspensa.
429TOO_MANY_REQUESTSLimite de requisições da chave atingido (rajada de 100 e 6.000 por minuto). Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; o 429 traz Retry-After em segundos. Aguarde e repita com a mesma Idempotency-Key.

Consultar grupo

GET/v1/payment-groups/{id}Implementada

Chave de API (Authorization: Bearer ep_…)· escopo payments:read· getGroup

Consulta o grupo: situação de cada cartão (autorizado, capturado, compensado), total confirmado e se o pedido já pode ser entregue. Parte incerta aparece como incerta até a confirmação.

Escopo da chave: payments:read.

Headers de getGroup
HeaderObrigatórioDescrição
X-Account-IdsimConta permitida pelos grants do principal.
Parâmetros de getGroup
ParâmetroOndeTipoDescrição
id obrigatóriocaminhoId (texto)8–160 caracteres · formato ^[A-Za-z0-9_]+$
Eclipta-Pay-Versionheader"2026-11-13"Versão de data do contrato. Opcional; a resposta sempre informa a versão usada. Valor desconhecido responde 400 UNSUPPORTED_API_VERSION.
Exemplo
curl -X GET "$ECLIPTA_PAY_API/v1/payment-groups/{id}" \
  -H "Authorization: Bearer $ECLIPTA_PAY_KEY" \
  -H "X-Account-Id: $ECLIPTA_PAY_ACCOUNT"

Resposta 200: Sucesso.

Campos da resposta 200 de getGroup
CampoTipoDescrição
id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
orderId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
status obrigatório"DRAFT" | "AUTHORIZING" | "AUTHORIZED" | "CAPTURING" | "PAID" | "UNKNOWN" | "PARTIALLY_CAPTURED" | "COMPENSATING" | "COMPENSATED" | "FAILED" | "MANUAL_REVIEW"
outcome obrigatório"PROCESSING" | "UNCERTAIN" | "PAID" | "NOT_COMPLETED_RELEASING" | "NOT_COMPLETED_REFUNDING" | "NOT_COMPLETED" | "MANUAL_REVIEW"Resumo para o pagador/lojista. Autorização nunca libera entrega (TWO-002).
expectedTotalCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
refundedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
fulfillmentEligible obrigatóriobooleanoSó com as duas partes confirmadas (ON_FULLY_PAID obrigatório).
legs obrigatóriolista de PaymentLeg 2–2 itens
legs[].id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
legs[].index obrigatóriointeiro 1 a 2
legs[].clientLegReference obrigatóriotexto
legs[].amountCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
legs[].confirmedCents obrigatórioCents (texto)Capturado e confirmado pelo provedor. formato ^(0|[1-9][0-9]{0,14})$
legs[].refundedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
legs[].installmentCount obrigatóriointeiro 1 a 9007199254740991
legs[].status obrigatório"PENDING" | "AUTHORIZING" | "AUTHORIZED" | "DECLINED" | "AUTH_UNKNOWN" | "CAPTURING" | "CAPTURED" | "CAPTURE_FAILED" | "CAPTURE_UNKNOWN" | "RELEASE_PENDING" | "RELEASED" | "REFUNDING" | "REFUNDED" | "MANUAL_REVIEW"
legs[].display obrigatórioobjeto
legs[].display.label obrigatóriotexto
legs[].display.variant obrigatório"info" | "warn" | "accent" | "ok" | "bad" | "neutral"
legs[].paymentId obrigatórioId (texto) ou nulo
legs[].brand obrigatóriotexto ou nulo
legs[].last4 obrigatóriotexto ou nulo
legs[].reservationExpiresAt obrigatóriodata e hora (ISO 8601) ou nuloFim da validade documentada da reserva (pré-autorização).
legs[].challengeUrl obrigatóriotexto ou nuloDesafio 3DS do emissor desta parte (só enquanto autoriza). Não prova pagamento.
refunds obrigatóriolista de GroupRefund
refunds[].id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
refunds[].kind obrigatório"COMPENSATION" | "MERCHANT_REFUND"
refunds[].status obrigatóriotexto
refunds[].requestedCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
refunds[].confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
refunds[].allocations obrigatóriolista de objeto
refunds[].allocations[].legId obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
refunds[].allocations[].requestedCents obrigatórioPositiveCents (texto) formato ^[1-9][0-9]{0,14}$
refunds[].allocations[].confirmedCents obrigatórioCents (texto) formato ^(0|[1-9][0-9]{0,14})$
refunds[].allocations[].status obrigatóriotexto
refunds[].createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
version obrigatóriointeiro 1 a 9007199254740991
createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
asOf obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Exemplo 200
{
  "id": "grp_01JDYB11B2C3D4E5F6G7H8J9KA",
  "orderId": "ord_01JDY8B1B2C3D4E5F6G7H8J9KB",
  "status": "PAID",
  "outcome": "PAID",
  "expectedTotalCents": "50000",
  "confirmedCents": "50000",
  "refundedCents": "0",
  "fulfillmentEligible": true,
  "legs": [
    {
      "id": "leg_01JDYB21B2C3D4E5F6G7H8J9KB",
      "index": 1,
      "clientLegReference": "cartao-1",
      "amountCents": "30000",
      "confirmedCents": "30000",
      "refundedCents": "0",
      "installmentCount": 1,
      "status": "CAPTURED",
      "display": {
        "label": "Capturado",
        "variant": "ok"
      },
      "paymentId": "pay_01JDY8C1B2C3D4E5F6G7H8J9KC",
      "brand": "VISA",
      "last4": "1111",
      "reservationExpiresAt": null,
      "challengeUrl": null
    },
    {
      "id": "leg_01JDYB31B2C3D4E5F6G7H8J9KC",
      "index": 2,
      "clientLegReference": "cartao-2",
      "amountCents": "20000",
      "confirmedCents": "20000",
      "refundedCents": "0",
      "installmentCount": 1,
      "status": "CAPTURED",
      "display": {
        "label": "Capturado",
        "variant": "ok"
      },
      "paymentId": "pay_01JDYB71B2C3D4E5F6G7H8J9KH",
      "brand": "MASTERCARD",
      "last4": "4444",
      "reservationExpiresAt": null,
      "challengeUrl": null
    }
  ],
  "refunds": [],
  "version": 6,
  "createdAt": "2026-11-13T13:00:00.000Z",
  "asOf": "2026-11-13T13:00:00.000Z"
}

Erros

Erros de getGroup
HTTPExemplo de codeQuando
400INVALID_REQUESTRequisição inválida: fieldErrors aponta cada campo.
401INVALID_API_KEYChave de API ausente, inválida, expirada ou revogada.
403SCOPE_MISSINGEscopo ausente, conta não permitida em X-Account-Id, IP fora da lista ou conta suspensa.
404RESOURCE_NOT_FOUNDRecurso inexistente nesta conta (inclusive recurso de outra conta ou de outro tenant).
429TOO_MANY_REQUESTSLimite de requisições da chave atingido (rajada de 100 e 6.000 por minuto). Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; o 429 traz Retry-After em segundos. Aguarde e repita com a mesma Idempotency-Key.

Estornar grupo (alocação proporcional)

POST/v1/payment-groups/{id}/refundsImplementada

Chave de API (Authorization: Bearer ep_…)· escopo refunds:write· refundGroup

Estorna um valor do grupo com alocação proporcional entre os dois cartões, gravada antes do envio e imutável. Responde 202 com a operação.

Escopo da chave: refunds:write.

Idempotência: exige o header Idempotency-Key.

Headers de refundGroup
HeaderObrigatórioDescrição
X-Account-IdsimConta permitida pelos grants do principal.
Idempotency-KeysimChave única por intenção (16 a 128 caracteres visíveis). Ao refazer a mesma chamada, repita a mesma chave: o resultado gravado é devolvido. Mesma chave com outro conteúdo responde 409 IDEMPOTENCY_CONFLICT.
Parâmetros de refundGroup
ParâmetroOndeTipoDescrição
id obrigatóriocaminhoId (texto)8–160 caracteres · formato ^[A-Za-z0-9_]+$
Eclipta-Pay-Versionheader"2026-11-13"Versão de data do contrato. Opcional; a resposta sempre informa a versão usada. Valor desconhecido responde 400 UNSUPPORTED_API_VERSION.

Corpo da requisição

Campos do corpo de refundGroup
CampoTipoDescrição
amountCents obrigatórioPositiveCents (texto)Valor a devolver; limitado ao principal elegível (pago − devolvido − reservado). formato ^[1-9][0-9]{0,14}$
reason obrigatóriotextoMotivo interno; não é enviado ao provedor. 10–500 caracteres
Exemplo
curl -X POST "$ECLIPTA_PAY_API/v1/payment-groups/{id}/refunds" \
  -H "Authorization: Bearer $ECLIPTA_PAY_KEY" \
  -H "X-Account-Id: $ECLIPTA_PAY_ACCOUNT" \
  -H "Idempotency-Key: <uma chave por intenção>" \
  -H "Content-Type: application/json" \
  -d '{"amountCents":"10000","reason":"Devolução parcial combinada com o cliente."}'

Resposta 202: Aceito: a intenção foi registrada; acompanhe o resultado (não é transação concluída).

Campos da resposta 202 de refundGroup
CampoTipoDescrição
id obrigatórioId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
status obrigatório"ACCEPTED" | "DISPATCHING" | "UNKNOWN" | "SUCCEEDED" | "FAILED" | "MANUAL_REVIEW"
kind obrigatóriotexto
resourceIdId (texto) 8–160 caracteres · formato ^[A-Za-z0-9_]+$
statusUrl obrigatóriotexto
nextAction obrigatório"WAIT" | "UPDATE_PAYMENT_METHOD" | "COMPLETE_3DS" | "CONTACT_SUPPORT" | "NONE"
challengeUrltextoSomente URL obtida do provedor e validada.
errorError
error.code obrigatóriotextoCódigo estável em UPPER_SNAKE.
error.message obrigatóriotexto
error.requestId obrigatóriotexto
error.fieldErrorslista de objeto
error.fieldErrors[].field obrigatóriotexto
error.fieldErrors[].code obrigatóriotexto
createdAt obrigatóriodata e hora (ISO 8601) formato ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Exemplo 202
{
  "id": "op_01JDY8D1B2C3D4E5F6G7H8J9KD",
  "status": "ACCEPTED",
  "kind": "REFUND_GROUP_LEG",
  "resourceId": "grp_01JDYB11B2C3D4E5F6G7H8J9KA",
  "statusUrl": "/v1/operations/op_01JDY8D1B2C3D4E5F6G7H8J9KD",
  "nextAction": "WAIT",
  "createdAt": "2026-11-13T13:00:00.000Z"
}

Erros

Erros de refundGroup
HTTPExemplo de codeQuando
400INVALID_REQUESTRequisição inválida: fieldErrors aponta cada campo.
401INVALID_API_KEYChave de API ausente, inválida, expirada ou revogada.
403SCOPE_MISSINGEscopo ausente, conta não permitida em X-Account-Id, IP fora da lista ou conta suspensa.
404RESOURCE_NOT_FOUNDRecurso inexistente nesta conta (inclusive recurso de outra conta ou de outro tenant).
409IDEMPOTENCY_CONFLICTConflito de idempotência (IDEMPOTENCY_CONFLICT), requisição em andamento com a mesma chave (REQUEST_IN_PROGRESS) ou estado do recurso.
422CAPABILITY_UNAVAILABLERegra de negócio ou capacidade indisponível para a conta.
429TOO_MANY_REQUESTSLimite de requisições da chave atingido (rajada de 100 e 6.000 por minuto). Toda resposta traz RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; o 429 traz Retry-After em segundos. Aguarde e repita com a mesma Idempotency-Key.

Todas as rotas