NAV
python javascript php

Introduction

Welcome to Abillio Business 2 Business API Documentation. Abillio PRO can be integrated into your website by REST API

New unified REST endpoints that mirror the dashboard are published under https://abill.io/api with interactive documentation available at https://abill.io/api/docs. They share the authentication flows described in the Authentication section above.

You can fork our POSTMAN collection, fill in your API Key and Secret in Environment, and start testing our API.

Run In Postman

Authentication

To sign requests, you can use following code:

import base64
import hashlib
import hmac
import json
import time
import requests

API_URL = 'https://api.abill.io'
API_KEY = 'my_api_key'
API_SECRET = 'my_api_secret'


def encode_hmac(key, msg, digestmod=hashlib.sha256):
    return hmac.new(key.encode(), msg=msg, digestmod=digestmod).hexdigest()


def abillio_api_request(endpoint, payload=None, method='GET', params=None):
    nonce = str(int(time.time() * 1000))
    request_path = '/v1/%s/' % endpoint
    payload = payload or {}
    payload.update({'request': request_path, 'nonce': nonce})

    # Encode payload to base64 format and create signature using your API_SECRET 
    encoded_payload = json.dumps(payload).encode()
    b64 = base64.b64encode(encoded_payload)
    signature = encode_hmac(API_SECRET, b64)

    # Add your API key, encoded payload and signature to following headers
    request_headers = {
        'X-ABILLIO-KEY': API_KEY,
        'X-ABILLIO-PAYLOAD': b64,
        'X-ABILLIO-SIGNATURE': signature,
    }

    # Make request
    response = requests.request(method, API_URL + request_path, headers=request_headers, params=params)
    return response.json()


services = abillio_api_request('services', params={'lang': 'en'})
print(json.dumps(services, indent=2))
const axios = require('axios');
const Base64 = require('js-base64').Base64;
const crypto = require('crypto');

const API_URL = 'https://api.abill.io';
const API_KEY = 'my_api_key';
const API_SECRET = 'my_api_secret';

function encode_hmac(key, msg) {
    return crypto.createHmac('sha256', key).update(msg).digest('hex');
}

function abillio_api_request(endpoint, payload = {}, method = 'GET', params = {}) {
    const request_path = '/v1/' + endpoint + '/'
    payload.request = request_path;
    payload.nonce = (new Date).getTime();

    // Encode payload to base64 format and create signature using your API_SECRET
    const encoded_payload = JSON.stringify(payload);
    const b64 = Base64.encode(encoded_payload);
    const signature = encode_hmac(API_SECRET, b64);

    // Add your API key, encoded payload and signature to following headers
    let request_headers = {
        'X-ABILLIO-KEY': API_KEY,
        'X-ABILLIO-PAYLOAD': b64,
        'X-ABILLIO-SIGNATURE': signature,
    };

    return axios({
        method: method,
        url: API_URL + request_path,
        headers: request_headers,
        params: params
    });
}

abillio_api_request('services', {'lang': 'en'}).then(function (response) {
    console.log(response);
}).catch(function (error) {
    console.log(error);
});
<?php
function abillio_api_request($endpoint, $payload = [], $method = 'GET', $params = []){
    $API_URL = 'https://api.abill.io';
    $API_KEY = 'your_api_key';
    $API_SECRET = 'your_secret';

    $request_path = '/v1/' . $endpoint . '/';
    $nonce = (string)round(microtime(true) * 1000);
    $payload = $payload ? json_encode($payload) : '';

    // Create signature data object. Keep order of keys as specified: 
    $signature_data = array(
        'path' => $request_path, 
        'nonce' => $nonce,
        'payload' => $payload,
    );

    // Convert signature data to json + base64 format and create signature using your API_SECRET
    $signature_data = json_encode($signature_data, JSON_UNESCAPED_SLASHES);
    $b64 = base64_encode($signature_data);
    $signature = hash_hmac('sha256', $b64, $API_SECRET);

    // Add your API key, nonce and signature to following headers
    $request_headers = [
        'X-ABILLIO-KEY: ' . $API_KEY,
        'X-ABILLIO-NONCE: ' . $nonce,
        'X-ABILLIO-SIGNATURE: ' . $signature,
    ];

    $url = $API_URL . $request_path;
    if(!empty($params)) {
        $url .= '?' . http_build_query($params);
    }

    $result = file_get_contents($url, null, stream_context_create(array(
        'http' => array(
            'method' => $method,
            'header' => implode("\r\n", $request_headers),
            'ignore_errors' => true,
            'content' => $payload)
        )
    ));

    return $result;
}

$response = abillio_api_request('services', [], 'GET', ['lang' => 'en']);
var_dump($response);

You can obtain API Keys by logging in and creating a key in Profile > API Keys. This will give you both an "API Key" that will serve as your user name, and an "API Secret" that you will use to sign messages.

All requests must contain a nonce, a number that will never be repeated and must increase between requests. This is to prevent an attacker who has captured a previous request from simply replaying that request. We recommend using a timestamp at millisecond or higher precision. The nonce need only be increasing with respect to the session that the message is on.

PAYLOAD

The payload of the requests must be a JSON object, which will be described in the documentation below. Rather than being sent as the body of the POST request, it will be base-64 encoded and stored as a header in the request.

The following three headers is all that is required to make requests to Abillio API:

Header Value
X-ABILLIO-KEY Your Abillio API Key
X-ABILLIO-PAYLOAD Base64-encoded JSON payload
X-ABILLIO-SIGNATURE hex(HMAC_SHA256(base64(payload), key=api_secret))

Account

Information about your account.

Account Settings

account = abillio_api_request('account/settings/')
abillio_api_request('account/settings/').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('account/settings');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "<id>",
    "name": "Your Company Name",
    "is_sandbox": true,
    "url": "https://abill.io/dashboard/b2b/<company-slug>/"
  }
}

This endpoint retrieves account settings information.

HTTP Request

GET https://api.abill.io/v1/payout_method/settings/

Freelancers

Freelancers created by PRO account.

List Freelancers

freelancers = abillio_api_request('freelancers')
abillio_api_request('freelancers').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('freelancers');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination": {
    "num_pages": 1,
    "count": 1,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "result": [
    {
      "id": "<FREELANCER_UUID>",
      "email": "roger.elbert@gmail.com",
      "first_name": "Roger",
      "last_name": "Elbert",
      "gender": "male",
      "member_data_is_provided": true,
      "payout_method_is_provided": true,
      "payout_method_is_verified": false,
      "payment_method_status": "pending",
      "payment_method_verified_at": null,
      "payment_method_expires_at": null,
      "payment_method_is_expired": false,
      "payment_method_days_to_expiry": null,
      "needs_payment_action": true,
      "invoice_monthly_limit_applies": true,
      "invoice_monthly_limit_eur": "2500",
      "can_send_invoice": false,
      "country": "PL",
      "language": "en",
      "birth_date": "1990-01-01",
      "personal_code": "123456-12345",
      "tax_number": null,
      "phone": "+37112345678",
      "address": "10 Lutego, Gdynia, Poland",
      "kyc_is_provided": false,
      "kyc_is_pending": false,
      "kyc_is_verified": false,
      "kyc_is_failed": false,
      "kyc_expires_at": null,
      "paid_period": "0",
      "paid_total": "0",
      "payouts_period": "0",
      "payouts_total": "0",
      "payouts_processing": "0",
      "last_payout_at": null,
      "last_invoice_at": null,

      "kyc_setup_script": "<script src='https://app.abill.io/static/widget/abillio-kyc.js' onload='window.abillio_kyc = new AbillioKyc(\"en\",\"https://api.abill.io\", \"<API_KEY>\",\"<FREELANCER_UUID>\", \"abillio-kyc\");'></script>"
    }
  ]
}

This endpoint retrieves all freelancers. Endpoint uses pagination and returns 25 freelancers per page. Freelancers are sorted by creation time in descending order.

List response is intentionally lean: detailed arrays payout_methods and kyc are not included here and are available in Get Freelancer (detail) response.

can_send_invoice Rules

can_send_invoice is true only when all conditions below are met:

Important:

Invoice Limit With Unverified Payout Method

can_send_invoice = true does not mean unlimited invoicing.

In POST /v1/invoices/, if freelancer has no verified payout method for payout selection, monthly turnover cap is applied:

So unverified payout method can still work for invoice creation, but only until monthly cap is reached.

needs_payment_action Rules

needs_payment_action is true when payment method setup is not payout-ready yet.

Exact logic:

This means it is not only card authorization. It also includes:

needs_payment_action = true means payment setup/verification needs attention; it is not a strict "cannot create any invoice" flag.

For card-specific authorization flow, use detail field:

HTTP Request

GET https://api.abill.io/v1/freelancers/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages
email None Filter by email.
period all Paid amount period. Available values: all, year, 30d, 90d.
payment_method_status None Filter by payment method status. Available values: verified, pending, expired, missing, failed.
payment_method_expires_before None Filter freelancers whose payment method expires on or before YYYY-MM-DD.
payment_method_expires_in_days None Filter freelancers whose payment method expires in N days (from today).
needs_payment_action None Boolean filter. true returns freelancers that need payment setup/action.

Example

GET https://api.abill.io/v1/freelancers/?email=@gmail

Full Freelancer Response Shape (detail endpoint runtime)

