Inyo

Pull y Push en un Solo Paso

El tipo de pago PULLPUSH combina la recaudación y el desembolso de fondos en una sola llamada a la API. Los fondos se extraen (pull) de la tarjeta o cuenta bancaria del remitente y simultáneamente se envían (push) al destino del destinatario.

Esto reduce la latencia y simplifica los flujos de trabajo donde los fondos deben moverse entre dos partes en una sola transacción.

Endpoint

POST https://{FQDN}/v2/payment

Encabezados:

EncabezadoValor
AuthorizationBearer {accessToken}
Content-Typeapplication/json

Estructura de la Solicitud

Objeto Raíz

CampoTipoRequeridoDescripción
externalPaymentIdstringSíSu identificador único del pago
ipAddressstringSíDirección IPv4 o IPv6 del originador
paymentTypestringSí"PULLPUSH"
amountobjectSíMonto del pull (lado del remitente, en USD)
recipientAmountobjectSíMonto del push (lado del destinatario, cualquier moneda)
exchangeRatenumberSíTasa de cambio (FX) entre la moneda de origen y la de destino
senderobjectSíDatos del remitente y fuente del pago
recipientobjectSíDatos del destinatario y destino del payout

Sender

La estructura del remitente es idéntica a la de un pago Pull — incluye customer, customerAddress y source:

sender.source — Tarjeta

CampoTipoRequeridoDescripción
typestringSí"CARD"
card.tokenstringSíUUID del token de tarjeta obtenido del tokenizador

sender.source — Cuenta Bancaria

CampoTipoRequeridoDescripción
typestringSí"BANK_ACCOUNT"
accountTypestringSí"savings", "checking", etc.
accountNumberstringSíNúmero de cuenta bancaria
routingNumberstringSíNúmero de ruta ABA
accountHolderobjectSí{ type, firstName, lastName }

Recipient

La estructura del destinatario es idéntica a la de un pago Push — incluye customer, customerAddress y destination.

Ejemplo — PULLPUSH (Tarjeta → Wallet)

curl -X POST https://{FQDN}/v2/payment \
  -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIs...' \
  -H 'Content-Type: application/json' \
  -d '{
    "externalPaymentId": "pullpush-001",
    "ipAddress": "203.0.113.42",
    "paymentType": "PULLPUSH",
    "amount": {
      "total": 100.00,
      "currency": "USD"
    },
    "recipientAmount": {
      "total": 497.50,
      "currency": "BRL"
    },
    "exchangeRate": 4.975,
    "sender": {
      "customer": {
        "firstName": "Lucas",
        "lastName": "Silva",
        "phoneNumber": "11999999999",
        "documentNumber": "12345678900",
        "documentType": "NATIONAL_ID",
        "email": "[email protected]",
        "countryCodeAlpha3": "USA"
      },
      "customerAddress": {
        "stateCode": "CA",
        "city": "San Francisco",
        "line1": "123 Mission St",
        "line2": "Suite 900",
        "state": "California",
        "zipCode": "94105"
      },
      "source": {
        "type": "CARD",
        "card": {
          "token": "ab5fc589-8b48-4531-94c0-68b0629c13fe"
        }
      }
    },
    "recipient": {
      "customer": {
        "firstName": "Ana",
        "lastName": "Souza",
        "phoneNumber": "21987654321",
        "documentNumber": "10987654321",
        "documentType": "PASSPORT",
        "email": "[email protected]",
        "countryCodeAlpha3": "BRA"
      },
      "customerAddress": {
        "stateCode": "RJ",
        "city": "Rio de Janeiro",
        "line1": "Rua da Alfândega 45",
        "state": "Rio de Janeiro",
        "zipCode": "20010-030"
      },
      "destination": {
        "type": "WALLET",
        "wallet": {
          "walletId": "[email protected]"
        }
      }
    }
  }'

Ejemplo — PULLPUSH (Cuenta Bancaria → PIX)

curl -X POST https://{FQDN}/v2/payment \
  -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIs...' \
  -H 'Content-Type: application/json' \
  -d '{
    "externalPaymentId": "pullpush-002",
    "ipAddress": "203.0.113.42",
    "paymentType": "PULLPUSH",
    "amount": {
      "total": 200.00,
      "currency": "USD"
    },
    "recipientAmount": {
      "total": 995.00,
      "currency": "BRL"
    },
    "exchangeRate": 4.975,
    "sender": {
      "customer": {
        "firstName": "Maria",
        "lastName": "Johnson",
        "phoneNumber": "5551234567",
        "documentNumber": "987654321",
        "documentType": "DRIVER_LICENSE",
        "email": "[email protected]",
        "countryCodeAlpha3": "USA"
      },
      "customerAddress": {
        "stateCode": "TX",
        "city": "Austin",
        "line1": "789 Congress Ave",
        "state": "Texas",
        "zipCode": "78701"
      },
      "source": {
        "type": "BANK_ACCOUNT",
        "accountType": "checking",
        "accountNumber": "123456789",
        "routingNumber": "021000021",
        "accountHolder": {
          "type": "personal",
          "firstName": "Maria",
          "lastName": "Johnson"
        }
      }
    },
    "recipient": {
      "customer": {
        "firstName": "Pedro",
        "lastName": "Santos",
        "phoneNumber": "11987654321",
        "documentNumber": "98765432100",
        "documentType": "NATIONAL_ID",
        "email": "[email protected]",
        "countryCodeAlpha3": "BRA"
      },
      "customerAddress": {
        "stateCode": "SP",
        "city": "São Paulo",
        "line1": "Av Paulista 1000",
        "state": "São Paulo",
        "zipCode": "01311-100"
      },
      "destination": {
        "type": "PIX",
        "pix": {
          "keyType": "EMAIL",
          "key": "[email protected]"
        }
      }
    }
  }'

Diferencias Clave frente a Pull + Push por Separado

AspectoLlamadas separadasPULLPUSH
Llamadas a la API2 (un pull, un push)1
AtomicidadIndependientes — el push puede fallar después de que el pull tenga éxitoTransacción única
Tasa de cambio (FX)Debe gestionarse de forma independienteSe especifica en la misma solicitud
Caso de usoFlujos complejos con lógica intermediaRemesa directa de extremo a extremo