Examples
Sample code

IMPORTANT NOTES:

  • There is a hard limit of 100 transactions per api request.
  • The system doesn't check if a transaction was already added before. If you succesfully double post a transaction to the API it will be added to the system twice. Make sure to succesfully send each transaction to the API only once!

Authentication

All requests to the API should include the X-FIXIPAY-TOKEN header. The value of the header is your API key. Please keep this key safe and don't share it. If you need you can always generate a new key which will automatically revoke the previous one.

Getting a transaction [GET]

Download a Postman v1 Dump
Download a Postman v2 Collection

You need to make a GET request to: /[id_of_transaction]

The response is a simple JSON object with 2 properties: transaction with the details of the transactions and errors with an array of errors. If the errors array is empty it means all transactions were added succesfully.

Possible statuses:

  • Pending
  • Confirmed
  • Refund
  • Dispute
  • Blocked
  • Canceled
Note: You can get notified of status changes by subscribing to our Webhooks.

Sample response

Without errors


  {
    "transaction": {
      "id": 1234,
      "reference": "REF1234",
      "currency": "EUR",
      "sum": 120.5,
      "fee": 20.5,
      "amount": 100,
      "status": "Pending",
      "created_at": "2019-03-14 01:41:32",
      "created_via": "API",
      "details": {
        "Bank Account Holders Name": "Account Holder Name",
        "Address": "Account holder address",
        "City": "City of residence",
        "Postal Code": "Postal code of residence",
        "Country": "country of residence",
        "IBAN": "An IBAN account",
        "SWIFT \/ BIC Code": "The SWIFT code",
        "Bank Name": "The name of the bank",
        "Bank Address": "The address of the bank",
        "Bank City": "The city of the bank",
        "Bank Postal Code": "The postal code of the bank",
        "Bank Country": "The country of the bank"
      }
    },
    "errors": []
  }

With errors


  {
    "transaction": null,
    "errors": []
  }

Creating a transaction [POST]

Download a Postman v1 Dump
Download a Postman v2 Collection

You need to make a POST request to:

The response is a simple JSON object with 2 properties: transaction_ids with an error of created transactions and errors with an array of errors. If the errors array is empty it means all transactions were added succesfully.

The body of the POST request should be an array of transactions in JSON format. The accepted properties for each transaction are show below (* means mandatory)

All data must be in English. We do not support accented or latin extended characters at this moment.