Detail freelancer response (Get Freelancer / Create Freelancer) includes identity, KYC, payout method, and payout observability fields:

Runtime example (single item):

{
  "id": "<FREELANCER_UUID>",
  "email": "roger.elbert@gmail.com",
  "first_name": "Roger",
  "last_name": "Elbert",
  "gender": null,
  "member_data_is_provided": true,
  "payout_method_is_provided": true,
  "payout_method_is_verified": false,
  "payout_methods": [
    {
      "id": "<PAYOUT_METHOD_UUID>",
      "kind": "sepa",
      "name": "My Savings Account",
      "is_verified": false,
      "currency": "EUR",
      "bank_name": null,
      "iban": "LV00BANK0000000000000",
      "status": "pending",
      "status_display": "Gaida verifikāciju",
      "is_active": true,
      "is_payout_enabled": false,
      "is_charge_enabled": false,
      "needs_authorization": false,
      "authorization_url": null,
      "rejection_reason": null,
      "expires_at": null,
      "is_expired": false,
      "created_at": "2026-03-04T10:00:00+00:00",
      "updated_at": "2026-03-04T10:00:00+00:00"
    },
    {
      "id": "<PAYOUT_METHOD_CARD_UUID_1>",
      "kind": "card",
      "name": "KUKA karte",
      "is_verified": false,
      "currency": "EUR",
      "name_on_card": "ROBERTS KOKS",
      "status": "active",
      "status_display": "Gaida verifikāciju",
      "is_active": true,
      "is_payout_enabled": false,
      "is_charge_enabled": false,
      "needs_authorization": true,
      "authorization_url": "https://api.gateway.example/pay/<SESSION_ID>/select-payment-method/credit-card/<METHOD_ID>/",
      "rejection_reason": null,
      "expires_at": null,
      "is_expired": false,
      "created_at": "2026-03-04T08:16:14+00:00",
      "updated_at": "2026-03-04T08:16:15+00:00"
    },
    {
      "id": "<PAYOUT_METHOD_CARD_UUID_2>",
      "kind": "card",
      "name": "DOLAR CARD",
      "is_verified": false,
      "currency": "USD",
      "name_on_card": "MR DOLAR",
      "status": "active",
      "status_display": "Gaida verifikāciju",
      "is_active": true,
      "is_payout_enabled": false,
      "is_charge_enabled": false,
      "needs_authorization": true,
      "authorization_url": "https://api.gateway.example/pay/<SESSION_ID>/select-payment-method/credit-card/<METHOD_ID>/",
      "rejection_reason": null,
      "expires_at": null,
      "is_expired": false,
      "created_at": "2026-03-04T08:18:31+00:00",
      "updated_at": "2026-03-04T08:18:31+00:00"
    },
    {
      "id": "<PAYOUT_METHOD_SWIFT_UUID>",
      "kind": "swift",
      "name": "SWIFT ACCOUNT",
      "is_verified": false,
      "currency": "BGN",
      "bank_name": "Deutsche Bank AS",
      "bank_address": "Frankfurt, Germany",
      "branch_name": "Main Branch",
      "account_number": "123213232323",
      "bic_swift": "DEUTDEFF",
      "ach": null,
      "wire_routing_number": null,
      "status": "active",
      "status_display": "Gaida verifikāciju",
      "is_active": true,
      "is_payout_enabled": false,
      "is_charge_enabled": false,
      "needs_authorization": false,
      "authorization_url": null,
      "rejection_reason": null,
      "expires_at": null,
      "is_expired": false,
      "created_at": "2026-03-04T08:26:13+00:00",
      "updated_at": "2026-03-04T08:26:13+00:00"
    },
    {
      "id": "<PAYOUT_METHOD_PAYPAL_UUID>",
      "kind": "paypal",
      "name": "PAYPAL ACCOUNT",
      "is_verified": false,
      "currency": "EUR",
      "paypal_email": "paypal@example.com",
      "status": "active",
      "status_display": "Gaida verifikāciju",
      "is_active": true,
      "is_payout_enabled": false,
      "is_charge_enabled": false,
      "needs_authorization": false,
      "authorization_url": null,
      "rejection_reason": null,
      "expires_at": null,
      "is_expired": false,
      "created_at": "2026-03-04T08:26:39+00:00",
      "updated_at": "2026-03-04T08:26:39+00:00"
    }
  ],
  "payment_method_status": "pending",
  "payment_method_verified_at": null,
  "payment_method_expires_at": null,
  "payment_method_is_expired": false,
  "payment_method_days_to_expiry": null,
  "needs_payment_action": true,
  "invoice_monthly_limit_applies": true,
  "invoice_monthly_limit_eur": "2500",
  "invoice_monthly_turnover_eur": "0",
  "invoice_monthly_remaining_eur": "2500",
  "can_send_invoice": false,
  "country": "LV",
  "language": "en",
  "birth_date": "1990-01-01",
  "personal_code": "000000-00000",
  "tax_number": null,
  "phone": "+37100000000",
  "address": "Example Street 1, Riga, LV-1001, Latvia",
  "kyc_is_provided": false,
  "kyc_is_pending": false,
  "kyc_is_verified": false,
  "kyc_is_failed": false,
  "kyc_expires_at": null,
  "kyc": [],
  "paid_period": "0",
  "paid_total": "0",
  "payouts_period": "0",
  "payouts_total": "0",
  "payouts_processing": "0",
  "last_payout_at": null,
  "last_invoice_at": null,
  "is_flagged": false,
  "kyc_setup_script": "<script src='https://app.abill.io/static/widget/abillio-kyc.js' onload='window.abillio_kyc = new AbillioKyc(\"en\",\"https://api.abill.io\", \"<API_KEY>\",\"<FREELANCER_UUID>\", \"abillio-kyc\");'></script>"
}

Get Freelancer

freelancer = abillio_api_request('freelancers/fb18a6be-6068-4ad1-af26-ba670f6b8027')
abillio_api_request('freelancers/fb18a6be-6068-4ad1-af26-ba670f6b8027').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('freelancers/fb18a6be-6068-4ad1-af26-ba670f6b8027');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "82f6e324-81b5-4148-8ea3-5664853b9c42",
    "email": "roger.elbert@gmail.com",
    "first_name": "Roger",
    "last_name": "Elbert",
    "gender": null,
    "member_data_is_provided": true,
    "payout_method_is_provided": true,
    "payout_method_is_verified": false,
    "payout_methods": [
      {
        "id": "95ac8a23-fe24-48dc-af7d-4b07492d6962",
        "kind": "sepa",
        "name": "My Savings Account",
        "is_verified": false,
        "currency": "EUR",
        "bank_name": null,
        "iban": "LV80BANK0000435195001",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-02-13T08:32:51+00:00",
        "updated_at": "2026-02-13T11:36:11+00:00"
      },
      {
        "id": "4224fc29-557e-4389-9bbe-d4461c880039",
        "kind": "swift",
        "name": "SWIFT ACCOUNT",
        "is_verified": false,
        "currency": "BGN",
        "bank_name": "Deutsche Bank AS",
        "bank_address": "Frankfurt, Germany",
        "branch_name": "Main Branch",
        "bic_swift": "DEUTDEFF",
        "account_number": "123213232323",
        "ach": null,
        "wire_routing_number": null,
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:26:13+00:00",
        "updated_at": "2026-03-04T08:26:13+00:00"
      },
      {
        "id": "3a7ca22e-e4e2-498e-9143-603ccf7b38b0",
        "kind": "card",
        "name": "KUKA karte",
        "is_verified": false,
        "currency": "EUR",
        "name_on_card": "ROBERTS KOKS",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": true,
        "authorization_url": "https://api.gateway.example/pay/<SESSION_ID>/select-payment-method/credit-card/<METHOD_ID>/",
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:16:14+00:00",
        "updated_at": "2026-03-04T08:16:15+00:00"
      },
      {
        "id": "06fe3859-8230-4bef-8208-87dbb73feff6",
        "kind": "paypal",
        "name": "PAYPAL ACCOUNT",
        "is_verified": false,
        "currency": "EUR",
        "paypal_email": "paypal@example.com",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:26:39+00:00",
        "updated_at": "2026-03-04T08:26:39+00:00"
      }
    ],
    "can_send_invoice": false,
    "country": "LT",
    "language": "en",
    "birth_date": "1990-01-01",
    "personal_code": "123456-12345",
    "tax_number": "123456-12345",
    "phone": "+371 12345678",
    "address": "Riga, Latvia",
    "kyc_is_provided": false,
    "kyc_is_pending": false,
    "kyc_is_verified": false,
    "is_flagged": false,
    "kyc_setup_script": "<script src='https://app.abill.io/static/widget/abillio-kyc.js' onload='window.abillio_kyc = new AbillioKyc(\"en\",\"https://api.abill.io\", \"<API_KEY_WITH_KYC_WRITE_PERMISSION>\",\"82f6e324-81b5-4148-8ea3-5664853b9c42\", \"<MOUNTING_ELEMENT_ID>\", \"abillio-kyc\", myKycEventHandler);'></script>"
  }
}

This endpoint retrieves a specific freelancer. Response extends list item with detail-only arrays and objects, including full payout_methods and kyc.

HTTP Request

GET https://api.abill.io/v1/freelancers/<ID>/

URL Parameters

