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
externalPaymentIdstringSu identificador único del pago
ipAddressstringDirección IPv4 o IPv6 del originador
paymentTypestring"PULLPUSH"
amountobjectMonto del pull (lado del remitente, en USD)
recipientAmountobjectMonto del push (lado del destinatario, cualquier moneda)
exchangeRatenumberTasa de cambio (FX) entre la moneda de origen y la de destino
senderobjectDatos del remitente y fuente del pago
recipientobjectDatos 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
typestring"CARD"
card.tokenstringUUID del token de tarjeta obtenido del tokenizador

sender.source — Cuenta Bancaria

CampoTipoRequeridoDescripción
typestring"BANK_ACCOUNT"
accountTypestring"savings", "checking", etc.
accountNumberstringNúmero de cuenta bancaria
routingNumberstringNúmero de ruta ABA
accountHolderobject{ 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