Evyoo POS API v1

Customers

List customers

The customers of the company, with their type and price list. The credit limit and the balance are only returned to clients that hold the customers:financial permission.

needs customers:read Catalog and parties

Endpoints#

List: GET/api/v1/customers   One record: GET/api/v1/customers/{id}

Example request#

List with a page size and a sort:

bash
curl "https://votre-entreprise.evyooht.com/api/v1/customers?per_page=5&sort=-name" \
  -H "Authorization: Bearer evy_at_votre_jeton"
powershell
$headers = @{ Authorization = "Bearer evy_at_votre_jeton" }
Invoke-RestMethod -Uri "https://votre-entreprise.evyooht.com/api/v1/customers?per_page=5&sort=-name" -Headers $headers
javascript
const response = await fetch("https://votre-entreprise.evyooht.com/api/v1/customers?per_page=5&sort=-name", {
  headers: { Authorization: "Bearer evy_at_votre_jeton" },
});
const data = await response.json();
console.log(data);
php
$ch = curl_init("https://votre-entreprise.evyooht.com/api/v1/customers?per_page=5&sort=-name");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer evy_at_votre_jeton"],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
python
import requests

response = requests.get(
    "https://votre-entreprise.evyooht.com/api/v1/customers",
    params={"per_page": 5, "sort": "-name"},
    headers={"Authorization": "Bearer evy_at_votre_jeton"},
)
print(response.json())

One record by its identifier:

bash
curl "https://votre-entreprise.evyooht.com/api/v1/customers/58" \
  -H "Authorization: Bearer evy_at_votre_jeton"
powershell
$headers = @{ Authorization = "Bearer evy_at_votre_jeton" }
Invoke-RestMethod -Uri "https://votre-entreprise.evyooht.com/api/v1/customers/58" -Headers $headers
javascript
const response = await fetch("https://votre-entreprise.evyooht.com/api/v1/customers/58", {
  headers: { Authorization: "Bearer evy_at_votre_jeton" },
});
const data = await response.json();
console.log(data);
php
$ch = curl_init("https://votre-entreprise.evyooht.com/api/v1/customers/58");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer evy_at_votre_jeton"],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
python
import requests

response = requests.get(
    "https://votre-entreprise.evyooht.com/api/v1/customers/58",
    headers={"Authorization": "Bearer evy_at_votre_jeton"},
)
print(response.json())

Query parameters of the list#

All filters can be combined: they add up (AND). An unknown parameter or an invalid value is refused with a 400 error, never ignored.

ParameterTypeDescription
pageintegerPage number, starting at 1. A page beyond the data is empty, not an error. At most 10000 pages: filter instead of paging deeper. Default: 1.
per_pageintegerResults per page, from 1 to 100. Default: 25.
sortstringSort fields, separated by commas, with - in front for descending order. Up to 3 fields. Sortable fields: id, name, code, updated_at. Default: name. Default: name.
statusstringactive or inactive. Allowed values: active, inactive.
customer_type_idintegerOnly customers of this type.
price_list_idintegerOnly customers on this price list.
searchstringText contained in the name, the code, the company name, the phone or the e-mail.
updated_sincestringOnly records modified since this date (YYYY-MM-DD) or date and time (YYYY-MM-DDTHH:MM:SS).

Response fields#

The list and the detail route return these fields. A field is null when the value is not recorded. A field marked needs permission is absent (not empty) unless your client holds that permission.

FieldTypeDescription
idintegerUnique identifier. Use it in the detail route.
codestring| nullCustomer code.
namestring| nullFull name, as displayed in the screens.
first_namestring| nullFirst name.
last_namestring| nullLast name.
company_namestring| nullCompany name.
alt_namestring| nullAlternative name.
phonestring| nullMain phone number.
phone2string| nullSecond phone number.
emailstring| nullE-mail address. May contain several addresses.
addressstring| nullStreet address.
citystring| nullCity.
zipstring| nullPostal code.
currencystring| nullPreferred currency.
payment_termstring| nullPayment term.
status"active"| "inactive" | nullactive or inactive.
customer_type_idinteger| nullIdentifier of the customer type (see the customer-types resource).
customer_typestring| nullName of the customer type.
price_list_idinteger| nullIdentifier of the price list applied to this customer.
discount_levelnumber| nullDiscount level granted to this customer.
discount_typestring| nullKind of discount.
credit_limit needs customers:financialnumber| nullCredit limit. Requires customers:financial.
balance needs customers:financialnumber| nullCurrent account balance. Requires customers:financial.
created_atstring(date-time, local) | nullWhen the record was created (local time, no time zone).
updated_atstring(date-time, local) | nullWhen the record was last modified (local time, no time zone). Use it with the updated_since filter to synchronize.

Example response: list#

json
{
  "data": [
    {
      "id": 58,
      "code": "CUS-0058",
      "name": "Marie Dupont",
      "first_name": "Marie",
      "last_name": "Dupont",
      "company_name": "",
      "alt_name": "",
      "phone": "+509 3700 0000",
      "phone2": "",
      "email": "contact@example.com",
      "address": "12 Rue Capois",
      "city": "Port-au-Prince",
      "zip": "HT6110",
      "currency": "USD",
      "payment_term": "Net 30",
      "status": "active",
      "customer_type_id": 2,
      "customer_type": "Wholesale",
      "price_list_id": 1,
      "discount_level": 0,
      "discount_type": "",
      "credit_limit": 5000,
      "balance": 320,
      "created_at": "2026-03-15T14:30:00",
      "updated_at": "2026-03-15T14:30:00"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 25,
    "total": 1,
    "total_pages": 1
  }
}

Example response: one record#

json
{
  "data": {
    "id": 58,
    "code": "CUS-0058",
    "name": "Marie Dupont",
    "first_name": "Marie",
    "last_name": "Dupont",
    "company_name": "",
    "alt_name": "",
    "phone": "+509 3700 0000",
    "phone2": "",
    "email": "contact@example.com",
    "address": "12 Rue Capois",
    "city": "Port-au-Prince",
    "zip": "HT6110",
    "currency": "USD",
    "payment_term": "Net 30",
    "status": "active",
    "customer_type_id": 2,
    "customer_type": "Wholesale",
    "price_list_id": 1,
    "discount_level": 0,
    "discount_type": "",
    "credit_limit": 5000,
    "balance": 320,
    "created_at": "2026-03-15T14:30:00",
    "updated_at": "2026-03-15T14:30:00"
  }
}

Errors#

The error format and the full list of codes are described in Errors.

StatusWhen
400A query parameter is invalid or unknown. Every fault is reported at once in error.details. Nothing is ignored silently.
401The token is missing, malformed, expired or revoked (missing_token or invalid_token). Ask for a new token.
403Your token does not carry the permission this route needs (insufficient_scope), or the request was not made over HTTPS (https_required).
429Too many requests this minute. Wait for the number of seconds in the Retry-After header.