Parameter Description
ID The ID of the freelancer to retrieve.

Query Parameters

Parameter Default Description
lang lv Language Available languages

Create Freelancer

This endpoint creates a new user in Abillio and assigns it to your PRO account.

import json

payload = {
    "email": "roger.elbert@gmail.com",
    "first_name": "Roger",
    "last_name": "Elbert",
    "language": "en",
    "gender": "male",
    "country": "LT",
    "birth_date": "1990-01-01",
    "personal_code": "123456-12345",
    "tax_number": "123456-12345",
    "phone": "+371 12345678",
    "address": "Riga, Latvia",
    "payout_method": {
        "kind": "sepa",
        "currency": "EUR",
        "name": "My Savings Account",
        "bank_name": "Swedbank",
        "iban": "LV80BANK0000435195001",
    },
}
freelancer = abillio_api_request('freelancers', payload, 'POST')
print(json.dumps(freelancers, indent=2))
var payload = {
  'email': 'roger.elbert@gmail.com',
  'first_name': 'Roger',
  'last_name': 'Elbert',
  'language': 'en',
  'gender': 'male',
  'country': 'LT',
  'birth_date': '1990-01-01',
  'personal_code': '123456-12345',
  'tax_number': '123456-12345',
  'phone': '+371 12345678',
  'address': 'Riga, Latvia',
  'payout_method': {
    'kind': 'sepa',
    'currency': 'EUR',
    'name': 'My Savings Account',
    'bank_name': 'Swedbank',
    'iban': 'LV80BANK0000435195001',
  },
}
abillio_api_request('freelancers', payload, 'POST').then(function(response) {
  console.log(response)
}).catch(function(error) {
  console.log(error)
})
$payload = array(
     "email"=>"roger.elbert@gmail.com",
    "first_name"=>"Roger",
    "last_name"=>"Elbert",
    "language"=>"en",
    "gender"=>"male",
    "country"=>"LT",
    "birth_date"=>"1990-01-01",
    "personal_code"=>"123456-12345",
    "tax_number"=>"123456-12345",
    "phone"=>"+371 12345678",
    "address"=>"Riga, Latvia",
    "payout_method" => array(
            "kind" => "sepa",
            "currency" => "EUR",
            "name" => "My Savings Account",
            "bank_name" => "Swedbank",
            "iban" => "LV80BANK0000435195001",
    ),
);
$response = abillio_api_request('freelancers', $payload, 'POST');
var_dump($response);

JSON response for Create Freelancer endpoint:

{
  "result": {
    "id": "82f6e324-81b5-4148-8ea3-5664853b9c42",
    "email": "roger.elbert@gmail.com",
    "first_name": "Roger",
    "last_name": "Elbert",
    "gender": null,
    "member_data_is_provided": true,
    "payout_method_is_provided": true,
    "payout_method_is_verified": false,
    "payout_methods": [
      {
        "id": "95ac8a23-fe24-48dc-af7d-4b07492d6962",
        "kind": "sepa",
        "name": "My Savings Account",
        "is_verified": false,
        "currency": "EUR",
        "bank_name": null,
        "iban": "LV80BANK0000435195001",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-02-13T08:32:51+00:00",
        "updated_at": "2026-02-13T11:36:11+00:00"
      },
      {
        "id": "4224fc29-557e-4389-9bbe-d4461c880039",
        "kind": "swift",
        "name": "SWIFT ACCOUNT",
        "is_verified": false,
        "currency": "BGN",
        "bank_name": "Deutsche Bank AS",
        "bank_address": "Frankfurt, Germany",
        "branch_name": "Main Branch",
        "bic_swift": "DEUTDEFF",
        "account_number": "123213232323",
        "ach": null,
        "wire_routing_number": null,
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:26:13+00:00",
        "updated_at": "2026-03-04T08:26:13+00:00"
      },
      {
        "id": "3a7ca22e-e4e2-498e-9143-603ccf7b38b0",
        "kind": "card",
        "name": "KUKA karte",
        "is_verified": false,
        "currency": "EUR",
        "name_on_card": "ROBERTS KOKS",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": true,
        "authorization_url": "https://api.gateway.example/pay/<SESSION_ID>/select-payment-method/credit-card/<METHOD_ID>/",
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:16:14+00:00",
        "updated_at": "2026-03-04T08:16:15+00:00"
      },
      {
        "id": "06fe3859-8230-4bef-8208-87dbb73feff6",
        "kind": "paypal",
        "name": "PAYPAL ACCOUNT",
        "is_verified": false,
        "currency": "EUR",
        "paypal_email": "paypal@example.com",
        "status": "active",
        "status_display": "Gaida verifikāciju",
        "is_active": true,
        "is_payout_enabled": false,
        "is_charge_enabled": false,
        "needs_authorization": false,
        "authorization_url": null,
        "rejection_reason": null,
        "expires_at": null,
        "is_expired": false,
        "created_at": "2026-03-04T08:26:39+00:00",
        "updated_at": "2026-03-04T08:26:39+00:00"
      }
    ],
    "can_send_invoice": false,
    "country": "LT",
    "language": "en",
    "birth_date": "1990-01-01",
    "personal_code": "123456-12345",
    "tax_number": "123456-12345",
    "phone": "+371 12345678",
    "address": "Riga, Latvia",
    "kyc_is_provided": false,
    "kyc_is_pending": false,
    "kyc_is_verified": false,
    "is_flagged": false,
    "kyc_setup_script": "<script src='https://app.abill.io/static/widget/abillio-kyc.js' onload='window.abillio_kyc = new AbillioKyc(\"en\",\"https://api.abill.io\", \"<API_KEY_WITH_KYC_WRITE_PERMISSION>\",\"82f6e324-81b5-4148-8ea3-5664853b9c42\", \"<MOUNTING_ELEMENT_ID>\", \"abillio-kyc\", myKycEventHandler);'></script>"
  }
}

Create endpoint returns the same freelancer response shape as Get Freelancer (including payment_method_status, needs_payment_action, kyc_expires_at, paid_period, paid_total, payouts_period, payouts_total, payouts_processing, last_payout_at, and last_invoice_at).

HTTP Request

POST https://api.abill.io/v1/freelancers/

Payload Parameters

Parameter Description Required
email Real user email address Yes
first_name Freelancer first name Yes
last_name Freelancer last name Yes
language Freelancer UI language Available languages Yes
country Freelancer country Supported countries Yes
birth_date Freelancer birth date in format YYYY-M-D example: 1990-01-01 Yes
personal_code Freelancer personal code Yes
tax_number Freelancer tax number No
phone Freelancer contact phone No
address Freelancer address Yes
payout_method Payout Method Object Yes

Payout Method object parameters

Parameter Description Required
kind Payout method kind, "sepa", "swift", "card", "paypal", "airtm", "crypto" Yes
currency Account currency Available Values If None, account is multicurrency No
name String. User friendly account name. Example "My Savings Account" No
iban IBAN Yes if sepa
bank_name String. Name of the bank Yes if swift
bic_swift BIC/SWIFT. Required for swift accounts Yes if swift
account_number Required for swift accounts Yes if swift
ach For swift accounts No
wire_routing_number For swift accounts No
branch_name For swift accounts No
bank_address For swift accounts No
card_number For card accounts Yes if card
name_on_card For card accounts Yes if card
paypal_email For paypal accounts Yes if paypal
airtm_email For airtm accounts Yes if airtm
crypto_address Crypto wallet address Yes if crypto

Payout method availability depends on site_config.enabled_payout_methods. Not all kinds are available in every country. If a kind is not enabled or is restricted for the freelancer's country, the API returns an error. Use GET /api/meta/payout-methods/ to check which methods are available.

Query Parameters

Parameter Default Description
lang lv Language Available languages

Invites

Our system enables PRO accounts to send out invites to freelancers, inviting them to join your PRO account. When a freelancer accepts your invitation, they can set up an account on Abillio and will automatically be associated with your PRO account. This integration allows you to seamlessly generate invoices for services rendered by these freelancers directly to your company.

List Invites

invites = abillio_api_request('invites')
abillio_api_request('invites').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('invites');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination": {
    "num_pages": 1,
    "count": 3,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "result": [
    {
      "id": "93ff9554-f4b9-4ddb-ae05-79252ed06998",
      "email": "roger.elbert@gmail.com",
      "is_sent": false,
      "is_accepted": true,
      "is_expired": false,
      "expires_at": "2024-01-27T19:07:57.568990+00:00",
      "freelancer_id": "82f6e324-81b5-4148-8ea3-5664853b9c42",
      "accept_url": "https://abillio.dev/accept_invite/93ff9554-f4b9-4ddb-ae05-79252ed06998/"
    },
    {
      "id": "3ae1f3b5-228f-44e1-b191-fd23cbe44257",
      "email": "keanu.reeves+test@gmail.com",
      "is_sent": true,
      "is_accepted": true,
      "is_expired": false,
      "expires_at": "2024-01-23T12:25:26.445747+00:00",
      "freelancer_id": "58e1eb5b-ba81-4afa-bd9e-e6e0acb810ed",
      "accept_url": "https://abillio.dev/accept_invite/3ae1f3b5-228f-44e1-b191-fd23cbe44257/"
    },
    {
      "id": "e8474a4a-e145-4c0c-90b7-912afff69b25",
      "email": "keanu@reeves.com",
      "is_sent": true,
      "is_accepted": true,
      "is_expired": false,
      "expires_at": "2024-01-27T18:30:25.786773+00:00",
      "freelancer_id": "98390d97-fe68-400b-9d9f-34cb1b772d4d",
      "accept_url": "https://abillio.dev/accept_invite/e8474a4a-e145-4c0c-90b7-912afff69b25/"
    }
  ]
}

