MENU navbar-image

Introduction

REST API for CEMAC POS — the offline-capable, OHADA-compliant point of sale by Opesware SARL. Multi-tenant: a token only ever sees its own shop.

This documentation aims to provide all the information you need to work with our API.

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Obtain a token via POST /api/v1/auth/login (email + password), then send it as Authorization: Bearer <token>.

Endpoints

Issue a Sanctum token for valid credentials.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/auth/login" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"gbailey@example.net\",
    \"password\": \"|]|{+-\",
    \"device_name\": \"architecto\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/login"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "gbailey@example.net",
    "password": "|]|{+-",
    "device_name": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/login

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Le champ value doit être une adresse e-mail valide. Example: gbailey@example.net

password   string     

Example: |]|{+-

device_name   string  optional    

Example: architecto

Public self-signup: creates a shop with a 30-day trial and returns a token.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/auth/register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"shop_name\": \"b\",
    \"business_type\": \"architecto\",
    \"phone\": \"n\",
    \"city\": \"g\",
    \"tax_id\": \"z\",
    \"locale\": \"en\",
    \"owner_name\": \"m\",
    \"owner_email\": \"gulgowski.asia@example.com\",
    \"password\": \"vYgxwmi\\/#\",
    \"referral_code\": \"m\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "shop_name": "b",
    "business_type": "architecto",
    "phone": "n",
    "city": "g",
    "tax_id": "z",
    "locale": "en",
    "owner_name": "m",
    "owner_email": "gulgowski.asia@example.com",
    "password": "vYgxwmi\/#",
    "referral_code": "m"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/register

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

shop_name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: b

business_type   string  optional    

Example: architecto

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

city   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: g

tax_id   string  optional    

Le champ value ne peut pas dépasser 60 caractères. Example: z

locale   string  optional    

Example: en

Must be one of:
  • fr
  • en
owner_name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: m

owner_email   string     

Le champ value doit être une adresse e-mail valide. Example: gulgowski.asia@example.com

password   string     

Le champ value doit contenir au moins 8 caractères. Example: vYgxwmi/#

referral_code   string  optional    

Sales-partner referral. Free text on purpose: an unknown code is ignored, never a signup blocker. Le champ value ne peut pas dépasser 60 caractères. Example: m

POST api/v1/auth/forgot-password

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/auth/forgot-password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"gbailey@example.net\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/forgot-password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "gbailey@example.net"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/forgot-password

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Le champ value doit être une adresse e-mail valide. Example: gbailey@example.net

POST api/v1/auth/reset-password

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/auth/reset-password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"token\": \"architecto\",
    \"email\": \"zbailey@example.net\",
    \"password\": \"-0pBNvYgxw\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/reset-password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "token": "architecto",
    "email": "zbailey@example.net",
    "password": "-0pBNvYgxw"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/auth/reset-password

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

token   string     

Example: architecto

email   string     

Le champ value doit être une adresse e-mail valide. Example: zbailey@example.net

password   string     

Le champ value doit contenir au moins 8 caractères. Example: -0pBNvYgxw

A device with no credentials starts a pairing session.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/device-pairings" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"platform\": \"desktop\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/device-pairings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "platform": "desktop"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/device-pairings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: b

platform   string  optional    

Example: desktop

Must be one of:
  • pwa
  • desktop

Polled by the requesting device until an owner claims the code.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/device-pairings/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/device-pairings/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
access-control-allow-origin: *
 

{
    "message": "No pairing request with this code."
}
 

Request      

GET api/v1/device-pairings/{code}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

Example: architecto

Pull records changed since the client's cursor, per entity, paginated.

requires authentication

Query params:

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/device/sync/pull" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/device/sync/pull"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Identifiants de l'appareil manquants."
}
 

Request      

GET api/v1/device/sync/pull

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/device/sync/push

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/device/sync/push" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/device/sync/push"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/device/sync/push

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Headline totals.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/partner/dashboard" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/partner/dashboard"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/partner/dashboard

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Referred shops with the commission earned on each.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/partner/referrals" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/partner/referrals"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/partner/referrals

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Individual commission lines.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/partner/commissions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/partner/commissions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/partner/commissions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

All partners with referral + commission totals.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/partners" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/partners"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/partners

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a partner (and its cross-tenant login).

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/partners" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\",
    \"password\": \"-0pBNvYgxw\",
    \"phone\": \"a\",
    \"code\": \"y\",
    \"commission_rate\": 18,
    \"commission_months\": 8,
    \"payout_method\": \"m\",
    \"payout_phone\": \"y\",
    \"payout_account\": \"u\",
    \"payout_name\": \"w\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/partners"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net",
    "password": "-0pBNvYgxw",
    "phone": "a",
    "code": "y",
    "commission_rate": 18,
    "commission_months": 8,
    "payout_method": "m",
    "payout_phone": "y",
    "payout_account": "u",
    "payout_name": "w"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/partners

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: b

email   string     

Le champ value doit être une adresse e-mail valide. Example: zbailey@example.net

password   string     

Le champ value doit contenir au moins 8 caractères. Example: -0pBNvYgxw

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: a

code   string  optional    

Le champ value ne peut pas dépasser 60 caractères. Example: y

commission_rate   number  optional    

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 100. Example: 18

commission_months   integer  optional    

Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 120. Example: 8

payout_method   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: m

payout_phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: y

payout_account   string  optional    

Le champ value ne peut pas dépasser 80 caractères. Example: u

payout_name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: w

PUT api/v1/admin/partners/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/admin/partners/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"commission_rate\": 22,
    \"commission_months\": 7,
    \"status\": \"active\",
    \"payout_method\": \"z\",
    \"payout_phone\": \"m\",
    \"payout_account\": \"i\",
    \"payout_name\": \"y\",
    \"notes\": \"v\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/partners/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "commission_rate": 22,
    "commission_months": 7,
    "status": "active",
    "payout_method": "z",
    "payout_phone": "m",
    "payout_account": "i",
    "payout_name": "y",
    "notes": "v"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/admin/partners/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the partner. Example: architecto

Body Parameters

name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: b

commission_rate   number  optional    

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 100. Example: 22

commission_months   integer  optional    

Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 120. Example: 7

status   string  optional    

Example: active

Must be one of:
  • active
  • suspended
payout_method   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: z

payout_phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: m

payout_account   string  optional    

Le champ value ne peut pas dépasser 80 caractères. Example: i

payout_name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: y

notes   string  optional    

Le champ value ne peut pas dépasser 2000 caractères. Example: v

Commission ledger across all partners.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/partner-commissions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/partner-commissions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/partner-commissions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Mark commissions paid out (or payable).

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/partner-commissions/pay" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"ids\": [
        \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
    ],
    \"partner_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
    \"status\": \"paid\",
    \"payout_reference\": \"m\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/partner-commissions/pay"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "ids": [
        "6ff8f7f6-1eb3-3525-be4a-3932c805afed"
    ],
    "partner_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
    "status": "paid",
    "payout_reference": "m"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/partner-commissions/pay

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

