Inyo

Pull and Push in One Step

The PULLPUSH payment type combines fund collection and disbursement into a single API call. Funds are pulled from the sender's card or bank account and simultaneously pushed to the recipient's destination.

This reduces latency and simplifies workflows where funds need to move between two parties in a single transaction.

Endpoint

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

Headers:

HeaderValue
AuthorizationBearer {accessToken}
Content-Typeapplication/json

Request Structure

Root Object

FieldTypeRequiredDescription
externalPaymentIdstringYesYour unique payment identifier
ipAddressstringYesOriginator's IPv4 or IPv6 address
paymentTypestringYes"PULLPUSH"
amountobjectYesPull amount (sender side, in USD)
recipientAmountobjectYesPush amount (recipient side, any currency)
exchangeRatenumberYesFX rate between source and destination currencies
senderobjectYesSender details and payment source
recipientobjectYesRecipient details and payout destination

Sender

The sender structure is identical to a Pull payment — includes customer, customerAddress, and source:

sender.source — Card

FieldTypeRequiredDescription
typestringYes"CARD"
card.tokenstringYesCard token UUID from tokenizer

sender.source — Bank Account

FieldTypeRequiredDescription
typestringYes"BANK_ACCOUNT"
accountTypestringYes"savings", "checking", etc.
accountNumberstringYesBank account number
routingNumberstringYesABA routing number
accountHolderobjectYes{ type, firstName, lastName }

Recipient

The recipient structure is identical to a Push payment — includes customer, customerAddress, and destination.

Example — PULLPUSH (Card → 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": "lucas.silva@example.com",
        "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": "ana.souza@example.com",
        "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": "ana.souza@wallet.com"
        }
      }
    }
  }'

Example — PULLPUSH (Bank Account → 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": "maria.johnson@example.com",
        "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": "pedro.santos@example.com",
        "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": "pedro.santos@example.com"
        }
      }
    }
  }'

Key Differences from Separate Pull + Push

AspectSeparate callsPULLPUSH
API calls2 (one pull, one push)1
AtomicityIndependent — push can fail after pull succeedsSingle transaction
FX rateMust manage independentlySpecified in same request
Use caseComplex flows with intermediate logicStraight-through remittance