This endpoint retrieves all invites. Endpoint uses pagination and returns 25 invites per page. Invites are sorted by creation time in descending order.

HTTP Request

GET https://api.abill.io/v1/invites/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages
email None Filter by email.

Example

GET https://api.abill.io/v1/invites/?email=@gmail

Get Freelancer Invite

invite = abillio_api_request('invites/93ff9554-f4b9-4ddb-ae05-79252ed06998')
abillio_api_request('invites/93ff9554-f4b9-4ddb-ae05-79252ed06998').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('invites/93ff9554-f4b9-4ddb-ae05-79252ed06998');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "93ff9554-f4b9-4ddb-ae05-79252ed06998",
    "email": "roger.elbert@gmail.com",
    "is_sent": false,
    "is_accepted": true,
    "is_expired": false,
    "expires_at": "2024-01-27T19:07:57.568990+00:00",
    "freelancer_id": "82f6e324-81b5-4148-8ea3-5664853b9c42",
    "accept_url": "https://abillio.dev/accept_invite/93ff9554-f4b9-4ddb-ae05-79252ed06998/"
  }
}

This endpoint retrieves a specific freelancer invite.

HTTP Request

GET https://api.abill.io/v1/invites/<ID>/

URL Parameters

Parameter Description
ID The ID of the freelancer invite to retrieve.

Query Parameters

Parameter Default Description
lang lv Language Available languages

Create Freelancer Invite

This endpoint creates a new user invite in Abillio user must register or login in Abillio to accept invite to be added to your PRO account.

import json

payload = {
    "email": "roger.elbert@gmail.com",
    "language": "de",
    "message": "Willkommen in unserem Team!",
}
invite = abillio_api_request('invites', payload, 'POST')
print(json.dumps(invites, indent=2))
var payload = {
  "email": "roger.elbert@gmail.com",
  "language": "de",
  "message": "Willkommen in unserem Team!",
}
abillio_api_request('invites', payload, 'POST').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$payload = array(
     "email"=>"roger.elbert@gmail.com",
     "language"=>"de",
     "message"=>"Willkommen in unserem Team!",
);
$response = abillio_api_request('invites', $payload, 'POST');
var_dump($response);

JSON response for Create Freelancer endpoint:

{
  "result": {
    "id": "93ff9554-f4b9-4ddb-ae05-79252ed06998",
    "email": "roger.elbert@gmail.com",
    "is_sent": false,
    "is_accepted": true,
    "is_expired": false,
    "expires_at": "2024-01-27T19:07:57.568990+00:00",
    "freelancer_id": "82f6e324-81b5-4148-8ea3-5664853b9c42",
    "accept_url": "https://abillio.dev/de/accept_invite/93ff9554-f4b9-4ddb-ae05-79252ed06998/"
  }
}

HTTP Request

POST https://api.abill.io/v1/invites/

Payload Parameters

Parameter Description Required
email Real user email address Yes
language Invite language (e.g. en, lv, de). Controls the invite URL language prefix, email notification language, and any custom message display. Available languages. If not provided, falls back to lang query parameter, then defaults to lv. No
message Custom message included in the invite email sent to the freelancer. Max 255 characters. No

Query Parameters

Parameter Default Description
lang lv Language Available languages. Also used as fallback for invite language if language is not specified in payload.

Services

Service items provided by Abillio. Service item IDs are used in invoices. The endpoint returns a flat list of service items (previously returned grouped service groups with nested services).

List Services

services = abillio_api_request('services')
abillio_api_request('services').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('services');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination":{
    "num_pages":1,
    "count":2,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "result":[
    {
      "id":1,
      "name":"Data and text processing",
      "group":"Administrative and client support",
      "vat":null,
      "supports_royalties":false,
      "is_unsuported":false,
      "unsupported":null
    },
    {
      "id":84,
      "name":"Data and text entry",
      "group":"Administrative and client support",
      "vat":null,
      "supports_royalties":false,
      "is_unsuported":false,
      "unsupported":null
    },
    {
      "id":178,
      "name":"Document preparation",
      "group":"Administrative and client support",
      "vat":null,
      "supports_royalties":false,
      "is_unsuported":false,
      "unsupported":null
    }
  ]
}

This endpoint retrieves all service items. Service items are filtered by plan availability based on country if the country parameter is provided. Endpoint uses pagination and returns 25 service items per page. Service items are sorted by group, then by order number, then by ID.

HTTP Request

GET https://api.abill.io/v1/services/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages
country None Filter by supported country (filters service items by plan availability).
group None Filter by service item group name.
name None Filter by service item name.

Example

GET https://api.abill.io/v1/services/?country=LV&group=Learning&name=Dancing

Get Service

service = abillio_api_request('services/1')
abillio_api_request('services/1').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('services/1');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": 1,
    "name": "Data and text processing",
    "group": "Administrative and client support",
    "vat": null,
    "supports_royalties": false,
    "is_unsuported": false,
    "unsupported": null
  }
}

This endpoint retrieves a specific service item.

HTTP Request

GET https://api.abill.io/v1/services/<ID>/

URL Parameters

Parameter Description
ID The ID of the service item to retrieve.

Query Parameters

Parameter Default Description
lang lv Language Available languages
country None Filter by supported country.

Invoices

Invoices created by PRO account or by your freelancers.

List Invoices

invoices = abillio_api_request('invoices')
abillio_api_request('invoices').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('invoices');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination": {
    "num_pages": 1,
    "count": 1,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "result": [
    {
      "id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
      "invoice_nr": "M53Z-J9Z6-8",
      "kind": "advance",
      "status": "approved",
      "created_at": "2023-10-29T21:20:40.665480+00:00",
      "updated_at": "2023-10-29T21:20:40.763379+00:00",
      "sent_at": null,
      "sent_final_invoice_at": null,
      "invoiced_at": "2023-10-29",
      "due_date": "2023-11-12",
      "payment_date": null,
      "paid_at": null,
      "reject_reason": null,
      "client": {
        "id": "5cec5d2a-1ba6-4e36-abf6-18260e4ea2eb",
        "name": "SIA \"PIXELS\"",
        "is_vat_payer": false,
        "reg_nr": "40103564678",
        "vat_nr": null,
        "kind": "legal",
        "currency": "EUR",
        "country": "LV"
      },
      "contact_person": "Mr Accountant",
      "email": "keanu.reeves@my-company.com",
      "accounting_email": "accounting@my-company.com",
      "payout_method": null,
      "currency": "EUR",
      "language": "lv",
      "payment_penalty_percent": "0.01",
      "notes": null,
      "service_group": "Administrative and client support",
      "service_group_id": 29,
      "subtotal": "100.00",
      "total": "120.00",
      "remaining_to_pay": "120.00",
      "total_without_vat": "100.00",
      "vat": "20.00",
      "commission": "5.00",
      "footer": null,
      "discount_kind": "%",
      "discount": "0.00",
      "credit_bill": null,
      "items": [
        {
          "service": "Focus puller services",
          "service_item_id": 1,
          "unit": "gab.",
          "currency": "EUR",
          "description": "My description about service",
          "amount": 1.0,
          "rate": 100.0,
          "subtotal": 100.0,
          "vat": 20.0,
          "total": 120.0
        }
      ],
      "invoice_pdf": "https://abill.io/pdf/invoice/fb18a6be-6068-4ad1-af26-ba670f6b8027/download/",
      "payment_details": [
        {
          "country": "LV",
          "currency": "EUR",
          "name": "AS Citadele - Abillio Services",
          "bank_name": "AS Citadele banka",
          "iban": "LV71PARX0027111580001",
          "bic": "PARXLV22",
          "ach": null,
          "wire_routing_number": null,
          "branch_name": null,
          "bank_address": null
        },
        {
          "country": "LV",
          "currency": "EUR",
          "name": "AS SEB Banka - Abillio Services",
          "bank_name": "AS SEB Banka",
          "iban": "LV86UNLA0055002633556",
          "bic": "UNLALV2X",
          "ach": null,
          "wire_routing_number": null,
          "branch_name": null,
          "bank_address": null
        },
        {
          "country": "LV",
          "currency": "EUR",
          "name": "AS Swedbank - Abillio Services",
          "bank_name": "AS Swedbank",
          "iban": "LV37HABA0551050123907",
          "bic": "HABALV22",
          "ach": null,
          "wire_routing_number": null,
          "branch_name": null,
          "bank_address": null
        }
      ]
    }
  ]
}

This endpoint retrieves all invoices. Endpoint uses pagination and returns 25 invoices per page. Invoices are sorted by creation time in descending order.

HTTP Request

GET https://api.abill.io/v1/invoices/

Query Parameters

Parameter Default Description
lang lv Language Available languages
p None Page number.
status None Filter by status. Available values: draft, sent, pending, approved, overdue, rejected, partial_paid, paid, over_paid, canceled, forbidden.
invoice_nr None Filter by invoice nr.