ids   string[]  optional    

Le champ value doit être un UUID valide.

partner_id   string  optional    

This field is required when ids is not present. Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

status   string  optional    

Example: paid

Must be one of:
  • pending
  • payable
  • paid
payout_reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: m

GET api/v1/auth/me

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/auth/me" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/auth/me

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/auth/logout

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/auth/logout" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/auth/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/dashboard

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/dashboard" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/dashboard"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/dashboard

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/profile

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"phone\": \"n\",
    \"locale\": \"en\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "phone": "n",
    "locale": "en"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/profile

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: b

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

locale   string  optional    

Example: en

Must be one of:
  • fr
  • en

POST api/v1/profile/password

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/profile/password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_password\": \"architecto\",
    \"password\": \"]|{+-0pBNvYg\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/profile/password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_password": "architecto",
    "password": "]|{+-0pBNvYg"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/profile/password

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

current_password   string     

Example: architecto

password   string     

Le champ value doit contenir au moins 8 caractères. Example: ]|{+-0pBNvYg

Available plans to subscribe to.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/billing/plans" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/billing/plans"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/billing/plans

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Current subscription state + recent charges.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/billing" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/billing"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/billing

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Initiate a Mobile Money charge to start/renew a plan.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/billing/subscribe" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"plan_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"method\": \"orange_money\",
    \"phone\": \"g\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/billing/subscribe"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "plan_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
    "method": "orange_money",
    "phone": "g"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/billing/subscribe

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

plan_id   string     

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

method   string     

Example: orange_money

Must be one of:
  • mtn_momo
  • orange_money
phone   string     

Le champ value ne peut pas dépasser 40 caractères. Example: g

Poll a charge; activates the subscription if the payment succeeded.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/billing/confirm/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/billing/confirm/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/billing/confirm/{reference}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

reference   string     

Example: architecto

GET api/v1/categories

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/categories

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/categories/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/categories/019fbec2-b6a9-701b-b2b5-0b1eb8944664" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/categories/019fbec2-b6a9-701b-b2b5-0b1eb8944664"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/categories/{id}

PATCH api/v1/categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the category. Example: 019fbec2-b6a9-701b-b2b5-0b1eb8944664

DELETE api/v1/categories/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/categories/019fbec2-b6a9-701b-b2b5-0b1eb8944664" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/categories/019fbec2-b6a9-701b-b2b5-0b1eb8944664"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the category. Example: 019fbec2-b6a9-701b-b2b5-0b1eb8944664

POST api/v1/products/barcodes/generate

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products/barcodes/generate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"product_ids\": [
        \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
    ],
    \"category_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
    \"include_variants\": true
}"
const url = new URL(
    "https://cemacpos.com/api/v1/products/barcodes/generate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "product_ids": [
        "6ff8f7f6-1eb3-3525-be4a-3932c805afed"
    ],
    "category_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
    "include_variants": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/products/barcodes/generate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

product_ids   string[]  optional    

Le champ value doit être un UUID valide.

category_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

include_variants   boolean  optional    

Example: true