Merchant *
The name of the merchant as it appears on Fixipay (Manage merchants)
Reference *
A unique reference number of the transfer. If a transaction already exists in our systsem with this reference the request will be denied.
Amount *
The amount of the transfer - only integers or floats (e.g. 100.50)
Currency *
Currency code for the transfer. Can be one of the following:
Fee Payer *
Who will pay the fee?
full
Merchant pays the fee
split
Split fee between merchant and client
client
Client pays the fee
Beneficiary *
The name of the beneficiary (validation regexp: /^[A-Z0-9,.:\'\-\/ \(\)]+$/i)
Customer Number
A reference number of the customer
Address *
The address of the customer (validation regexp: /^[A-Z0-9,.:\'\-\/ \(\)\&]+$/i)
City *
The city of the customer (validation regexp: /^[A-Z0-9,.:\'\-\/ \(\)]+$/i)
State
The state or county of the customer (validation regexp: /^[A-Z0-9,.:\'\-\/ \(\)]+$/i)
Postal Code *
The post code of the customer (validation regexp: /^[A-Z0-9,.:\'\-\/ \(\)]+$/i)
Country *
The country code of the customer
ISO 3166-1 alpha-2 code
Account Type *
One of the following:
iban
IBAN
account_number
Account number
Account Number * (only required if Account Type is account_number)
A national account number
IBAN * (only required if Account Type is iban)
The international IBAN number
National Bank Code Type * (only required if Account Type is account_number and no SWIFT code was submitted)
One of the following:
aba
ABA code - mandatory for USA
bank_code
Bank Code
bsb
BSB code - mandatory for Australia
ncc
NCC code - mandatory for New Zealand
ifsc
IFSC
sort
Sort Code
transit
Transit Number & Institution Number

Important note: For non IBAN transactions you must either specify the SWIFT code or one of the National Bank Code Type.

National Bank Code * (required when National Bank Code Type is used)
The national bank code according to the type
SWIFT *
National Bank Code

The following fields are required but usually our system can automatically find these details when submitting IBAN, SWIFT, BSB or NCC, though we still recommend submitting them in case our system was unable to automatically detect them, as this will result in the transaction being denied. In all other cases they are mandatory and use the same validation conditions as the details of the beneficiary.

Bank Name *
The name of the bank
Branch
The name of the branch
Bank Address *
The address of the bank
Bank City *
The city of the bank
Bank State
The state or county of the bank
Bank Postal Code *
The postal code of the bank
Bank Country *
The country of the bank

Sample code

Sample response

Without errors


  {
    "transaction_ids": [1, 2],
    "errors": []
  }

With errors


  {
    "transaction_ids": [],
    "errors": {
      "line 1": ["Sorry, not enough funds to perform the operation"],
      "line 2": ["The Bank Name field is required.", "The Bank Address field is required.", "The Bank City field is required.", "The Bank Postal Code field is required.", "The Bank Country field is required."]
    }
  }

Note: The line numbers in the errors array corollate to the index+1 of the transaction in the array of transactions in the request body.

PHP


  <?php

  // get cURL resource
  $ch = curl_init();

  // set url
  curl_setopt($ch, CURLOPT_URL, 'https://fixipay.com/api/v1');

  // set method
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

  // return the transfer as a string
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  // set headers
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-FIXIPAY-TOKEN: YOUR_TOKEN_HERE',
    'Content-Type: application/json; charset=utf-8',
  ]);

  // body string
  $body = '[
    {
      "Merchant": "MERCHANT_NAME",
      "Reference": "REFERENCE_NUMBER",
      "Amount": 100,
      "Currency": "EUR",
      "Fee Payer": "full",
      "Customer Number": 1234567,
      "Beneficiary": "BENEFICIARY NAME",
      "Address": "BENEFICIARY ADDRESS",
      "City": "BENEFICIARY CITY",
      "State": "BENEFICIARY STATE",
      "Postal Code": "BENEFICIARY ZIP",
      "Country": "UK",
      "Account Type": "IBAN",
      "Account Number": "",
      "IBAN": "IBAN_NUMBER",
      "National Bank Code Type": "",
      "National Bank Code": "",
      "SWIFT": "SWIFT_CODE",
      "Bank Name": "BANK NAME",
      "Branch": "",
      "Bank Address": "BANK ADDRESS",
      "Bank City": "BANK CITY",
      "Bank State": "",
      "Bank Postal Code": "BANK ZIP",
      "Bank Country": "UK"
    }
  ]';

  // set body
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

  // send the request and save response to $response
  $response = curl_exec($ch);

  // stop if fails
  if (!$response) {
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
  }

  echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
  echo 'Response Body: ' . $response . PHP_EOL;

  // close curl resource to free up system resources
  curl_close($ch);

Elixir


  defmodule SendRequest do
    @moduledoc """
    First, make sure you add HTTPoison to your mix.exs dependencies:

    def deps do
      [{:httpoison, "~> 0.10.0"}]
    end
    """

    @doc """
    # Request Sample
    # POST https://fixipay.com/api/v1
    """
    def request() do
      url = "https://fixipay.com/api/v1"

      # ====== Headers ======
      headers = [
        {"X-FIXIPAY-TOKEN", "YOUR_TOKEN_HERE"},
        {"Content-Type", "application/json; charset=utf-8"},
      ]

      # ====== Query Params ======
      params = [  ]

      # ====== Body ======
      body = "[\r\n  {\r\n    \"Merchant\": \"MERCHANT_NAME\",\r\n    \"Reference\": \"REFERENCE_NUMBER\",\r\n    \"Amount\": 100,\r\n    \"Currency\": \"EUR\",\r\n    \"Fee Payer\": \"full\",\r\n    \"Customer Number\": 1234567,\r\n    \"Beneficiary\": \"BENEFICIARY NAME\",\r\n    \"Address\": \"BENEFICIARY ADDRESS\",\r\n    \"City\": \"BENEFICIARY CITY\",\r\n    \"State\": \"BENEFICIARY STATE\",\r\n    \"Postal Code\": \"BENEFICIARY ZIP\",\r\n    \"Country\": \"UK\",\r\n    \"Account Type\": \"IBAN\",\r\n    \"Account Number\": \"\",\r\n    \"IBAN\": \"IBAN_NUMBER\",\r\n    \"National Bank Code Type\": \"\",\r\n    \"National Bank Code\": \"\",\r\n    \"SWIFT\": \"SWIFT_CODE\",\r\n    \"Bank Name\": \"BANK NAME\",\r\n    \"Branch\": \"\",\r\n    \"Bank Address\": \"BANK ADDRESS\",\r\n    \"Bank City\": \"BANK CITY\",\r\n    \"Bank State\": \"\",\r\n    \"Bank Postal Code\": \"BANK ZIP\",\r\n    \"Bank Country\": \"UK\"\r\n  }\r\n]"

      HTTPoison.start()
      case HTTPoison.post(url, body, headers, params: params) do
        {:ok, response = %HTTPoison.Response{status_code: status_code, body: body}} ->
          IO.puts("Response Status Code: #{status_code}")
          IO.puts("Response Body: #{body}")

          response
        {:error, error = %HTTPoison.Error{reason: reason}} ->
          IO.puts("Request failed: #{reason}")

          error
      end
    end

  end

Ruby


  require 'net/http'
  require 'net/https'

  # Request Sample (POST )
  def send_request
    uri = URI('https://fixipay.com/api/v1')

    # Create client
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    body = "[
    {
      \"Merchant\": \"MERCHANT_NAME\",
      \"Reference\": \"REFERENCE_NUMBER\",
      \"Amount\": 100,
      \"Currency\": \"EUR\",
      \"Fee Payer\": \"full\",
      \"Customer Number\": 1234567,
      \"Beneficiary\": \"BENEFICIARY NAME\",
      \"Address\": \"BENEFICIARY ADDRESS\",
      \"City\": \"BENEFICIARY CITY\",
      \"State\": \"BENEFICIARY STATE\",
      \"Postal Code\": \"BENEFICIARY ZIP\",
      \"Country\": \"UK\",
      \"Account Type\": \"IBAN\",
      \"Account Number\": \"\",
      \"IBAN\": \"IBAN_NUMBER\",
      \"National Bank Code Type\": \"\",
      \"National Bank Code\": \"\",
      \"SWIFT\": \"SWIFT_CODE\",
      \"Bank Name\": \"BANK NAME\",
      \"Branch\": \"\",
      \"Bank Address\": \"BANK ADDRESS\",
      \"Bank City\": \"BANK CITY\",
      \"Bank State\": \"\",
      \"Bank Postal Code\": \"BANK ZIP\",
      \"Bank Country\": \"UK\"
    }
  ]"

    # Create Request
    req =  Net::HTTP::Post.new(uri)
    # Add headers
    req.add_field "X-FIXIPAY-TOKEN", "YOUR_TOKEN_HERE"
    # Add headers
    req.add_field "Content-Type", "application/json; charset=utf-8"
    # Set body
    req.body = body

    # Fetch Request
    res = http.request(req)
    puts "Response HTTP Status Code: #{res.code}"
    puts "Response HTTP Response Body: #{res.body}"
  rescue StandardError => e
    puts "HTTP Request failed (#{e.message})"
  end

Node


  // request Request Sample 
  (function(callback) {
      'use strict';
          
      const httpTransport = require('https');
      const responseEncoding = 'utf8';
      const httpOptions = {
          hostname: 'fixipay.com',
          port: '443',
          path: '/api/v1',
          method: 'POST',
          headers: {"X-FIXIPAY-TOKEN":"YOUR_TOKEN_HERE","Content-Type":"application/json; charset=utf-8"}
      };
      httpOptions.headers['User-Agent'] = 'node ' + process.version;
   

      const request = httpTransport.request(httpOptions, (res) => {
          let responseBufs = [];
          let responseStr = '';
          
          res.on('data', (chunk) => {
              if (Buffer.isBuffer(chunk)) {
                  responseBufs.push(chunk);
              }
              else {
                  responseStr = responseStr + chunk;            
              }
          }).on('end', () => {
              responseStr = responseBufs.length > 0 ? 
                  Buffer.concat(responseBufs).toString(responseEncoding) : responseStr;
              
              callback(null, res.statusCode, res.headers, responseStr);
          });
          
      })
      .setTimeout(0)
      .on('error', (error) => {
          callback(error);
      });
      request.write("[\n  {\n    \"Merchant\": \"MERCHANT_NAME\",\n    \"Reference\": \"REFERENCE_NUMBER\",\n    \"Amount\": 100,\n    \"Currency\": \"EUR\",\n    \"Fee Payer\": \"full\",\n    \"Customer Number\": 1234567,\n    \"Beneficiary\": \"BENEFICIARY NAME\",\n    \"Address\": \"BENEFICIARY ADDRESS\",\n    \"City\": \"BENEFICIARY CITY\",\n    \"State\": \"BENEFICIARY STATE\",\n    \"Postal Code\": \"BENEFICIARY ZIP\",\n    \"Country\": \"UK\",\n    \"Account Type\": \"IBAN\",\n    \"Account Number\": \"\",\n    \"IBAN\": \"IBAN_NUMBER\",\n    \"National Bank Code Type\": \"\",\n    \"National Bank Code\": \"\",\n    \"SWIFT\": \"SWIFT_CODE\",\n    \"Bank Name\": \"BANK NAME\",\n    \"Branch\": \"\",\n    \"Bank Address\": \"BANK ADDRESS\",\n    \"Bank City\": \"BANK CITY\",\n    \"Bank State\": \"\",\n    \"Bank Postal Code\": \"BANK ZIP\",\n    \"Bank Country\": \"UK\"\n  }\n]")
      request.end();
      

  })((error, statusCode, headers, body) => {
      console.log('ERROR:', error); 
      console.log('STATUS:', statusCode);
      console.log('HEADERS:', JSON.stringify(headers));
      console.log('BODY:', body);
  });