Example

GET https://api.abill.io/v1/invoices/?status=approved&invoice_nr=M53Z-J9Z6

Get Invoice

invoice = abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027')
abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027');
var_dump($response);

The above command returns JSON structured like this:

{
  "id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
  "invoice_nr": "M53Z-J9Z6-8",
  "kind": "advance",
  "status": "approved",
  "created_at": "2023-10-29T21:20:40.665480+00:00",
  "updated_at": "2023-10-29T21:20:40.763379+00:00",
  "sent_at": null,
  "sent_final_invoice_at": null,
  "invoiced_at": "2023-10-29",
  "due_date": "2023-11-12",
  "payment_date": null,
  "paid_at": null,
  "reject_reason": null,
  "client": {
    "id": "5cec5d2a-1ba6-4e36-abf6-18260e4ea2eb",
    "name": "SIA \"PIXELS\"",
    "is_vat_payer": false,
    "reg_nr": "40103564678",
    "vat_nr": null,
    "kind": "legal",
    "currency": "EUR",
    "country": "LV"
  },
  "contact_person": "Mr Accountant",
  "email": "keanu.reeves@my-company.com",
  "accounting_email": "accounting@my-company.com",
  "payout_method": null,
  "currency": "EUR",
  "language": "lv",
  "payment_penalty_percent": "0.01",
  "notes": null,
  "service_group": "Administrative and client support",
  "service_group_id": 29,
  "subtotal": "100.00",
  "total": "120.00",
  "remaining_to_pay": "120.00",
  "total_without_vat": "100.00",
  "vat": "20.00",
  "commission": "5.00",
  "footer": null,
  "discount_kind": "%",
  "discount": "0.00",
  "credit_bill": null,
  "items": [
    {
      "service": "Focus puller services",
      "service_item_id": 1,
      "unit": "gab.",
      "currency": "EUR",
      "description": "My description about service",
      "amount": 1.0,
      "rate": 100.0,
      "subtotal": 100.0,
      "vat": 20.0,
      "total": 120.0
    }
  ],
  "invoice_pdf": "https://abill.io/pdf/invoice/fb18a6be-6068-4ad1-af26-ba670f6b8027/download/",
  "payment_details": [
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS Citadele - Abillio Services",
      "bank_name": "AS Citadele banka",
      "iban": "LV71PARX0027111580001",
      "bic": "PARXLV22",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    },
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS SEB Banka - Abillio Services",
      "bank_name": "AS SEB Banka",
      "iban": "LV86UNLA0055002633556",
      "bic": "UNLALV2X",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    },
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS Swedbank - Abillio Services",
      "bank_name": "AS Swedbank",
      "iban": "LV37HABA0551050123907",
      "bic": "HABALV22",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    }
  ]
}

This endpoint retrieves a specific invoice.

remaining_to_pay shows current unpaid amount (total - paid transactions, never below 0).

Invoice detail responses include settlement visibility fields so API clients can see payout progress for paid invoices:

HTTP Request

GET https://api.abill.io/v1/invoices/<ID>/

URL Parameters

Parameter Description
ID The ID of the invoice to retrieve.

Query Parameters

Parameter Default Description
lang lv Language Available languages

Pay Invoice From Wallet

payload = {
    "action": "pay_from_wallet",
    "reference_id": "wallet-pay-20260304-001",
    "skip_gap_check": false
}
invoice = abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027/pay-from-wallet/', payload, 'POST')
var payload = {
  "action": "pay_from_wallet",
  "reference_id": "wallet-pay-20260304-001",
  "skip_gap_check": false
};

abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027/pay-from-wallet/', payload, 'POST').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$payload = [
  "action" => "pay_from_wallet",
  "reference_id" => "wallet-pay-20260304-001",
  "skip_gap_check" => false
];
$response = abillio_api_request('invoices/fb18a6be-6068-4ad1-af26-ba670f6b8027/pay-from-wallet/', $payload, 'POST');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
    "status": "paid",
    "invoice_payment_status": "paid",
    "transaction_ids": [
      "9f6b454d-d34e-43d8-a7d7-df3f312c4f91"
    ]
  }
}

Pays invoice remaining amount from PRO wallet.

Rules:

HTTP Request

POST https://api.abill.io/v1/invoices/<ID>/pay-from-wallet/

URL Parameters

Parameter Description
ID The ID of the invoice to pay.

Body Parameters

Parameter Required Description
action Yes Must be pay_from_wallet.
reference_id No Idempotency key for safe retries.
skip_gap_check No Default false. Set true to bypass unverified payout monthly-cap check.

Create Invoice

import json

payload = {
    "freelancer": "keanu.reeves+test@gmail.com",
    "currency": "EUR",
    "payout_method": "__ANY__",
    "items": [
        {
            "service_item_id": 1,
            "description": "My description about service",
            "amount": 1.0,
            "rate": 100.0,
        }
    ],
}
invoice = abillio_api_request('invoices', payload, 'POST')
print(json.dumps(invoice, indent=2))
var payload = {
  "freelancer": "keanu.reeves+test@gmail.com",
  "currency": "EUR",
  "payout_method": "__ANY__",
  "items": [
    {
      "service_item_id": 1,
      "description": "My description about service",
      "amount": 1.0,
      "rate": 100.0,
    }
  ],
}
abillio_api_request('invoices', payload, 'POST').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$payload = array(
    "freelancer" => "keanu.reeves+test@gmail.com",
    "currency" => "EUR",
    "payout_method" => "__ANY__",
    "items" => array(
        array(
            "service_item_id" => 1,
            "description" => "My description about service",
            "amount" => 1.0,
            "rate" => 100.0,
        )
    ),
);
$response = abillio_api_request('invoices', $payload, 'POST');
var_dump($response);

JSON response for Create Invoice endpoint:

{
  "id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
  "invoice_nr": "M53Z-J9Z6-8",
  "kind": "advance",
  "status": "approved",
  "created_at": "2023-10-29T21:20:40.665480+00:00",
  "updated_at": "2023-10-29T21:20:40.763379+00:00",
  "sent_at": null,
  "sent_final_invoice_at": null,
  "invoiced_at": "2023-10-29",
  "due_date": "2023-11-12",
  "payment_date": null,
  "paid_at": null,
  "reject_reason": null,
  "client": {
    "id": "5cec5d2a-1ba6-4e36-abf6-18260e4ea2eb",
    "name": "SIA \"PIXELS\"",
    "is_vat_payer": false,
    "reg_nr": "40103564678",
    "vat_nr": null,
    "kind": "legal",
    "currency": "EUR",
    "country": "LV"
  },
  "contact_person": "Mr Accountant",
  "email": "keanu.reeves@my-company.com",
  "accounting_email": "accounting@my-company.com",
  "payout_method": null,
  "currency": "EUR",
  "language": "lv",
  "payment_penalty_percent": "0.01",
  "notes": null,
  "service_group": "Administrative and client support",
  "service_group_id": 29,
  "subtotal": "100.00",
  "total": "120.00",
  "total_without_vat": "100.00",
  "vat": "20.00",
  "commission": "5.00",
  "footer": null,
  "discount_kind": "%",
  "discount": "0.00",
  "credit_bill": null,
  "items": [
    {
      "service": "Focus puller services",
      "service_item_id": 1,
      "unit": "gab.",
      "currency": "EUR",
      "description": "My description about service",
      "amount": 1.0,
      "rate": 100.0,
      "subtotal": 100.0,
      "vat": 20.0,
      "total": 120.0
    }
  ],
  "invoice_pdf": "https://abill.io/pdf/invoice/fb18a6be-6068-4ad1-af26-ba670f6b8027/download/",
  "payment_details": [
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS Citadele - Abillio Services",
      "bank_name": "AS Citadele banka",
      "iban": "LV71PARX0027111580001",
      "bic": "PARXLV22",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    },
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS SEB Banka - Abillio Services",
      "bank_name": "AS SEB Banka",
      "iban": "LV86UNLA0055002633556",
      "bic": "UNLALV2X",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    },
    {
      "country": "LV",
      "currency": "EUR",
      "name": "AS Swedbank - Abillio Services",
      "bank_name": "AS Swedbank",
      "iban": "LV37HABA0551050123907",
      "bic": "HABALV22",
      "ach": null,
      "wire_routing_number": null,
      "branch_name": null,
      "bank_address": null
    }
  ]
}

This endpoint creates an invoice. Response is identical to Get Invoice endpoint response.

Payout Verification And Monthly Cap

payout_method is required.

If selected payout method set has no verified payout method, invoice creation is capped by monthly turnover:

Tip: use freelancer fields invoice_monthly_limit_applies, invoice_monthly_limit_eur, invoice_monthly_turnover_eur, invoice_monthly_remaining_eur to show this in UI before POST /invoices.

HTTP Request

POST https://api.abill.io/v1/invoices/

Payload Parameters

Parameter Description Required
freelancer Registered freelancer email or id Yes
currency Invoice currency Available Values Yes
language Invoice language, if not provided client language is used No
payout_method Freelancer payout method ID or payout method address (for example IBAN) to enable auto payout. You also can provide __ANY__ so that first verified freelancer payout method is selected Yes
items Array of Items objects Yes
discount Invoice discount amount No
discount_kind Invoice discount kind % or amount No
notes Invoice notes No