GET api/v1/products

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/products" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/products

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/products/{id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/products/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

POST api/v1/products

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/products

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/products/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/products/{id}

PATCH api/v1/products/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

DELETE api/v1/products/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/products/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Manual stock adjustment / stocktake: set on-hand to a counted figure.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/adjust" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"new_quantity\": 27,
    \"reason\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/adjust"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "new_quantity": 27,
    "reason": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/products/{product_id}/adjust

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Body Parameters

new_quantity   number     

Le champ value doit être au moins 0. Example: 27

reason   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: n

Per-product stock-movement ledger (purchases, sales, adjustments, returns).

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/movements" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/movements"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/products/{product_id}/movements

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Inventory valuation: on-hand quantity × last cost, per tracked product.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/stock-valuation" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/stock-valuation"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/stock-valuation

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/products/{product_id}/options

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/products/{product_id}/options

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Replace the product's axes wholesale.

requires authentication

Sent as a whole set rather than patched one value at a time: the editor is a small form the shop fills in and saves, and a partial update would make "I removed XXL" indistinguishable from "I did not mention XXL".

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"options\": [
        {
            \"name\": \"b\",
            \"values\": [
                \"n\"
            ]
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "options": [
        {
            "name": "b",
            "values": [
                "n"
            ]
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/products/{product_id}/options

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Body Parameters

options   object[]     

Le champ value doit contenir au moins 1 éléments. Le champ value ne doit pas contenir plus de 4 éléments.

name   string     

Le champ value ne peut pas dépasser 60 caractères. Example: b

values   string[]     

Le champ value ne peut pas dépasser 60 caractères.

DELETE api/v1/products/{product_id}/options/{option_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options/019fbff7-8d4a-7009-b2be-ca7f9ae75978" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/options/019fbff7-8d4a-7009-b2be-ca7f9ae75978"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/products/{product_id}/options/{option_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

option_id   string     

The ID of the option. Example: 019fbff7-8d4a-7009-b2be-ca7f9ae75978

Create every missing combination.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants/generate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"default_price_xaf\": 27
}"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants/generate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "default_price_xaf": 27
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/products/{product_id}/variants/generate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

Body Parameters

default_price_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 27

GET api/v1/products/{product_id}/variants

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/products/{product_id}/variants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

POST api/v1/products/{product_id}/variants

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/products/019fbec2-b6b4-722c-908b-618839613174/variants"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/products/{product_id}/variants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

product_id   string     

The ID of the product. Example: 019fbec2-b6b4-722c-908b-618839613174

PUT api/v1/variants/{variant_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/variants/019fbff7-8d8a-71b2-8e17-66314fb6955e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/variants/019fbff7-8d8a-71b2-8e17-66314fb6955e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/variants/{variant_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

variant_id   string     

The ID of the variant. Example: 019fbff7-8d8a-71b2-8e17-66314fb6955e

DELETE api/v1/variants/{variant_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/variants/019fbff7-8d8a-71b2-8e17-66314fb6955e" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/variants/019fbff7-8d8a-71b2-8e17-66314fb6955e"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/variants/{variant_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

variant_id   string     

The ID of the variant. Example: 019fbff7-8d8a-71b2-8e17-66314fb6955e

Find the customer wearing a given loyalty card — the till's scan-to-lookup.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/customers/find-by-card" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"card_no\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/find-by-card"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "card_no": "b"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/customers/find-by-card

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

card_no   string     

Le champ value ne peut pas dépasser 60 caractères. Example: b

Registers a physical card — one already numbered (bought pre-printed in bulk) rather than one this system minted — against a customer.

requires authentication

Either an existing customer_id, or a name to create one on the spot: a shop handing out cards at a counter is not going to open a separate "new customer" screen first for someone standing right there.

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/loyalty-cards/register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"card_no\": \"b\",
    \"customer_id\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\",
    \"name\": \"z\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/loyalty-cards/register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "card_no": "b",
    "customer_id": "a4855dc5-0acb-33c3-b921-f4291f719ca0",
    "name": "z"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/loyalty-cards/register

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

card_no   string     

Le champ value ne peut pas dépasser 60 caractères. Example: b

customer_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: a4855dc5-0acb-33c3-b921-f4291f719ca0

name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: z

GET api/v1/customers

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/customers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/customers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/customers

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/customers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/customers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/customers/{id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/customers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

PUT api/v1/customers/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/customers/{id}

PATCH api/v1/customers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

DELETE api/v1/customers/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/customers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

GET api/v1/suppliers

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/suppliers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/suppliers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/suppliers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/suppliers

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/suppliers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/suppliers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/suppliers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/suppliers/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/suppliers/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/suppliers/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/suppliers/{id}

PATCH api/v1/suppliers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the supplier. Example: architecto

DELETE api/v1/suppliers/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/suppliers/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/suppliers/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/suppliers/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the supplier. Example: architecto

GET api/v1/purchases

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/purchases" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/purchases"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/purchases

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/purchases/{purchase_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/purchases/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/purchases/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/purchases/{purchase_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

purchase_id   string     

The ID of the purchase. Example: architecto

Receive goods: increases stock, refreshes cost, posts the purchase entry.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/purchases" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"supplier_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"reference\": \"g\",
    \"note\": \"z\",
    \"vat_rate\": 17,
    \"items\": [
        {
            \"product_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
            \"variant_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
            \"name\": \"m\",
            \"quantity\": 4326.41688,
            \"unit_cost_xaf\": 77,
            \"batch_number\": \"i\",
            \"expiry_date\": \"2026-08-04T06:23:16\"
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/purchases"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "supplier_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
    "reference": "g",
    "note": "z",
    "vat_rate": 17,
    "items": [
        {
            "product_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
            "variant_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
            "name": "m",
            "quantity": 4326.41688,
            "unit_cost_xaf": 77,
            "batch_number": "i",
            "expiry_date": "2026-08-04T06:23:16"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/purchases

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

supplier_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: g

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: z

vat_rate   number  optional    

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 100. Example: 17

items   object[]     

Le champ value doit contenir au moins 1 éléments.

product_id   string  optional    

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

variant_id   string  optional    

Le champ value doit être un UUID valide. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

name   string  optional    

Le champ value ne peut pas dépasser 200 caractères. Example: m

quantity   number     

Example: 4326.41688

unit_cost_xaf   integer     

Le champ value doit être au moins 0. Example: 77

batch_number   string  optional    

Le champ value ne peut pas dépasser 80 caractères. Example: i

expiry_date   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:16

Settle (part of) a supplier invoice: Debit 401 / Credit treasury.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/purchases/architecto/pay" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"amount_xaf\": 16,
    \"method\": \"bank\",
    \"reference\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/purchases/architecto/pay"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "amount_xaf": 16,
    "method": "bank",
    "reference": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/purchases/{purchase_id}/pay

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

purchase_id   string     

The ID of the purchase. Example: architecto

Body Parameters

amount_xaf   integer     

Le champ value doit être au moins 1. Example: 16

method   string     

Example: bank

Must be one of:
  • cash
  • mtn_momo
  • orange_money
  • card
  • bank
reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: n

Send goods back to the supplier.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/purchases/architecto/returns" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"items\": [
        {
            \"purchase_item_id\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\",
            \"quantity\": 4326.41688
        }
    ],
    \"reason\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/purchases/architecto/returns"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "items": [
        {
            "purchase_item_id": "a4855dc5-0acb-33c3-b921-f4291f719ca0",
            "quantity": 4326.41688
        }
    ],
    "reason": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/purchases/{purchase_id}/returns

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

purchase_id   string     

The ID of the purchase. Example: architecto

Body Parameters

items   object[]     

Le champ value doit contenir au moins 1 éléments.

purchase_item_id   string     

Le champ value doit être un UUID valide. Example: a4855dc5-0acb-33c3-b921-f4291f719ca0

quantity   number     

Example: 4326.41688

reason   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: b

GET api/v1/reports/payables

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/payables" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/payables"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/payables

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Who owes what, with ageing buckets.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/receivables" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/receivables"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/receivables

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Balance, ceiling, unsettled sales and settlement history.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/statement" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/statement"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/customers/{customer_id}/statement

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

customer_id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

Record a settlement against the balance (allocated oldest sale first).

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/payments" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"amount_xaf\": 16,
    \"method\": \"architecto\",
    \"note\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/payments"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "amount_xaf": 16,
    "method": "architecto",
    "note": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/customers/{customer_id}/payments

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

customer_id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

Body Parameters

amount_xaf   integer     

Le champ value doit être au moins 1. Example: 16

method   string     

Example: architecto

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: n

The shop's loyalty tier ladder (Bronze/Silver/Gold or custom).

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/loyalty/tiers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/loyalty/tiers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/loyalty/tiers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

What the loyalty programme actually costs and does: points issued, redeemed and adjusted, the top holders of unredeemed points (a liability the shop is carrying), and the split by tier. Nothing about loyalty had a reporting screen before this — a shop could see one customer's ledger, never the programme as a whole.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/loyalty/report" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/loyalty/report"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/loyalty/report

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Replace the shop's tier ladder. Read via tenant.settings.loyalty_tiers (LoyaltyService::tiers()) since it was configured months ago; nothing ever wrote to that path — a shop wanting a custom ladder had no way to set one short of a database edit.

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/loyalty/tiers" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"tiers\": [
        {
            \"key\": \"b\",
            \"name\": \"n\",
            \"min_points\": 84,
            \"multiplier\": 6
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/loyalty/tiers"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "tiers": [
        {
            "key": "b",
            "name": "n",
            "min_points": 84,
            "multiplier": 6
        }
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/loyalty/tiers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

tiers   object[]     

Le champ value doit contenir au moins 1 éléments. Le champ value ne doit pas contenir plus de 8 éléments.

key   string     

Le champ value ne peut pas dépasser 40 caractères. Example: b

name   string     

Le champ value ne peut pas dépasser 60 caractères. Example: n

min_points   integer     

Le champ value doit être au moins 0. Example: 84

multiplier   number     

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 10. Example: 6

Print/download data for the customer's loyalty card.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/card" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/card"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/customers/{customer_id}/card

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

customer_id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

A manager correcting a balance outside any sale — a goodwill point, or fixing a mistake.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/points" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"delta\": 16,
    \"reason\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/customers/019fbec2-b6df-70a4-9d78-ce57e285e388/points"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "delta": 16,
    "reason": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/customers/{customer_id}/points

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

customer_id   string     

The ID of the customer. Example: 019fbec2-b6df-70a4-9d78-ce57e285e388

Body Parameters

delta   integer     

Must not be one of 0. Example: 16

reason   string     

Le champ value ne peut pas dépasser 160 caractères. Example: n

GET api/v1/promotions

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/promotions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/promotions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/promotions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/promotions

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/promotions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/promotions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/promotions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/promotions/{promotion_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/promotions/019fbfac-cf48-710f-858f-765b3d797b71" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/promotions/019fbfac-cf48-710f-858f-765b3d797b71"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/promotions/{promotion_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

promotion_id   string     

The ID of the promotion. Example: 019fbfac-cf48-710f-858f-765b3d797b71

DELETE api/v1/promotions/{promotion_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/promotions/019fbfac-cf48-710f-858f-765b3d797b71" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/promotions/019fbfac-cf48-710f-858f-765b3d797b71"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/promotions/{promotion_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

promotion_id   string     

The ID of the promotion. Example: 019fbfac-cf48-710f-858f-765b3d797b71

GET api/v1/quotes

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/quotes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/quotes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/quotes

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/quotes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/quotes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/quotes/{quote_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/quotes/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/quotes/{quote_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

quote_id   string     

The ID of the quote. Example: architecto

PUT api/v1/quotes/{quote_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/quotes/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/quotes/{quote_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

quote_id   string     

The ID of the quote. Example: architecto

Mark sent / declined without converting.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/quotes/architecto/status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"expired\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes/architecto/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "expired"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/quotes/{quote_id}/status

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

quote_id   string     

The ID of the quote. Example: architecto

Body Parameters

status   string     

Example: expired

Must be one of:
  • draft
  • sent
  • declined
  • expired

Accept the quote and raise the real sale.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/quotes/architecto/convert" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"payments\": [
        {
            \"amount_xaf\": 27,
            \"reference\": \"n\"
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes/architecto/convert"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "payments": [
        {
            "amount_xaf": 27,
            "reference": "n"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/quotes/{quote_id}/convert

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

quote_id   string     

The ID of the quote. Example: architecto

Body Parameters

payments   object[]  optional    
method   string  optional    

This field is required when payments is present.

amount_xaf   integer  optional    

This field is required when payments is present. Le champ value doit être au moins 0. Example: 27

reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: n

DELETE api/v1/quotes/{quote_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/quotes/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/quotes/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/quotes/{quote_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

quote_id   string     

The ID of the quote. Example: architecto

GET api/v1/sales

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sales" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sales"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/sales/{sale_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales/{sale_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

POST api/v1/sales

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sales" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"customer_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
    \"device_id\": \"977e5426-8d13-3824-86aa-b092f8ae52c5\",
    \"note\": \"y\",
    \"redeem_points\": 60,
    \"items\": [
        {
            \"product_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
            \"variant_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
            \"name\": \"m\",
            \"quantity\": 4326.41688,
            \"unit_price_xaf\": 77,
            \"discount_xaf\": 8,
            \"vat_rate\": 8
        }
    ],
    \"payments\": [
        {
            \"amount_xaf\": 60,
            \"reference\": \"d\"
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/sales"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
    "customer_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
    "device_id": "977e5426-8d13-3824-86aa-b092f8ae52c5",
    "note": "y",
    "redeem_points": 60,
    "items": [
        {
            "product_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
            "variant_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
            "name": "m",
            "quantity": 4326.41688,
            "unit_price_xaf": 77,
            "discount_xaf": 8,
            "vat_rate": 8
        }
    ],
    "payments": [
        {
            "amount_xaf": 60,
            "reference": "d"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/sales

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

id   string  optional    

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

customer_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

device_id   string  optional    

Le champ value doit être un UUID valide. Example: 977e5426-8d13-3824-86aa-b092f8ae52c5

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: y

redeem_points   integer  optional    

Le champ value doit être au moins 0. Example: 60

items   object[]     

Le champ value doit contenir au moins 1 éléments.

product_id   string  optional    

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

variant_id   string  optional    

Le champ value doit être un UUID valide. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

name   string  optional    

Le champ value ne peut pas dépasser 200 caractères. Example: m

quantity   number     

Example: 4326.41688

unit_price_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 77

discount_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 8

vat_rate   number  optional    

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 100. Example: 8

payments   object[]  optional    
method   string  optional    

This field is required when payments is present.

amount_xaf   integer  optional    

This field is required when payments is present. Le champ value doit être au moins 0. Example: 60

reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: d

POST api/v1/sales/{sale_id}/void

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/void" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"reason\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/void"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "reason": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/sales/{sale_id}/void

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

reason   string     

Le champ value ne peut pas dépasser 255 caractères. Example: b

Partial return / refund of selected items from a completed sale.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/refund" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"method\": \"architecto\",
    \"reason\": \"n\",
    \"items\": [
        {
            \"sale_item_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
            \"quantity\": 4326.41688
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/refund"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "method": "architecto",
    "reason": "n",
    "items": [
        {
            "sale_item_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
            "quantity": 4326.41688
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/sales/{sale_id}/refund

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

method   string     

Example: architecto

reason   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: n

items   object[]     

Le champ value doit contenir au moins 1 éléments.

sale_item_id   string     

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

quantity   number     

Example: 4326.41688

A customer shows their loyalty card after paying. Credits the points that sale would have earned had she been on the ticket, without rewriting the sale itself — see LoyaltyService::attributeToCompletedSale() for why.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/attribute-loyalty" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"card_no\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/attribute-loyalty"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "card_no": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/sales/{sale_id}/attribute-loyalty

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

card_no   string     

Le champ value ne peut pas dépasser 60 caractères. Example: b

Returns the receipt as base64 ESC/POS bytes ready to stream to a thermal printer. ?width=58|80 selects paper (32 or 48 columns); ?locale=fr|en.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales/{sale_id}/receipt

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

The receipt as plain text, for sharing by WhatsApp or any other channel the client can reach. Returned rather than sent: WhatsApp has no server API here, and a share link opened on the cashier's own phone is both free and the way shops in the region actually send these.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt/text" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt/text"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales/{sale_id}/receipt/text

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

E-mail the receipt to the customer (or any address supplied).

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt/email" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"gbailey@example.net\",
    \"locale\": \"fr\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/receipt/email"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "gbailey@example.net",
    "locale": "fr"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/sales/{sale_id}/receipt/email

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

email   string  optional    

Le champ value doit être une adresse e-mail valide. Le champ value ne peut pas dépasser 160 caractères. Example: gbailey@example.net

locale   string  optional    

Example: fr

Must be one of:
  • fr
  • en

A full, self-contained HTML invoice ready for the browser's print dialogue.

requires authentication

No PDF library on purpose: shared hosting in the region rarely has the extensions those need, and the browser already renders @page CSS to PDF for free. ?format=a4|a3 picks the sheet, ?locale=fr|en the language.

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/invoice" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sales/569e3716-b7cf-4f01-8186-92f2d7e82f7c/invoice"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sales/{sale_id}/invoice

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

sale_id   string     

The ID of the sale. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

GET api/v1/expenses

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/expenses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/expenses"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/expenses

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/expenses

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/expenses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"category\": \"transport\",
    \"amount_xaf\": 16,
    \"payment_method\": \"orange_money\",
    \"description\": \"Et animi quos velit et fugiat.\",
    \"spent_at\": \"2026-08-04T06:23:16\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/expenses"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "category": "transport",
    "amount_xaf": 16,
    "payment_method": "orange_money",
    "description": "Et animi quos velit et fugiat.",
    "spent_at": "2026-08-04T06:23:16"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/expenses

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

category   string     

Example: transport

Must be one of:
  • rent
  • utilities
  • salaries
  • transport
  • supplies
  • other
amount_xaf   integer     

Le champ value doit être au moins 1. Example: 16

payment_method   string     

Example: orange_money

Must be one of:
  • cash
  • mtn_momo
  • orange_money
  • card
  • bank
description   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: Et animi quos velit et fugiat.

spent_at   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:16

DELETE api/v1/expenses/{expense_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/expenses/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/expenses/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/expenses/{expense_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

expense_id   string     

The ID of the expense. Example: architecto

The cashier's open shift (with live expected-cash), or null.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/shift" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/shift"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/shift

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/shifts

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/shifts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/shifts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/shifts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/shift/open

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/shift/open" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"opening_float_xaf\": 27
}"
const url = new URL(
    "https://cemacpos.com/api/v1/shift/open"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "opening_float_xaf": 27
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/shift/open

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

opening_float_xaf   integer     

Le champ value doit être au moins 0. Example: 27

POST api/v1/shift/close

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/shift/close" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"counted_cash_xaf\": 27,
    \"note\": \"n\",
    \"counted_by_method\": [
        84
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/shift/close"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "counted_cash_xaf": 27,
    "note": "n",
    "counted_by_method": [
        84
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/shift/close

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

counted_cash_xaf   integer     

Le champ value doit être au moins 0. Example: 27

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: n

counted_by_method   integer[]  optional    

Le champ value doit être au moins 0.

Record cash in or out of the drawer that is not a sale.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/shift/cash" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"direction\": \"out\",
    \"amount_xaf\": 16,
    \"reason\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/shift/cash"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "direction": "out",
    "amount_xaf": 16,
    "reason": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/shift/cash

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

direction   string     

Example: out

Must be one of:
  • in
  • out
amount_xaf   integer     

Le champ value doit être au moins 1. Example: 16

reason   string     

Required, because an unexplained withdrawal is exactly the thing this record exists to stop being unexplained. Le champ value ne peut pas dépasser 160 caractères. Example: n

GET api/v1/reports/z

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/z" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/z"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/z

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/sales-summary

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/sales-summary" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-08-04T06:23:16\",
    \"to\": \"2052-08-27\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/sales-summary"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2026-08-04T06:23:16",
    "to": "2052-08-27"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/sales-summary

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

from   string     

Le champ value doit être une date valide. Example: 2026-08-04T06:23:16

to   string     

Le champ value doit être une date valide. Le champ value doit être une date postérieure ou égale à from. Example: 2052-08-27

Products at or below their reorder level.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/low-stock" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/low-stock"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/low-stock

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/expiring

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/expiring" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"within_days\": 1
}"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/expiring"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "within_days": 1
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/expiring

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

within_days   integer  optional    

Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 3650. Example: 1

GET api/v1/alerts

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/alerts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"dead_days\": 1,
    \"expiring_days\": 22,
    \"limit\": 67
}"
const url = new URL(
    "https://cemacpos.com/api/v1/alerts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "dead_days": 1,
    "expiring_days": 22,
    "limit": 67
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/alerts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

dead_days   integer  optional    

Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 3650. Example: 1

expiring_days   integer  optional    

Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 3650. Example: 22

limit   integer  optional    

Le champ value doit être au moins 1. Example: 67

GET api/v1/reports/margin

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/margin" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-08-04T06:23:17\",
    \"to\": \"2052-08-27\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/margin"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2026-08-04T06:23:17",
    "to": "2052-08-27"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/margin

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

from   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

to   string  optional    

Le champ value doit être une date valide. Le champ value doit être une date postérieure ou égale à from. Example: 2052-08-27

GET api/v1/reports/losses

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/losses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-08-04T06:23:17\",
    \"to\": \"2052-08-27\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/losses"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2026-08-04T06:23:17",
    "to": "2052-08-27"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/losses

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

from   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

to   string  optional    

Le champ value doit être une date valide. Le champ value doit être une date postérieure ou égale à from. Example: 2052-08-27

GET api/v1/stocktakes

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/stocktakes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/stocktakes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/stocktakes

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/stocktakes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/stocktakes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: b

GET api/v1/stocktakes/{stocktake_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/stocktakes/{stocktake_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

stocktake_id   string     

The ID of the stocktake. Example: 019fbfaf-5d33-7199-bdf5-7a88af9cb364

POST api/v1/stocktakes/{stocktake_id}/counts

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/counts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"counts\": [
        {
            \"item_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
            \"counted_quantity\": 84
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/counts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "counts": [
        {
            "item_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
            "counted_quantity": 84
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/stocktakes/{stocktake_id}/counts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

stocktake_id   string     

The ID of the stocktake. Example: 019fbfaf-5d33-7199-bdf5-7a88af9cb364

Body Parameters

counts   object[]     

Le champ value doit contenir au moins 1 éléments.

item_id   string     

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

counted_quantity   number  optional    

Le champ value doit être au moins 0. Example: 84

POST api/v1/stocktakes/{stocktake_id}/commit

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/commit" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/commit"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/stocktakes/{stocktake_id}/commit

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

stocktake_id   string     

The ID of the stocktake. Example: 019fbfaf-5d33-7199-bdf5-7a88af9cb364

POST api/v1/stocktakes/{stocktake_id}/cancel

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/cancel" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/stocktakes/019fbfaf-5d33-7199-bdf5-7a88af9cb364/cancel"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/stocktakes/{stocktake_id}/cancel

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

stocktake_id   string     

The ID of the stocktake. Example: 019fbfaf-5d33-7199-bdf5-7a88af9cb364

GET api/v1/reports/analytics

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/analytics" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-08-04T06:23:17\",
    \"to\": \"2026-08-04T06:23:17\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/analytics"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2026-08-04T06:23:17",
    "to": "2026-08-04T06:23:17"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/analytics

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

from   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

to   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

Period VAT declaration: collected (4431) − deductible (4452).

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/vat-declaration" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/vat-declaration"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/vat-declaration

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/trial-balance

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/trial-balance" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/trial-balance"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/trial-balance

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/income-statement

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/income-statement" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/income-statement"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/income-statement

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

SYSCOHADA journal as CSV for the shop's accountant.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/journal.csv" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/journal.csv"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/journal.csv

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/balance-sheet

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/balance-sheet" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/balance-sheet"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/balance-sheet

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/reports/ledger/{accountCode}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/reports/ledger/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/reports/ledger/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/reports/ledger/{accountCode}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

accountCode   string     

Example: architecto

Close the books through a date: posts drafts, books the stock variation, moves the watermark.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/accounting/close-period" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"through\": \"2026-08-04T06:23:17\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/accounting/close-period"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "through": "2026-08-04T06:23:17"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/accounting/close-period

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

through   string     

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

A manual journal entry — capital, a loan, a fixed asset, an opening balance.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/accounting/journal-entries" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"date\": \"2026-08-04T06:23:17\",
    \"memo\": \"b\",
    \"lines\": [
        {
            \"account_code\": \"bngzmi\",
            \"debit_xaf\": 76,
            \"credit_xaf\": 60
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/accounting/journal-entries"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "date": "2026-08-04T06:23:17",
    "memo": "b",
    "lines": [
        {
            "account_code": "bngzmi",
            "debit_xaf": 76,
            "credit_xaf": 60
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/accounting/journal-entries

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

date   string     

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

memo   string     

Le champ value ne peut pas dépasser 255 caractères. Example: b

lines   object[]     

Le champ value doit contenir au moins 2 éléments.

account_code   string     

Le champ value ne peut pas dépasser 10 caractères. Example: bngzmi

debit_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 76

credit_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 60

GET api/v1/tables

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/tables" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/tables"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/tables

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/tables

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/tables" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/tables"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/tables

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/tables/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/tables/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/tables/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/tables/{id}

PATCH api/v1/tables/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the table. Example: architecto

DELETE api/v1/tables/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/tables/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/tables/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/tables/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the table. Example: architecto

GET api/v1/kitchen

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/kitchen" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/kitchen"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/kitchen

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Open orders (optionally for one table).

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/orders" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/orders"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/orders

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/orders

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/orders" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"table_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"customer_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
    \"guest_count\": 27,
    \"note\": \"i\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/orders"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "table_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
    "customer_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
    "guest_count": 27,
    "note": "i"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/orders

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

table_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

customer_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

guest_count   integer  optional    

Le champ value doit être au moins 1. Example: 27

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: i

GET api/v1/orders/{order_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/orders/{order_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

POST api/v1/orders/{order_id}/items

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"product_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\",
    \"variant_id\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\",
    \"name\": \"m\",
    \"quantity\": 4326.41688,
    \"unit_price_xaf\": 77,
    \"discount_xaf\": 8,
    \"item_note\": \"y\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "product_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed",
    "variant_id": "6b72fe4a-5b40-307c-bc24-f79acf9a1bb9",
    "name": "m",
    "quantity": 4326.41688,
    "unit_price_xaf": 77,
    "discount_xaf": 8,
    "item_note": "y"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/orders/{order_id}/items

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

product_id   string  optional    

Le champ value doit être un UUID valide. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

variant_id   string  optional    

Le champ value doit être un UUID valide. Example: 6b72fe4a-5b40-307c-bc24-f79acf9a1bb9

name   string  optional    

Le champ value ne peut pas dépasser 200 caractères. Example: m

quantity   number     

Example: 4326.41688

unit_price_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 77

discount_xaf   integer  optional    

Le champ value doit être au moins 0. Example: 8

item_note   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: y

PATCH api/v1/orders/{order_id}/items/{item_id}

requires authentication

Example request:
curl --request PATCH \
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items/019fbfad-7fa1-73f6-87f1-bf5771424bc1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"quantity\": 27
}"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items/019fbfad-7fa1-73f6-87f1-bf5771424bc1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "quantity": 27
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/orders/{order_id}/items/{item_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

item_id   string     

The ID of the item. Example: 019fbfad-7fa1-73f6-87f1-bf5771424bc1

Body Parameters

quantity   number     

Le champ value doit être au moins 0. Example: 27

DELETE api/v1/orders/{order_id}/items/{item_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items/019fbfad-7fa1-73f6-87f1-bf5771424bc1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/items/019fbfad-7fa1-73f6-87f1-bf5771424bc1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/orders/{order_id}/items/{item_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

item_id   string     

The ID of the item. Example: 019fbfad-7fa1-73f6-87f1-bf5771424bc1

POST api/v1/orders/{order_id}/fire

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/fire" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/fire"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/orders/{order_id}/fire

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

POST api/v1/orders/{order_id}/close

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/close" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"redeem_points\": 27,
    \"payments\": [
        {
            \"method\": \"architecto\",
            \"amount_xaf\": 39,
            \"reference\": \"g\"
        }
    ]
}"
const url = new URL(
    "https://cemacpos.com/api/v1/orders/569e3716-b7cf-4f01-8186-92f2d7e82f7c/close"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "redeem_points": 27,
    "payments": [
        {
            "method": "architecto",
            "amount_xaf": 39,
            "reference": "g"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/orders/{order_id}/close

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

order_id   string     

The ID of the order. Example: 569e3716-b7cf-4f01-8186-92f2d7e82f7c

Body Parameters

redeem_points   integer  optional    

Le champ value doit être au moins 0. Example: 27

payments   object[]     

Le champ value doit contenir au moins 1 éléments.

method   string     

Example: architecto

amount_xaf   integer     

Le champ value doit être au moins 0. Example: 39

reference   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: g

PATCH api/v1/order-items/{item_id}/status

requires authentication

Example request:
curl --request PATCH \
    "https://cemacpos.com/api/v1/order-items/019fbfad-7fa1-73f6-87f1-bf5771424bc1/status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"served\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/order-items/019fbfad-7fa1-73f6-87f1-bf5771424bc1/status"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "served"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PATCH api/v1/order-items/{item_id}/status

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

item_id   string     

The ID of the item. Example: 019fbfad-7fa1-73f6-87f1-bf5771424bc1

Body Parameters

status   string     

Example: served

Must be one of:
  • pending
  • sent
  • ready
  • served
  • void

Pull records changed since the client's cursor, per entity, paginated.

requires authentication

Query params:

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sync/pull" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sync/pull"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sync/pull

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/sync/push

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sync/push" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sync/push"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/sync/push

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/sync/conflicts

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/sync/conflicts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sync/conflicts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/sync/conflicts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/sync/conflicts/{conflict_id}/resolve

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/sync/conflicts/architecto/resolve" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/sync/conflicts/architecto/resolve"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/sync/conflicts/{conflict_id}/resolve

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

conflict_id   string     

The ID of the conflict. Example: architecto

The signed-in user's own current clock status — the self-service widget.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/attendance/me" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/attendance/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/attendance/me

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/attendance/clock-in

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/attendance/clock-in" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/attendance/clock-in"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/attendance/clock-in

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: b

POST api/v1/attendance/clock-out

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/attendance/clock-out" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"note\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/attendance/clock-out"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "note": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/attendance/clock-out

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: b

Owner/manager roster view — every employee's sessions, filterable.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/attendance" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/attendance"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/attendance

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

A manager's correction — e.g. a forgotten clock-out.

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/attendance/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"clock_in\": \"2026-08-04T06:23:17\",
    \"clock_out\": \"2026-08-04T06:23:17\",
    \"note\": \"b\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/attendance/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "clock_in": "2026-08-04T06:23:17",
    "clock_out": "2026-08-04T06:23:17",
    "note": "b"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/attendance/{attendance_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

attendance_id   string     

The ID of the attendance. Example: architecto

Body Parameters

clock_in   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

clock_out   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

note   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: b

GET api/v1/audit-logs

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/audit-logs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/audit-logs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/audit-logs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/devices

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/devices

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/devices

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/devices" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"platform\": \"pwa\",
    \"priority\": 22
}"
const url = new URL(
    "https://cemacpos.com/api/v1/devices"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "platform": "pwa",
    "priority": 22
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/devices

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Le champ value ne peut pas dépasser 120 caractères. Example: b

platform   string  optional    

Example: pwa

Must be one of:
  • pwa
  • desktop
priority   integer  optional    

Le champ value doit être au moins 1. Example: 22

POST api/v1/devices/{device_id}/regenerate

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445/regenerate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445/regenerate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/devices/{device_id}/regenerate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

device_id   string     

The ID of the device. Example: 019fc952-e363-7110-95bc-46cb53173445

PUT api/v1/devices/{device_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/devices/{device_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

device_id   string     

The ID of the device. Example: 019fc952-e363-7110-95bc-46cb53173445

DELETE api/v1/devices/{device_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/devices/019fc952-e363-7110-95bc-46cb53173445"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/devices/{device_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

device_id   string     

The ID of the device. Example: 019fc952-e363-7110-95bc-46cb53173445

An owner, already signed in, scans or types the code to approve it.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/device-pairings/claim" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"code\": \"bngzmiyv\",
    \"name\": \"d\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/device-pairings/claim"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "code": "bngzmiyv",
    "name": "d"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/device-pairings/claim

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

code   string     

Le champ value doit contenir 8 caractères. Example: bngzmiyv

name   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: d

GET api/v1/settings

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/settings" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/settings

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/settings" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"phone\": \"n\",
    \"email\": \"ashly64@example.com\",
    \"address\": \"v\",
    \"city\": \"d\",
    \"tax_id\": \"l\",
    \"rccm\": \"j\",
    \"vat_rate\": 17,
    \"locale\": \"en\",
    \"loyalty_enabled\": false,
    \"points_per_currency\": 8,
    \"currency_per_point\": 75,
    \"loyalty_points_expiry_months\": 14
}"
const url = new URL(
    "https://cemacpos.com/api/v1/settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "phone": "n",
    "email": "ashly64@example.com",
    "address": "v",
    "city": "d",
    "tax_id": "l",
    "rccm": "j",
    "vat_rate": 17,
    "locale": "en",
    "loyalty_enabled": false,
    "points_per_currency": 8,
    "currency_per_point": 75,
    "loyalty_points_expiry_months": 14
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: b

business_type   string  optional    
phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

email   string  optional    

Le champ value doit être une adresse e-mail valide. Le champ value ne peut pas dépasser 160 caractères. Example: ashly64@example.com

address   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: v

city   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: d

tax_id   string  optional    

Le champ value ne peut pas dépasser 60 caractères. Example: l

rccm   string  optional    

Le champ value ne peut pas dépasser 60 caractères. Example: j

vat_rate   number  optional    

Le champ value doit être au moins 0. Le champ value ne peut pas dépasser 100. Example: 17

locale   string  optional    

Example: en

Must be one of:
  • fr
  • en
loyalty_enabled   boolean  optional    

Example: false

points_per_currency   number  optional    

Le champ value doit être au moins 0. Example: 8

currency_per_point   number  optional    

Le champ value doit être au moins 0. Example: 75

loyalty_points_expiry_months   integer  optional    

Null/absent = expiry off. A shop must opt in; existing balances must not start ageing out the moment this ships. Le champ value doit être au moins 1. Le champ value ne peut pas dépasser 60. Example: 14

GET api/v1/users

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/users

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/users

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"email\": \"zbailey@example.net\",
    \"password\": \"-0pBNvYgxw\",
    \"role\": \"architecto\",
    \"phone\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "email": "zbailey@example.net",
    "password": "-0pBNvYgxw",
    "role": "architecto",
    "phone": "n"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/users

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: b

email   string     

Le champ value doit être une adresse e-mail valide. Example: zbailey@example.net

password   string     

Le champ value doit contenir au moins 8 caractères. Example: -0pBNvYgxw

role   string     

Example: architecto

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

PUT api/v1/users/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/users/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\",
    \"phone\": \"n\",
    \"is_active\": true,
    \"password\": \"|{+-0pBNvYgx\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/users/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b",
    "phone": "n",
    "is_active": true,
    "password": "|{+-0pBNvYgx"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/users/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the user. Example: architecto

Body Parameters

name   string  optional    

Le champ value ne peut pas dépasser 160 caractères. Example: b

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

role   string  optional    
is_active   boolean  optional    

Example: true

password   string  optional    

Le champ value doit contenir au moins 8 caractères. Example: |{+-0pBNvYgx

DELETE api/v1/users/{id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/users/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/users/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/users/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the user. Example: architecto

GET api/v1/employees

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/employees" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/employees"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/employees

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/employees

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/employees" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/employees"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/employees

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/employees/{id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/employees/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/employees/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/employees/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the employee. Example: architecto

PUT api/v1/employees/{id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/employees/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/employees/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/employees/{id}

PATCH api/v1/employees/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the employee. Example: architecto

Soft delete only — a departed employee's payslips and attendance must stay real.

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/employees/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/employees/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/employees/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the employee. Example: architecto

GET api/v1/payroll-runs

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/payroll-runs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/payroll-runs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/payroll-runs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/payroll-runs

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/payroll-runs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"period_start\": \"2026-08-04T06:23:17\",
    \"period_end\": \"2052-08-27\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/payroll-runs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "period_start": "2026-08-04T06:23:17",
    "period_end": "2052-08-27"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/payroll-runs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

period_start   string     

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

period_end   string     

Le champ value doit être une date valide. Le champ value doit être une date postérieure ou égale à period_start. Example: 2052-08-27

GET api/v1/payroll-runs/{payrollRun_id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/payroll-runs/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/payroll-runs/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/payroll-runs/{payrollRun_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payrollRun_id   string     

The ID of the payrollRun. Example: architecto

POST api/v1/payroll-runs/{payrollRun_id}/finalize

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/payroll-runs/architecto/finalize" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/payroll-runs/architecto/finalize"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/payroll-runs/{payrollRun_id}/finalize

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payrollRun_id   string     

The ID of the payrollRun. Example: architecto

POST api/v1/payroll-runs/{payrollRun_id}/pay

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/payroll-runs/architecto/pay" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"payment_method\": \"card\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/payroll-runs/architecto/pay"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "payment_method": "card"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/payroll-runs/{payrollRun_id}/pay

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payrollRun_id   string     

The ID of the payrollRun. Example: architecto

Body Parameters

payment_method   string     

Example: card

Must be one of:
  • cash
  • mtn_momo
  • orange_money
  • card
  • bank

PUT api/v1/payslips/{payslip_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/payslips/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"deductions_xaf\": 27,
    \"notes\": \"n\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/payslips/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "deductions_xaf": 27,
    "notes": "n"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/payslips/{payslip_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payslip_id   string     

The ID of the payslip. Example: architecto

Body Parameters

deductions_xaf   integer     

Le champ value doit être au moins 0. Example: 27

notes   string  optional    

Le champ value ne peut pas dépasser 255 caractères. Example: n

The signed link the client renders as a QR before requesting the sheet — same two-step shape as sale invoices.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/payslips/architecto/verify-url" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/payslips/architecto/verify-url"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/payslips/{payslip_id}/verify-url

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payslip_id   string     

The ID of the payslip. Example: architecto

A full, self-contained HTML payslip ready for the browser's print dialogue. Same no-PDF-library approach as the sale invoice — the browser's own @page CSS does the job.

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/payslips/architecto/print" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/payslips/architecto/print"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/payslips/{payslip_id}/print

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

payslip_id   string     

The ID of the payslip. Example: architecto

GET api/v1/admin/dashboard

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/dashboard" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/dashboard"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/dashboard

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/admin/plans

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/plans" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/plans"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/plans

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/admin/plans

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/plans" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/plans"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/admin/plans

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

PUT api/v1/admin/plans/{plan_id}

requires authentication

Example request:
curl --request PUT \
    "https://cemacpos.com/api/v1/admin/plans/019fbec2-b453-719c-98f8-fa398f0b6949" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/plans/019fbec2-b453-719c-98f8-fa398f0b6949"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());

Request      

PUT api/v1/admin/plans/{plan_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

plan_id   string     

The ID of the plan. Example: 019fbec2-b453-719c-98f8-fa398f0b6949

DELETE api/v1/admin/plans/{plan_id}

requires authentication

Example request:
curl --request DELETE \
    "https://cemacpos.com/api/v1/admin/plans/019fbec2-b453-719c-98f8-fa398f0b6949" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/plans/019fbec2-b453-719c-98f8-fa398f0b6949"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/admin/plans/{plan_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

plan_id   string     

The ID of the plan. Example: 019fbec2-b453-719c-98f8-fa398f0b6949

Opesware onboards a shop directly from the console.

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"shop_name\": \"b\",
    \"business_type\": \"architecto\",
    \"phone\": \"n\",
    \"city\": \"g\",
    \"owner_name\": \"z\",
    \"owner_email\": \"rempel.chadrick@example.org\",
    \"password\": \"NvYgxwmi\\/#iw\\/kX\",
    \"plan_id\": \"7212c28d-f9ab-3dd7-af8a-06584a0d4cb7\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "shop_name": "b",
    "business_type": "architecto",
    "phone": "n",
    "city": "g",
    "owner_name": "z",
    "owner_email": "rempel.chadrick@example.org",
    "password": "NvYgxwmi\/#iw\/kX",
    "plan_id": "7212c28d-f9ab-3dd7-af8a-06584a0d4cb7"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/tenants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

shop_name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: b

business_type   string  optional    

Example: architecto

phone   string  optional    

Le champ value ne peut pas dépasser 40 caractères. Example: n

city   string  optional    

Le champ value ne peut pas dépasser 120 caractères. Example: g

owner_name   string     

Le champ value ne peut pas dépasser 160 caractères. Example: z

owner_email   string     

Le champ value doit être une adresse e-mail valide. Example: rempel.chadrick@example.org

password   string     

Le champ value doit contenir au moins 8 caractères. Example: NvYgxwmi/#iw/kX

plan_id   string  optional    

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 7212c28d-f9ab-3dd7-af8a-06584a0d4cb7

GET api/v1/admin/tenants

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/tenants" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/tenants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/admin/tenants/{id}/users

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/tenants/architecto/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/users"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/tenants/{id}/users

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

POST api/v1/admin/tenants/{id}/users/{user}/password

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants/architecto/users/architecto/password" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"password\": \"|]|{+-\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/users/architecto/password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "password": "|]|{+-"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/tenants/{id}/users/{user}/password

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

user   string     

The user. Example: architecto

Body Parameters

password   string     

Le champ value doit contenir au moins 12 caractères. Example: |]|{+-

POST api/v1/admin/tenants/{id}/users/{user}/active

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants/architecto/users/architecto/active" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"is_active\": true
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/users/architecto/active"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "is_active": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/tenants/{id}/users/{user}/active

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

user   string     

The user. Example: architecto

Body Parameters

is_active   boolean     

Example: true

GET api/v1/admin/tenants/{id}

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/tenants/architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/tenants/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

POST api/v1/admin/tenants/{id}/suspend

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants/architecto/suspend" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/suspend"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/admin/tenants/{id}/suspend

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

POST api/v1/admin/tenants/{id}/activate

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants/architecto/activate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/activate"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Request      

POST api/v1/admin/tenants/{id}/activate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

POST api/v1/admin/tenants/{id}/plan

requires authentication

Example request:
curl --request POST \
    "https://cemacpos.com/api/v1/admin/tenants/architecto/plan" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"plan_id\": \"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/tenants/architecto/plan"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "plan_id": "6ff8f7f6-1eb3-3525-be4a-3932c805afed"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/tenants/{id}/plan

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ID of the tenant. Example: architecto

Body Parameters

plan_id   string     

Le champ value doit être un UUID valide. Must match an existing stored value. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

GET api/v1/admin/billing

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/billing" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/billing"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/billing

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/admin/subscriptions

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/subscriptions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/subscriptions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/subscriptions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/admin/audit-logs

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/audit-logs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/audit-logs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/audit-logs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/admin/analytics

requires authentication

Example request:
curl --request GET \
    --get "https://cemacpos.com/api/v1/admin/analytics" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"from\": \"2026-08-04T06:23:17\",
    \"to\": \"2026-08-04T06:23:17\"
}"
const url = new URL(
    "https://cemacpos.com/api/v1/admin/analytics"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "from": "2026-08-04T06:23:17",
    "to": "2026-08-04T06:23:17"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/analytics

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

from   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17

to   string  optional    

Le champ value doit être une date valide. Example: 2026-08-04T06:23:17