Query Parameters

Parameter Default Description
lang lv Language Available languages

Items object parameters

Parameter Description Required
service_item_id Service item ID Get from services endpoint Yes
description Custom description of provided service Yes
amount Amount of units Yes
rate Price per unit Yes

Payouts

Payout visibility for invoices and freelancers linked to your PRO account.

Requires API key permission: payouts:read.

List Payouts

payouts = abillio_api_request('payouts')
abillio_api_request('payouts').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('payouts');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination": {
    "num_pages": 1,
    "count": 1,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "result": [
    {
      "id": "4d86f1ca-c6dd-4f67-8f5f-898f64334a42",
      "created_at": "2026-03-04T12:35:00+00:00",
      "completed_at": null,
      "status": "pending",
      "status_display": "Apstrādē",
      "kind": "profit_share",
      "kind_display": "Peļņas daļas izmaksa avansā",
      "amount": "75.00",
      "currency": "EUR",
      "freelancer_id": "fb14846d-7478-4035-9b9c-a8fcd58e6e0f",
      "freelancer_email": "freelancer@example.com",
      "invoice_id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
      "invoice_nr": "M53Z-J9Z6-8",
      "payout_method_id": "7e6009ee-e7c4-46ce-a1e5-53645edd419b",
      "payout_method_kind": "sepa",
      "payout_method_name": "Primary EUR account",
      "transaction_ids": [
        "9f6b454d-d34e-43d8-a7d7-df3f312c4f91"
      ]
    }
  ]
}

Only payouts linked to invoices created by your PRO account are visible. Payouts without an invoice or linked to invoices from other accounts are not returned.

HTTP Request

GET https://api.abill.io/v1/payouts/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages
status None Filter by payout status. Values: draft, pending, approved, rejected, paid.
currency None Filter by payout currency (for example EUR).
freelancer None Filter by freelancer UUID or exact freelancer email.
invoice_id None Filter by invoice UUID.
invoice_nr None Filter by invoice number (contains).

Example

GET https://api.abill.io/v1/payouts/?status=pending&invoice_nr=M53Z-J9Z6

Get Payout

payout = abillio_api_request('payouts/4d86f1ca-c6dd-4f67-8f5f-898f64334a42')
abillio_api_request('payouts/4d86f1ca-c6dd-4f67-8f5f-898f64334a42').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('payouts/4d86f1ca-c6dd-4f67-8f5f-898f64334a42');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "4d86f1ca-c6dd-4f67-8f5f-898f64334a42",
    "created_at": "2026-03-04T12:35:00+00:00",
    "completed_at": null,
    "status": "pending",
    "status_display": "Apstrādē",
    "kind": "profit_share",
    "kind_display": "Peļņas daļas izmaksa avansā",
    "amount": "75.00",
    "currency": "EUR",
    "freelancer_id": "fb14846d-7478-4035-9b9c-a8fcd58e6e0f",
    "freelancer_email": "freelancer@example.com",
    "invoice_id": "fb18a6be-6068-4ad1-af26-ba670f6b8027",
    "invoice_nr": "M53Z-J9Z6-8",
    "payout_method_id": "7e6009ee-e7c4-46ce-a1e5-53645edd419b",
    "payout_method_kind": "sepa",
    "payout_method_name": "Primary EUR account",
    "transaction_ids": [
      "9f6b454d-d34e-43d8-a7d7-df3f312c4f91"
    ]
  }
}

HTTP Request

GET https://api.abill.io/v1/payouts/<ID>/

URL Parameters

Parameter Description
ID Payout UUID

Wallet

Wallet transactions and balances for your PRO account.

List Wallet Transactions

wallet = abillio_api_request('wallet')
abillio_api_request('wallet').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('wallet');
var_dump($response);

The above command returns JSON structured like this:

{
  "pagination": {
    "num_pages": 1,
    "count": 2,
    "page": 1,
    "next_page": null,
    "previous_page": null,
    "per_page": 25
  },
  "wallet": {
    "deposit_code": "DEP-ABC123",
    "balance_by_currency": {
      "EUR": "60.00",
      "USD": "10.00"
    },
    "totals_all_time": {
      "credited_by_currency": {
        "EUR": "100.00",
        "USD": "10.00"
      },
      "debited_by_currency": {
        "EUR": "40.00",
        "USD": "0.00"
      },
      "net_by_currency": {
        "EUR": "60.00",
        "USD": "10.00"
      }
    },
    "totals_period": {
      "period": "all",
      "date_from": null,
      "date_to": null,
      "credited_by_currency": {
        "EUR": "100.00",
        "USD": "10.00"
      },
      "debited_by_currency": {
        "EUR": "40.00",
        "USD": "0.00"
      },
      "net_by_currency": {
        "EUR": "60.00",
        "USD": "10.00"
      }
    },
    "payouts_processing_total_by_currency": {
      "EUR": "25.00"
    },
    "entry_types": [
      {"id": "deposit", "name": "Deposit"},
      {"id": "invoice_payment", "name": "Invoice Payment"},
      {"id": "refund", "name": "Refund"},
      {"id": "adjustment", "name": "Adjustment"}
    ],
    "currencies": ["EUR", "USD"],
    "companies": [
      {"id": 2, "name": "Kooperatīvā sabiedrība \"Abillio Services\"", "short_name": "\"Abillio Services\""}
    ],
    "deposit_bank_accounts": [
      {
        "id": 12,
        "country": "LV",
        "currency": "EUR",
        "name": "AS Swedbank",
        "bank_name": "AS Swedbank",
        "iban": "LV02HABA0551050123761",
        "account_number": null,
        "bic": "HABALV22",
        "ach": null,
        "wire_routing_number": null,
        "branch_name": null,
        "bank_address": null,
        "company": {
          "id": 2,
          "name": "Kooperatīvā sabiedrība \"Abillio Services\"",
          "short_name": "\"Abillio Services\"",
          "notes": null,
          "address": "Rīga, Vaiņodes iela 10A - 14 LV-1004",
          "reg_nr": "40203284748",
          "vat_nr": "LV40203284748",
          "country": "LV"
        }
      }
    ],
    "deposit_required": {
      "\"Abillio Services\"": {
        "EUR": "100.00"
      }
    },
    "deposit_invoice_currencies": ["EUR"],
    "deposit_invoice_company_currencies": {
      "\"Abillio Services\"": ["EUR"]
    }
  },
  "result": [
    {
      "id": "329f491d-a4a7-4b6d-bd53-cf1ea90d2104",
      "created_at": "2026-03-04T10:00:00+00:00",
      "entry_type": "deposit",
      "entry_type_display": "Deposit",
      "amount": "100.00",
      "currency": "EUR",
      "description": "Initial deposit",
      "batch_id": null,
      "invoice": null,
      "company": {
        "id": 2,
        "name": "Kooperatīvā sabiedrība \"Abillio Services\"",
        "short_name": "\"Abillio Services\""
      },
      "created_by": {
        "id": 10,
        "email": "owner@example.com",
        "first_name": "Owner",
        "last_name": "User",
        "full_name": "Owner User"
      },
      "transaction_id": null,
      "is_credit": true
    }
  ]
}

This endpoint returns paginated wallet transactions and a wallet summary block for the current PRO account.

wallet summary includes:

HTTP Request

GET https://api.abill.io/v1/wallet/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages
search None Search in wallet transaction description and linked invoice_nr.
entry_type None Filter by entry type. Values: deposit, invoice_payment, refund, adjustment.
currency None Filter by wallet currency code (for example EUR).
company None Filter by company ID.
period all Optional period for transaction list and wallet.totals_period. Values: all, month, year, 30d, 90d.
date_from None Optional start date (YYYY-MM-DD). Overrides period start when provided.
date_to None Optional end date (YYYY-MM-DD).

Example

GET https://api.abill.io/v1/wallet/?entry_type=deposit&currency=EUR&period=30d

How To Deposit Funds

There is no direct API endpoint to create a deposit transaction manually. Deposit flow is bank-transfer based.

  1. Call GET /v1/wallet/ and read wallet.deposit_bank_accounts and wallet.deposit_code.
  2. Choose the target bank account from deposit_bank_accounts for the needed company/currency.
  3. Create a bank transfer to that account and include deposit_code in payment purpose/reference.
  4. After bank import/reconciliation, check GET /v1/wallet/?entry_type=deposit for the new credit entry.
  5. Open GET /v1/wallet/<ID>/ to inspect linked bank_transaction details.

Interpretation helpers:

Get Wallet Transaction

wallet_tx = abillio_api_request('wallet/329f491d-a4a7-4b6d-bd53-cf1ea90d2104')
abillio_api_request('wallet/329f491d-a4a7-4b6d-bd53-cf1ea90d2104').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('wallet/329f491d-a4a7-4b6d-bd53-cf1ea90d2104');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "329f491d-a4a7-4b6d-bd53-cf1ea90d2104",
    "created_at": "2026-03-04T10:00:00+00:00",
    "entry_type": "deposit",
    "entry_type_display": "Deposit",
    "amount": "100.00",
    "currency": "EUR",
    "description": "Initial deposit",
    "batch_id": null,
    "invoice": null,
    "company": {
      "id": 2,
      "name": "Kooperatīvā sabiedrība \"Abillio Services\"",
      "short_name": "\"Abillio Services\""
    },
    "created_by": {
      "id": 10,
      "email": "owner@example.com",
      "first_name": "Owner",
      "last_name": "User",
      "full_name": "Owner User"
    },
    "transaction_id": null,
    "bank_transaction": {
      "id": "8a116e66-90a5-4e3e-96d4-c6f68c72fd2d",
      "reference": "DEP-TEST-001",
      "payment_date": "2026-03-04",
      "payout_method": "LV80BANK0000435195001",
      "payee_name": "SIA Demo",
      "payee_iban": "LV80BANK0000435195001",
      "note": "Wallet deposit",
      "amount": "100.00",
      "currency": "EUR",
      "match_status": "matched"
    },
    "is_credit": true
  }
}

HTTP Request

GET https://api.abill.io/v1/wallet/<ID>/

URL Parameters

Parameter Description
ID Wallet transaction UUID

Countries

Following is a endpoint for retrieving all supported countries.

List Countries

countries = abillio_api_request('countries')
abillio_api_request('countries').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('countries');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": [
   {
      "id": "LV",
      "name": "Latvia",
      "flag": "🇱🇻"
    },
    {
      "id": "LT",
      "name": "Lithuania",
      "flag": "🇱🇹"
    },
    {
      "id": "EE",
      "name": "Estonia",
      "flag": "🇪🇪"
    },
    {
      "id": "PL",
      "name": "Poland",
      "flag": "🇵🇱"
    },
    {
      "id": "CH",
      "name": "Switzerland",
      "flag": "🇨🇭"
    },
    ...
  ]
}

This endpoint retrieves all countries.

HTTP Request

GET https://api.abill.io/v1/countries/

Query Parameters

Parameter Default Description
p None Page number.
lang lv Language Available languages

Currencies

Currencies provided by Abillio. ID (code) of currencies are widely used. Abillio uses only currencies that are enabled for invoicing - is_payment_currency parameter.

List Currencies

currencies = abillio_api_request('currencies')
abillio_api_request('currencies').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('currencies');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": [
    {
      "id": "AUD",
      "symbol": "$",
      "title": "Australian Dollar",
      "network": null,
      "kind": "fiat",
      "is_payment_currency": true,
      "rate_eur": "0.6038639620027264",
      "rate_usd": "0.6367722534299786",
      "rate_btc": "0.00002297351751298739",
      "updated_at": "2023-10-06T15:00:06.759940+00:00",
      "rates": {
        "BGN": 1.1772710830661675,
        "BRL": 3.290597508480397,
        "BTC": 0.00002297351751298739,
        "CAD": 0.8730467375448759,
        "CHF": 0.5812266911352602,
        "CNY": 4.650386496887946,
        "CZK": 14.745056534266164,
        "DKK": 4.5023560157972184,
        "EUR": 0.6038639620027264,
        "GBP": 0.5225863569531127,
        "HKD": 4.9858065574639445,
        "HRK": 4.485169923706895,
        "HUF": 233.92722202604858,
        "IDR": 9934.537304550087,
        "ILS": 2.461398852840199,
        "INR": 52.99293918547953,
        "ISK": 87.440308572144,
        "JPY": 94.54331293249852,
        "KRW": 855.3705083730074,
        "MXN": 11.641516086795336,
        "MYR": 3.010226809263672,
        "NOK": 6.982444676377066,
        "NZD": 1.0674341918968147,
        "PHP": 36.10444461080722,
        "PLN": 2.7777029149172683,
        "RON": 3.000668683927412,
        "RUB": 63.13217766132907,
        "SEK": 7.0146332855121765,
        "SGD": 0.8705505415827344,
        "THB": 23.522689066423204,
        "TRY": 17.55918785796862,
        "USD": 0.6367722534299786,
        "ZAR": 12.430254900943929
      }
    },
    {
      "id": "CAD",
      "symbol": "$",
      "title": "Canadian Dollar",
      "network": null,
      "kind": "fiat",
      "is_payment_currency": true,
      "rate_eur": "0.6916742667189531",
      "rate_usd": "0.7293678861004248",
      "rate_btc": "0.00002631418975070222",
      "updated_at": "2023-10-06T15:00:06.784429+00:00",
      "rates": {
        "AUD": 1.1454140505835158,
        "BGN": 1.3484628398896616,
        "BRL": 3.7690966210285564,
        "BTC": 0.000026314189750702224,
        "CHF": 0.6657452186004924,
        "CNY": 5.326618034179309,
        "CZK": 16.889194930996744,
        "DKK": 5.157061841223352,
        "EUR": 0.6916742667189532,
        "GBP": 0.598577755897348,
        "HKD": 5.710812884410632,
        "HRK": 5.137376649868473,
        "HUF": 267.94352692260577,
        "IDR": 11379.158614677759,
        "ILS": 2.8193208301333113,
        "INR": 60.69885712476602,
        "ISK": 100.15535802589199,
        "JPY": 108.29123902159802,
        "KRW": 979.7533987452075,
        "MXN": 13.334356095909408,
        "MYR": 3.447956082773795,
        "NOK": 7.997790239744361,
        "NZD": 1.2226541214718725,
        "PHP": 41.35453814573289,
        "PLN": 3.181619947093027,
        "RON": 3.4370080717164044,
        "RUB": 72.31248333722108,
        "SEK": 8.034659524916458,
        "SGD": 0.9971408220719532,
        "THB": 26.94321856418838,
        "TRY": 20.112540489352728,
        "USD": 0.7293678861004248,
        "ZAR": 14.237788615875784
      }
    },
    {
      "id": "EUR",
      "symbol": "€",
      "title": "Euro",
      "network": null,
      "kind": "fiat",
      "is_payment_currency": true,
      "rate_eur": "1.0000000000000000",
      "rate_usd": "1.0544962003000000",
      "rate_btc": "0.00003804419365711986",
      "updated_at": "2023-10-06T15:00:06.820185+00:00",
      "rates": {
        "AUD": 1.6560021179,
        "BGN": 1.9495634069,
        "BRL": 5.4492364432,
        "BTC": 0.00003804419365711986,
        "CAD": 1.4457672464,
        "CHF": 0.9625126315,
        "CNY": 7.7010498879,
        "CZK": 24.4178448493,
        "DKK": 7.4559110977,
        "GBP": 0.8654041139,
        "HKD": 8.2565062186,
        "HRK": 7.4274508928,
        "HUF": 387.3839751096,
        "IDR": 16451.6148166915,
        "ILS": 4.0760817133,
        "INR": 87.7564195249,
        "ISK": 144.8013361853,
        "JPY": 156.5639264495,
        "KRW": 1416.4953734549,
        "MXN": 19.2783752953,
        "MYR": 4.9849419715,
        "NOK": 11.5629431722,
        "NZD": 1.7676732825,
        "PHP": 59.7890367411,
        "PLN": 4.59988191,
        "RON": 4.9691136957,
        "RUB": 104.5470199148,
        "SEK": 11.6162475771,
        "SGD": 1.4416335406,
        "THB": 38.9536229127,
        "TRY": 29.0780522814,
        "USD": 1.0544962003,
        "ZAR": 20.584528442
      }
    },
    {
      "id": "GBP",
      "symbol": "£",
      "title": "British Pound Sterling",
      "network": null,
      "kind": "fiat",
      "is_payment_currency": true,
      "rate_eur": "1.1555295196060888",
      "rate_usd": "1.2185014877591050",
      "rate_btc": "0.00004396118882041272",
      "updated_at": "2023-10-06T15:00:06.827109+00:00",
      "rates": {
        "AUD": 1.9135593317636526,
        "BGN": 2.252778067016767,
        "BRL": 6.296753569430888,
        "BTC": 0.00004396118882041272,
        "CAD": 1.6706267316948098,
        "CHF": 1.1122117586919873,
        "CNY": 8.89879047742761,
        "CZK": 28.215540528527637,
        "DKK": 8.615525368950987,
        "EUR": 1.1555295196060889,
        "HKD": 9.540636664403543,
        "HRK": 8.582638762054998,
        "HUF": 447.63361866149313,
        "IDR": 19010.32656587594,
        "ILS": 4.710032744044712,
        "INR": 101.40513329595808,
        "ISK": 167.32221844051946,
        "JPY": 180.91423871783377,
        "KRW": 1636.8022184125878,
        "MXN": 22.276731743763897,
        "MYR": 5.760247601591623,
        "NOK": 13.36132216900477,
        "NZD": 2.0425986589477434,
        "PHP": 69.08799690315408,
        "PLN": 5.3152993337070376,
        "RON": 5.741957561660257,
        "RUB": 120.80716769839705,
        "SEK": 13.422916982391754,
        "SGD": 1.665850112617543,
        "THB": 45.012061171228964,
        "TRY": 33.60054778380688,
        "USD": 1.218501487759105,
        "ZAR": 23.78603026190213
      }
    },
    {
      "id": "USD",
      "symbol": "$",
      "title": "US Dollar",
      "network": null,
      "kind": "fiat",
      "is_payment_currency": true,
      "rate_eur": "0.9483201548905572",
      "rate_usd": "1.0000000000000000",
      "rate_btc": "0.00003607807562160625",
      "updated_at": "2023-10-06T15:00:07.008380+00:00",
      "rates": {
        "AUD": 1.5704201849460186,
        "BGN": 1.8488102720003703,
        "BRL": 5.167620747850693,
        "BTC": 0.000036078075621606256,
        "CAD": 1.3710502190417424,
        "CHF": 0.9127701277881978,
        "CNY": 7.303060822513236,
        "CZK": 23.155934409581768,
        "DKK": 7.070590767021088,
        "EUR": 0.9483201548905571,
        "GBP": 0.8206801633365735,
        "HKD": 7.8298112560776,
        "HRK": 7.0436013811021025,
        "HUF": 367.3640312780556,
        "IDR": 15601.39791116467,
        "ILS": 3.8654304417032233,
        "INR": 83.22118135649387,
        "ISK": 137.3180255596033,
        "JPY": 148.47272698086363,
        "KRW": 1343.2911119565083,
        "MXN": 18.282071846077184,
        "MYR": 4.727320942533319,
        "NOK": 10.965372060051415,
        "NZD": 1.6763202010562996,
        "PHP": 56.69914858307716,
        "PLN": 4.362160725369471,
        "RON": 4.712310669575013,
        "RUB": 99.1440461189493,
        "SEK": 11.015921701562531,
        "SGD": 1.3671301425172144,
        "THB": 36.94050571412002,
        "TRY": 27.57530304341297,
        "ZAR": 19.52072320046652
      }
    }
}

This endpoint retrieves all currencies. Currencies are sorted by is_payment_currency then by id.

HTTP Request

GET https://api.abill.io/v1/currencies/

Query Parameters

Parameter Default Description
lang lv Language Available languages
is_payment_currency None Abillio enabled currencies
kind None Filter by currency kind. fiat or crypto

Example

GET https://api.abill.io/v1/currencies/?is_payment_currency

Get Currencies

service = abillio_api_request('currencies/EUR')
abillio_api_request('currencies/EUR').then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
$response = abillio_api_request('currencies/EUR');
var_dump($response);

The above command returns JSON structured like this:

{
  "result": {
    "id": "EUR",
    "symbol": "€",
    "title": "Euro",
    "network": null,
    "kind": "fiat",
    "is_payment_currency": true,
    "rate_eur": "1.0000000000000000",
    "rate_usd": "1.0544962003000000",
    "rate_btc": "0.00003804419365711986",
    "updated_at": "2023-10-06T15:00:06.820185+00:00",
    "rates": {
      "AUD": 1.6560021179,
      "BGN": 1.9495634069,
      "BRL": 5.4492364432,
      "BTC": 0.00003804419365711986,
      "CAD": 1.4457672464,
      "CHF": 0.9625126315,
      "CNY": 7.7010498879,
      "CZK": 24.4178448493,
      "DKK": 7.4559110977,
      "GBP": 0.8654041139,
      "HKD": 8.2565062186,
      "HRK": 7.4274508928,
      "HUF": 387.3839751096,
      "IDR": 16451.6148166915,
      "ILS": 4.0760817133,
      "INR": 87.7564195249,
      "ISK": 144.8013361853,
      "JPY": 156.5639264495,
      "KRW": 1416.4953734549,
      "MXN": 19.2783752953,
      "MYR": 4.9849419715,
      "NOK": 11.5629431722,
      "NZD": 1.7676732825,
      "PHP": 59.7890367411,
      "PLN": 4.59988191,
      "RON": 4.9691136957,
      "RUB": 104.5470199148,
      "SEK": 11.6162475771,
      "SGD": 1.4416335406,
      "THB": 38.9536229127,
      "TRY": 29.0780522814,
      "USD": 1.0544962003,
      "ZAR": 20.584528442
    }
  }
}

This endpoint retrieves a specific service.

HTTP Request

GET https://api.abill.io/v1/currencies/<ID>/

URL Parameters

Parameter Description
ID The ID of the currency to retrieve.

Query Parameters

Parameter Default Description
lang lv Language Available languages

Errors

Error payload

Example of validation error response

{
  "errors": [
    {
      "field": "vat_nr",
      "message": "PVN Nr. nav pareizs!"
    }
  ]
}

All API errors return a non-2xx HTTP status and a JSON object with an errors array. Each entry contains:

  1. field – the field that failed validation. null for non field-specific issues.
  2. message – a localized, human readable description of the problem.

Validation failures and schema issues always use status 400. Authentication and authorization errors use the appropriate 401/403 status codes, and missing resources return 404.

HTTP error codes

Error Code Meaning
400 Bad Request – Your request is invalid.
401 Unauthorized – Bearer token or session is missing/invalid.
403 Forbidden – Not enough permissions.
404 Not Found – The specified resource could not be found.
405 Method Not Allowed – You tried to access endpoint with an invalid method.
409 Conflict – The request conflicts with the current resource state.
415 Unsupported Media Type – File uploads use an unsupported format.
422 Legacy validation status code (deprecated; use 400).
500 Internal Server Error – We had a problem with our server.
503 Service Unavailable – We're temporarily offline for maintenance.

Supported Languages

Following is a support list of languages. Across majority of API endpoints language parameter is widely used. Here are all the possible values:

Currency Title
LV Latvian
EN English

Callbacks

Callbacks are POST (as JSON encoded request body) requests made by Abillio to URL endpoint specified in API Key that was used for related invoice creation.

Callback expects HTTP 200 OK success status response code. For any other status code or timeout, it will try to reach endpoint again with exponential time increase between retries. If after 72 hours endpoint will be still unreachable callback sender will stop trying.

You can view the history of callbacks in Abillio app under every instance that has callbacks.

🔍 Verifying callbacks

You can enable a Notification channel to receive callbacks for the desired event by navigating to Profile > Notification channels > New channel.

Choose the Channel type as Webhook, provide the Webhook URL, and enable the desired events.

When the event that triggers the webhook occurs in our system, we will send a POST request to the URL you specify. This request will contain a JSON-formatted message with all relevant information about the event. For example:

{
  "signature":"0b56d87702aae2f4565a89fc7b5885d731eb12fa9ce88f66969eb551f6eebd94",
  "event_type":"invoice_paid",
  "id":"ecbcb376-1722-4773-8ca2-f1a76b9b0cea",
  "invoice": {
    "id":"6776294e-4384-432b-897a-c33925c895b4",
    ...
  }
}

To ensure requests are properly signed, you can utilize the following code snippets in your preferred programming language.

import hashlib
import hmac
import json

# You will find your callback token for channel under Profile > Notification channels
CALLBACK_TOKEN = 'your_callback_token'


# You can reuse same method used in API auth signature generation
def encode_hmac(key, msg, digestmod=hashlib.sha256):
    return hmac.new(key.encode(), msg=msg, digestmod=digestmod).hexdigest()


# Decode request json body
payload = json.loads(request.body)

# Get signature and callback_id fields from provided data
signature = payload['signature']
event_type = payload['event_type']
callback_id = payload['id']

# Compare signatures
is_valid = signature == encode_hmac(CALLBACK_TOKEN, callback_id.encode())
assert is_valid, 'Failed to verify Abillio callback signature.'

# Debug callback data
print(json.dumps(payload, indent=2))
const Base64 = require('js-base64').Base64;
const crypto = require('crypto');

// You will find your callback token for channel under Profile > Notification channels
const CALLBACK_TOKEN = 'your_callback_token';

// You can reuse same method used in API auth signature generation
function encode_hmac(key, msg) {
  return crypto.createHmac('sha256', key).update(msg).digest('hex');
}

// Decode request json body
var payload = JSON.parse(request.body);

// Get signature and callback_id fields from provided data
const signature = payload['signature'];
const event_type = payload['event_type'];
const callback_id = payload['id'];

// Compare signatures
const is_valid = signature === encode_hmac(CALLBACK_TOKEN, callback_id);
if (!is_valid) {
  throw new Error('Failed to verify Abillio callback signature.');
}

// Debug callback data
console.log(payload);
<?php

// You will find your callback token for the channel under Profile > Notification channels
$CALLBACK_TOKEN = 'your_callback_token';

// Function to calculate HMAC SHA256
function encode_hmac($key, $msg) {
    return hash_hmac('sha256', $msg, $key);
}

// Retrieve JSON body from the request
$body = file_get_contents('php://input');

// Decode JSON body
$payload = json_decode($body, true);

// Get signature, event_type, and callback_id fields from the provided data
$signature = $payload['signature'];
$event_type = $payload['event_type'];
$callback_id = $payload['id'];

// Calculate signature using HMAC SHA256
$calculated_signature = encode_hmac($CALLBACK_TOKEN, $callback_id);

// Compare signatures
$is_valid = ($signature === $calculated_signature);

// Verify if the signature is valid
if (!$is_valid) {
    throw new Exception('Failed to verify Abillio callback signature.');
}

// Debug callback data
print_r($payload);

?>

To verify callback and make sure it really comes from Abillio, you must use Callback Token which you can find in Abillio app under PRO Profile > API Keys.

Always verify if signature provided in callback POST data matches the one you generate on your own by signing callback_id value with callback_token using following hashing algorithm:

signature = hex(HMAC_SHA256(<callback_id>, key=<callback_token>))

Callbacks Response

All callbacks have these fields in common:

Key Meaning
id Unique callback ID. If callback fails to reach endpoint, it will retry with the same ID.
event_type Event type identifying specific event.
signature Abillio signature for verification.