geCloud
Open geCloud

geCloud API

Integrate geCloud's invoicing, accounting and customer management into your own tools. This REST/JSON API covers businesses, customers, invoices, estimates, expenses, payments and products.

Base URL: https://app.gecloud.me/api/v1/ Format: JSON Auth: api_token

Introduction

All requests are made against https://app.gecloud.me/api/v1/ followed by the endpoint path. All responses are application/json, including errors.

Versioned API β€” use /v1/

/api/v1/… is the recommended path for any new integration: it's stable, and future breaking changes will ship under a new prefix (/api/v2/…) without ever changing v1's behavior. The legacy unprefixed paths (/api/…, no /v1/) remain available so existing integrations don't break, but are considered historical β€” don't use them for new code.

Authentication

The API uses a static per-user token: api_token. It is generated automatically on signup or on first login, and stays valid until manually revoked (no automatic expiry).

How to send the token

Request methodWhere to put the token
GETQuery parameter ?api_token=xxxx
POSTForm field api_token (some endpoints also accept it in the JSON body or the Authorization header β€” noted on each page)

Single token, no expiry, no scope

The api_token grants full access to the account, with no scoping and no expiry. Treat it like a password: never expose it client-side (browser, compiled mobile app), and regenerate it if you suspect a leak.

Errors & conventions

The API always responds with HTTP 200, even on a business-logic error β€” the real status is in the JSON body under st or status depending on the endpoint (see each page). A value of 0 always means failure; the error message is in msg, message or error depending on the endpoint.

No single status-code convention

These endpoints were built at different times and don't all share the same key or code scale. Always refer to the "Responses" section of each endpoint rather than assuming a global convention.

Authentication

Create an account, log in, and create the first associated business.

POST/api/v1/register

Creates a new user account (free trial or standard, depending on configuration) and automatically generates its api_token.

No authentication required

Parameters (form-data)

FieldTypeDescription
emailrequiredstringValid, unique email.
passwordrequiredstring4 to 46 characters.
phonerequiredstring10 to 20 characters.
namestringUser's full name.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/register \
  -d "email=jean@example.com" \
  -d "password=MyPassword123" \
  -d "phone=+22997001122" \
  -d "name=Jean Dupont"

Response β€” success

200 OK
{
  "st": 1,
  "msg": "Registration successful",
  "user": {
    "id": 482,
    "name": "Jean Dupont",
    "email": "jean@example.com",
    "role": "user",
    "token": "9f3c1a...e02b"
  }
}

Possible responses

  • st: 0 Invalid fields β€” details in msg.
  • st: 2 This email already exists.
  • st: 1 Account created β€” token returned in user.token.
POST/api/v1/login

Authenticates a user by email and password, and returns (or generates, if missing) their api_token.

No authentication requiredAccepts JSON or form-data

Request body

FieldTypeDescription
emailrequiredstringAccount email.
passwordrequiredstringAccount password.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/login \
  -H "Content-Type: application/json" \
  -d '{"email":"jean@example.com","password":"MyPassword123"}'

Response β€” success

200 OK
{
  "st": 1,
  "msg": "Login successful",
  "user": {
    "id": 482,
    "name": "Jean Dupont",
    "slug": "jean-dupont",
    "thumb": "assets/front/img/avatar.png",
    "email": "jean@example.com",
    "role": "user",
    "parent": 482,
    "token": "9f3c1a...e02b"
  }
}

Possible responses

  • st: 0 Invalid credentials.
  • st: 2 Account pending activation.
  • st: 3 Account suspended.
  • st: 4 Email verification required before login.
  • st: 1 Login successful β€” token in user.token.
POST/api/v1/business

Creates the first business associated with a freshly registered account.

api_token required

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/business \
  -d "api_token=xxxx" -d "name=Ma SociΓ©tΓ©" -d "country=21"

Parameters (form-data)

FieldTypeDescription
api_tokenrequiredstringThe user's token.
namerequiredstringBusiness/company name.
countryrequiredintCountry id (see Reference β€” Countries).
categoryintBusiness category id.

Response β€” success

200 OK
{ "st": 3, "msg": "Business registered successfully" }

Possible responses

  • st: 0 Missing/invalid token, or required fields missing.
  • st: 3 Created β€” email verification disabled on the account.
  • st: 4 Created β€” email verification enabled (account pending verification).

Businesses

A user account can manage multiple businesses (multi-company). Most other resources (invoices, customers, products…) are attached to a business via its public uid.

Internal id vs public uid

Every business has an internal numeric id (database primary key) and a public uid. Depending on the endpoint, the expected parameter (sometimes still named business_id) is actually the uid, not the internal id β€” this is called out for every relevant endpoint below. When in doubt, always use the uid value returned by the business list.

GET/api/v1/business

Lists every business owned by the authenticated user.

api_token required
ParameterDescription
api_tokenrequiredQuery string.

Request

cURL
curl "https://app.gecloud.me/api/v1/business?api_token=xxxx"

Response β€” success

200 OK
{ "status": 1, "business": [ { "id": 12, "uid": "88123", "name": "My Company", "..." : "..." } ] }
POST/api/v1/business/add

Creates a new business, or updates an existing one if id is provided. On creation, the number of businesses is limited by the account's plan.

api_token requiredAccepts JSON or form-data
FieldTypeDescription
api_tokenrequiredstring
idintProvided = update.
namerequiredstringBusiness name.
countryintRequired on creation only.
title, phone, address, biz_number, vat_code, categorystring/intOptional business profile fields.
num_format, symbol_direction, space_price_symbol, price_separatorintCurrency display preferences.

Always set the currency-display preferences

Leaving num_format empty causes a server error when amounts are displayed for this business. Send 0 explicitly if you have no preference.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/business/add \
  -d "api_token=xxxx" -d "name=Ma SociΓ©tΓ©" -d "country=21"

Response β€” success (creation)

200 OK
{ "status": 1, "msg": "Business created", "business_id": 57 }

Possible responses

  • status: 0 Missing/invalid token, missing name, or plan limit reached.
  • status: 1 Created or updated β€” see msg.
GET/api/v1/business/show/{hash}

Business detail. The identifier expected in the URL is neither the raw id nor the uid, but the MD5 of the internal id (md5(id)).

api_token required
ParameterDescription
api_tokenrequiredQuery string.
hashrequiredURL segment β€” md5(id), where id is the internal id returned by the business list.

Request

cURL
curl "https://app.gecloud.me/api/v1/business/show/39461a19e9eddfb385ea76b26521ea48?api_token=xxxx"

Possible responses

  • status: 0 Not found, or doesn't belong to the token's owner (Access denied).
  • status: 1 business: full detail.

Customers

Manage a business's customer book.

POST/api/v1/customers/add

Creates a customer, or updates one if id is provided.

api_token required

business_id expects the uid, not the internal id

Despite its name, this endpoint's business_id field must contain the business's public uid (the one returned by the business list), not its internal id. Sending the internal id still creates the customer successfully, but it becomes invisible from the customer list (which filters on the uid).

FieldTypeDescription
api_tokenrequiredstring
idintProvided = update.
namerequiredstringMax 100 characters.
business_idrequiredstringBusiness uid (see warning above).
email, phone, address, address1, address2, city, postal_codestringContact details.
cus_number, vat_code, aibstringTax identifiers.
country, currencyintCountry / currency.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/customers/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "name=ACME SARL" -d "email=contact@acme.bj"

Response β€” success

200 OK
{ "st": 1, "msg": "Customer created successfully", "customer_id": 913 }

Possible responses

  • st: 0 Invalid token, validation failed, or plan's customer limit reached (creation only).
  • st: 1 Created or updated.
GET/api/v1/customers

Lists a business's customers.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string β€” business uid.

Request

cURL
curl "https://app.gecloud.me/api/v1/customers?api_token=xxxx&business_uid=88123"

Response β€” success

200 OK
{
  "st": 1,
  "total": 2,
  "customers": [
    { "id": 913, "name": "ACME SARL", "email": "contact@acme.bj", "phone": "...",
      "address": "...", "cus_number": "...", "vat_code": "...", "country": 21,
      "currency": "XOF", "city": "Cotonou", "postal_code": "", "status": 1 }
  ]
}
POST/api/v1/customers/show

Full detail of a customer. (A read endpoint reachable via POST for historical reasons.)

api_token required
FieldTypeDescription
api_tokenrequiredstring
customer_idrequiredint

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/customers/show \
  -d "api_token=xxxx" -d "customer_id=913"

Possible responses

  • st: 0 Not found, or doesn't belong to this user (Unauthorized).
  • st: 1 customer: full detail.
POST/api/v1/customers/delete

Permanently deletes a customer.

api_token required
FieldTypeDescription
api_tokenrequiredstring
customer_idrequiredint

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/customers/delete \
  -d "api_token=xxxx" -d "customer_id=913"

Success response

200 OK
{ "st": 1, "msg": "Customer deleted successfully" }

Possible responses

  • st: 0 Not found, or doesn't belong to this user (Unauthorized).
  • st: 1 Deleted.

Invoices

Create, view, send and fiscally normalize (MECeF, Benin) sales invoices. An invoice's business_id field is the business's public uid.

POST/api/v1/invoices/add

Creates an invoice (or updates it if id is provided) with its line items, taxes, and recurring-billing configuration if applicable.

api_token required
FieldTypeDescription
api_tokenrequiredstring
idintProvided = update.
customerrequiredintCustomer id.
business_idstringBusiness uid.
title, status, summary, number, poso_numberβ€”Invoice metadata.
date, payment_due, due_limitdateIssue and due dates.
discount, sub_total, grand_total, taxnumberAmounts and tax rate.
is_recurringboolIf 1, also provide recurring_start, recurring_end, frequency.
product_ids[], items[], details[], price[], quantity[], total_price[], taxes[]arraysInvoice lines, indexes aligned across arrays. product_ids[i] = 0 creates a new product on the fly from items[i]/price[i].

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/invoices/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "customer=913" \
  -d "title=Facture Juillet" -d "grand_total=150000" -d "sub_total=150000"

Response β€” success

200 OK
{ "status": 2, "invoice_id": "a3f9c2e1b4d6..." }

Possible responses

  • st: 0 Missing or invalid token.
  • status: 3 Validation error β€” details in error.
  • status: 4 Platform-wide invoice quota reached.
  • status: 5 Your plan's invoice limit reached.
  • status: 2 Created or updated β€” invoice_id returned (MD5-hashed).
GET/api/v1/invoices

Lists a business's invoices (or credit notes if type=4), paginated.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
statusFilter by invoice status. Omitted = no filter (all visible).
type1 = regular invoice (default), 4 = credit note. Alternative: credit_note=true.
per_page, pagePagination (defaults: 10 / 1).

Request

cURL
curl "https://app.gecloud.me/api/v1/invoices?api_token=xxxx&business_uid=88123"

Response β€” success

200 OK
{
  "business_id": "88123", "type": 1,
  "st": 1, "total": 34, "per_page": 10, "page": 1,
  "invoices": [
    { "id": 501, "number": "INV-0501", "title": "...", "summary": "...",
      "customer_id": 913, "customer_name": "ACME SARL",
      "date": "2026-07-01", "grand_total": 150000, "status": 1,
      "created_at": "2026-07-01 10:22:00" }
  ]
}
GET/api/v1/invoices/{id}

Invoice detail and its associated payments.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
idrequiredURL segment β€” the invoice's internal numeric id.

Request

cURL
curl "https://app.gecloud.me/api/v1/invoices/501?api_token=xxxx&business_uid=88123"

Response β€” success

200 OK
{
  "st": 1,
  "invoice": { "id": 501, "number": "INV-0501", "..." : "..." },
  "payments": [ { "id": 88, "amount": 50000, "payment_date": "2026-07-05", "..." : "..." } ]
}
POST/api/v1/send_invoice/{invoice_id}

Emails the invoice to the customer and marks it as sent.

api_token requiredJSON body required
Field (JSON)TypeDescription
api_tokenrequiredstringIn the JSON body (not query string).
customer_idrequiredint
email_torequiredstringRecipient address.
subject, messagestringEmail customization.
is_myself / email_myselfboolSends a copy to the sender.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/send_invoice/501 \
  -H "Content-Type: application/json" \
  -d '{"api_token":"9f3c1a...","customer_id":913,"email_to":"client@acme.bj"}'

Possible responses

  • status: 0 Invalid JSON, missing/invalid token, invoice or customer not found.
  • status: 1 Email sent.
  • status: 2 Email send failed (SMTP issue).
GET/api/v1/invoices/{id}/pdf

Downloads the invoice as a PDF file.

api_token required
ParameterDescription
api_tokenrequiredAuthorization header, or query parameter otherwise.
idrequiredURL segment (numeric invoice id).

Request

cURL
curl -OJ "https://app.gecloud.me/api/v1/invoices/501/pdf?api_token=xxxx"

Success response

200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="Invoice-501.pdf"

<binary PDF content>

Possible responses

  • status: 0 Missing/invalid token, invoice not found, or PDF generation unavailable on this server.
  • 200 Binary PDF stream.
DELETE/api/v1/invoices/delete/{id}

Permanently deletes an invoice and its associated payments. Irreversible.

api_token required
ParameterDescription
api_tokenrequiredAuthorization header, or query parameter as a fallback.
idrequiredURL segment (MD5-hashed).

Request

cURL
curl -X DELETE https://app.gecloud.me/api/v1/invoices/delete/207f88018f72237565570f8a9e5ca240 \
  -H "Authorization: xxxx"

Response β€” success

200 OK
{ "status": 1, "message": "Invoice and associated payments deleted successfully" }
POST/api/v1/invoices/{invoice_id}/normalize

Submits an invoice to Benin's MECeF fiscal gateway (DGI) to obtain a normalized/certified invoice id.

api_token requiredBenin only
ParameterDescription
api_tokenrequiredAuthorization header, or POST as a fallback.
invoice_idrequiredURL segment. The invoice must already have a MECeF API key configured.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/invoices/501/normalize \
  -H "Authorization: xxxx"

Response β€” success

200 OK
{
  "status": 1,
  "message": "Normalized invoice created successfully",
  "uid": "MECEF-UID-...",
  "data": { "uid": "...", "invoice_id": 501, "type": "FV", "total": 150000, "etat": 0, "...": "..." }
}

Possible responses

  • status: 0 Missing/invalid token, invoice not found, MECeF key not set, or an error returned by the fiscal gateway.
  • status: 1 Normalization successful.
GET/api/v1/invoices-normalized

Lists invoices that have been MECeF-normalized for a business.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
per_page, pagePagination (defaults: 10 / 1).

Request

cURL
curl "https://app.gecloud.me/api/v1/invoices-normalized?api_token=xxxx&business_uid=88123"

Response β€” success

200 OK
{ "st": 1, "total": 12, "per_page": 10, "page": 1, "invoices": [ "..." ] }

Estimates (proforma)

Estimates share the same table as invoices with a distinct type; they can be converted into a final invoice. Created as drafts by default.

GET/api/v1/estimates

Lists a business's estimates, paginated and filterable by status.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
per_page, pagePagination (defaults: 10 / 1).
statusOmitted = no filter (all estimates visible).

Request

cURL
curl "https://app.gecloud.me/api/v1/estimates?api_token=xxxx&business_uid=88123"

Response β€” success

200 OK
{ "st": 1, "total": 8, "per_page": 10, "page": 1,
  "estimates": [ { "id": 22, "number": "EST-0022", "grand_total": 80000, "status": 0, "...": "..." } ] }
GET/api/v1/estimates/{id}

Estimate detail with its lines and taxes.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
idrequiredURL segment.

Request

cURL
curl "https://app.gecloud.me/api/v1/estimates/22?api_token=xxxx"

Possible responses

  • st: 0 Not found (or isn't an estimate).
  • st: 1 estimate: detail with items and taxes.
POST/api/v1/estimates/add

Creates an estimate (or updates it if id is provided), auto-creating unknown products.

api_token required
FieldTypeDescription
api_tokenrequiredstring
idintProvided = update.
customerrequiredint
business_id, title, summary, number, poso_numberβ€”Metadata.
date, expire_ondate
discount, sub_total, grand_totalnumber
product_ids[], items[], details[], price[], quantity[], total_price[], taxes[]arraysEstimate lines.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/estimates/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "customer=913" \
  -d "title=Devis Juillet" -d "grand_total=80000" -d "sub_total=80000"

Response β€” success

200 OK
{ "status": 1, "estimate_id": 22, "estimate_crypt_id": "e91a...c02" }

Possible responses

  • status: 2 Validation error.
  • status: 4 Plan limit reached (creation only).
  • status: 1 Created or updated.
POST/api/v1/estimates/convert-proforma

Converts an existing estimate into a final (draft) invoice.

api_token required
FieldTypeDescription
api_tokenrequiredstring
invoice_idrequiredintId of the estimate to convert.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/estimates/convert-proforma \
  -d "api_token=xxxx" -d "invoice_id=22"

Response β€” success

200 OK
{ "st": 1, "msg": "Proforma converted to invoice successfully", "invoice_id": 501 }

Possible responses

  • st: 0 Missing id, not found, or not an estimate.
  • st: 1 Converted β€” becomes a draft invoice.
POST/api/v1/estimates/delete/{id}

Permanently deletes an estimate.

api_token required
ParameterDescription
api_tokenrequiredAuthorization header, or form field otherwise.
idrequiredURL segment (numeric estimate id).

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/estimates/delete/22 \
  -d "api_token=xxxx"

Success response

200 OK
{ "st": 1, "msg": "Estimate deleted successfully" }

Possible responses

  • st: 0 Not found, not owned by this user, or not an estimate.
  • st: 1 Deleted.

Vendor bills

Manage bills received from your vendors (purchases).

GET/api/v1/bills

Lists a business's vendor bills, paginated.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_idrequiredQuery string β€” business uid.
limit, offsetPagination (default: 20 / 0).

Request

cURL
curl "https://app.gecloud.me/api/v1/bills?api_token=xxxx&business_id=88123"

Response β€” success

200 OK
{ "status": 1, "bills": [ { "id": 71, "number": "BILL-0071", "...": "..." } ] }
GET/api/v1/bills/{id}

Vendor bill detail.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
idrequiredURL segment.

Request

cURL
curl "https://app.gecloud.me/api/v1/bills/71?api_token=xxxx"

Response β€” success

200 OK
{ "status": 1, "bill": { "id": 71, "number": "BILL-0071", "...": "..." } }
POST/api/v1/bills/add

Creates a vendor bill (or updates it if id is provided) with its lines.

api_token required
FieldTypeDescription
api_tokenrequiredstring
idintProvided = update.
vendorrequiredintVendor id.
business_id, title, summary, number, dateβ€”Metadata.
discount, sub_total, grand_totalnumber
payment_due, due_limitdate
items[], details[], price[], quantity[], total_price[]arraysBill lines.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/bills/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "vendor=12" \
  -d "title=Facture Fournisseur" -d "grand_total=45000" -d "sub_total=45000"

Response β€” success

200 OK
{ "status": 1, "bill_id": "7c1e...a09" }

Possible responses

  • status: 2 Validation error β€” details in error.
  • status: 1 Created or updated.

Expenses

Expense tracking, with an optional receipt.

GET/api/v1/expenses

Lists a business's expenses.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_idrequiredQuery string β€” business uid.

Request

cURL
curl "https://app.gecloud.me/api/v1/expenses?api_token=xxxx&business_id=88123"

Response β€” success

200 OK
{ "status": 1, "data": [ { "id": 305, "amount": 25000, "net_amount": 27500, "...": "..." } ] }
GET/api/v1/expenses/{id}

Expense detail.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_idrequiredQuery string.
idrequiredURL segment.

Request

cURL
curl "https://app.gecloud.me/api/v1/expenses/305?api_token=xxxx&business_id=88123"

Possible responses

  • status: 0 Not found, or doesn't belong to this business/user.
  • status: 1 data: full detail.
POST/api/v1/expenses/add

Creates an expense (or updates it if id is provided), with an optional receipt upload.

api_token requiredmultipart/form-data
FieldTypeDescription
api_tokenrequiredstring
business_idrequiredstringBusiness uid.
idintProvided = update.
amountrequirednumberPre-tax amount.
taxnumberRate (%) β€” net_amount = amount + amount Γ— tax / 100.
vendor, category, notes, dateβ€”Metadata.
filefileReceipt: pdf, gif, jpg, jpeg, png β€” 10 MB max.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/expenses/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "amount=25000" -d "tax=18"

Response β€” success

200 OK
{ "status": 1, "expense_id": 305, "message": "Expense created successfully" }

Payments

Record incoming/outgoing payments tied to invoices.

Currency conversion not finalized

The convert_amount field returned/stored by these endpoints attempts an automatic conversion to a fixed currency (XAF) that doesn't succeed in the general case: when no exchange rate can be resolved, the endpoint simply returns the original amount unconverted. Don't rely on convert_amount for multi-currency use until this is confirmed/finalized on the product side.

GET/api/v1/payments

Lists a business's payments, optionally filtered by invoice.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
invoice_idOptional filter on a specific invoice.

Request

cURL
curl "https://app.gecloud.me/api/v1/payments?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 875, "invoice_id": 1650, "business_id": "881777", "customer_id": 1275,
      "amount": "40000.000", "payment_date": "2026-07-19", "payment_method": "0",
      "type": "income", "...": "..." }
  ] }
POST/api/v1/payments/new

Records a payment against an invoice and updates its status (paid / partially paid). Automatically books the journal entry for income-type payments.

api_token required
FieldTypeDescription
api_tokenrequiredstringGET or POST.
invoice_idrequiredint
amountrequirednumber
business_uidrequiredstring
payment_methodintSee payment methods list. Default: 0.
payment_datedateDefault: today.
note, typestringtype: income or expense.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/payments/new \
  -d "api_token=xxxx" -d "invoice_id=501" -d "amount=50000" -d "business_uid=88123"

Response β€” success

200 OK
{ "status": 1, "message": "Payment recorded successfully", "invoice_status": "partially paid" }
POST/api/v1/payments/update/{id}

Updates an existing payment and recomputes the associated invoice's status.

api_token required
FieldTypeDescription
api_tokenrequiredstringGET or POST.
idrequiredintURL segment β€” payment id.
invoice_id, amount, payment_methodrequiredβ€”
payment_date, noteβ€”Optional.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/payments/update/875 \
  -d "api_token=xxxx" -d "invoice_id=501" -d "amount=60000" -d "payment_method=1"

Response β€” success

200 OK
{ "status": 1, "message": "Payment updated successfully", "updated_payment": { "...": "..." } }
POST/api/v1/payments/delete/{id}

Deletes a payment and automatically recalculates the associated invoice's status (paid / partially paid / pending).

api_token required
ParameterDescription
api_tokenrequiredAuthorization header, or query parameter otherwise.
idrequiredURL segment β€” payment id.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/payments/delete/875 \
  -H "Authorization: xxxx"

Success response

200 OK
{ "status": 1, "message": "Payment deleted successfully" }

Possible responses

  • status: 0 Missing/invalid token, or payment not found / not owned by this user.
  • status: 1 Deleted β€” the invoice's status is automatically re-adjusted.
GET/api/v1/payments/methods

Static list of available payment methods.

No authentication required

Request

cURL
curl "https://app.gecloud.me/api/v1/payments/methods"

Response β€” success

200 OK
{ "status": 1, "message": "Payment methods list retrieved successfully",
  "data": [
    { "id": 1, "name": "Bank Transfer" }, { "id": 2, "name": "Cash" },
    { "id": 3, "name": "Check" }, { "id": 4, "name": "Stripe" },
    { "id": 5, "name": "Paypal" }, { "id": 6, "name": "Mobile Money" },
    { "id": 7, "name": "Other Methods" }
  ] }

Products

Catalog of sellable and/or purchasable items, with optional stock tracking.

GET/api/v1/products/{type}

Lists a business's products, filtered by usage.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_idrequiredQuery string β€” business uid.
typeURL segment: sell (default) or buy.

Request

cURL
curl "https://app.gecloud.me/api/v1/products/sell?api_token=xxxx&business_id=88123"

Response β€” success

200 OK
{ "status": 1, "type": "sell", "data": [ { "id": 44, "name": "Consulting service", "price": 50000, "...": "..." } ] }
POST/api/v1/products/add

Creates a product (or updates it if id is provided).

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_idrequiredstringBusiness uid.
idintProvided = update.
namerequiredstring
pricerequirednumber
is_bothboolIf truthy, sets both is_sell and is_buy to 1.
is_sell, is_buyboolProduct usage.
income_category, expense_categoryintDefault: 0.
detailsstringDescription.
quantity, alert_quantityintStock tracking. Default: 0.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/products/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "name=Prestation conseil" -d "price=50000" -d "is_sell=1"

Response β€” success

200 OK
{ "status": 1, "message": "Product added successfully", "id": 44 }

Forecasting

Forecasted budget entries (future income/expenses) for financial planning.

GET/api/v1/previsions

Lists a business's forecast entries.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_idrequiredQuery string β€” business uid.

Request

cURL
curl "https://app.gecloud.me/api/v1/previsions?api_token=xxxx&business_id=88123"

Response β€” success

200 OK
{ "status": 1, "data": [ { "id": 61, "amount": 300000, "net_amount": 330000, "...": "..." } ] }
GET/api/v1/previsions/{id}

Forecast entry detail.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
idrequiredURL segment.

Request

cURL
curl "https://app.gecloud.me/api/v1/previsions/61?api_token=xxxx"

Possible responses

  • status: 0 Not found, or doesn't belong to this user.
  • status: 1 data: full detail.
POST/api/v1/previsions/add

Creates a forecast entry (or updates it if id is provided).

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_idrequiredstringBusiness uid.
idintProvided = update.
amountrequirednumber
taxnumberDefault: 0.
category, notesβ€”
date_min, date_maxdateForecast period.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/previsions/add \
  -d "api_token=xxxx" -d "business_id=88123" -d "amount=300000" -d "date_min=2026-08-01" -d "date_max=2026-08-31"

Response β€” success

200 OK
{ "status": 1, "prevision_id": 61, "message": "Prevision created successfully" }
DELETE/api/v1/previsions/delete/{id}

Deletes a forecast entry.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
idrequiredURL segment.

Request

cURL
curl "https://app.gecloud.me/api/v1/previsions/delete/61?api_token=xxxx"

Response β€” success

200 OK
{ "status": 1, "message": "Prevision deleted" }

Accounting

OHADA chart of accounts, journal entries and financial statements. These endpoints only work for a business with accounting enabled (enable_accounting = 1).

Delegated access (accounting firms)

Besides the business owner, an accounting firm (cabinet) with an active link and the accounting (journal/chart of accounts) or reports (financial statements) scope granted by the client can call these endpoints with its own api_token β€” no need for the client's credentials.

GET/api/v1/accounting/chart-of-accounts

Lists a business's active chart of accounts.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.

Request

cURL
curl "https://app.gecloud.me/api/v1/accounting/chart-of-accounts?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 1383, "account_number": "512", "name": "Bank", "account_type": "asset",
      "account_class": "5", "is_active": 1, "...": "..." }
  ] }

Possible responses

  • status: 0 Invalid token, business not found, access denied, or accounting not enabled for this business.
  • status: 1 Account list.
POST/api/v1/accounting/chart-of-accounts/add

Creates a new account in the chart of accounts.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
account_numberrequiredstringe.g. "512".
namerequiredstring
account_typerequiredstringOne of: asset, liability, equity, revenue, expense.
account_classintDefault: first digit of account_number.
parent_idintParent account, for a tree structure.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/accounting/chart-of-accounts/add \
  -d "api_token=xxxx" -d "business_uid=88123" -d "account_number=512" -d "name=Banque" -d "account_type=asset"

Success response

200 OK
{ "status": 1, "message": "Account created", "id": 1385 }
GET/api/v1/accounting/journal-entries

Lists a fiscal year's journal entries.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
fiscal_year_idDefault: current open fiscal year.
journal_typeFilter: AC (purchases), VT (sales), BQ (bank), CA (cash), OD (miscellaneous).
from, toDate filter (YYYY-MM-DD).

Request

cURL
curl "https://app.gecloud.me/api/v1/accounting/journal-entries?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "fiscal_year_id": 18, "data": [
    { "id": 45, "journal_type": "OD", "date": "2026-07-21", "description": "Cash sale",
      "created_by_name": "John Doe", "...": "..." }
  ] }
POST/api/v1/accounting/journal-entries/add

Creates a balanced (double-entry) journal entry.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
linesrequiredJSONArray of {account_id, label, debit, credit}. Total debits must equal total credits.
journal_typestringDefault: OD.
reference, description, dateβ€”date defaults to today.
fiscal_year_idintDefault: current open fiscal year.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/accounting/journal-entries/add \
  -d "api_token=xxxx" -d "business_uid=88123" -d "journal_type=OD" \
  -d "description=Cash sale" \
  --data-urlencode 'lines=[{"account_id":1383,"label":"Sale","debit":50000,"credit":0},
                            {"account_id":1384,"label":"Sale","debit":0,"credit":50000}]'

Possible responses

  • status: 0 Unbalanced entry, account outside this business's chart of accounts, or no open fiscal year.
  • status: 1 Entry created β€” id returned.
GET/api/v1/accounting/financial-statements/income-statement

Income statement: net balance (revenue βˆ’ expenses) per account, for a fiscal year.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
fiscal_year_idDefault: current open fiscal year.

Request

cURL
curl "https://app.gecloud.me/api/v1/accounting/financial-statements/income-statement?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "fiscal_year_id": 18, "data": [
    { "account_number": "701", "name": "Sales", "account_type": "revenue", "net_amount": "50000.000" }
  ] }

Note

The response lists a per-account balance (non-zero revenue/expense accounts) β€” no pre-computed OHADA rubric grouping; aggregate client-side if needed.

GET/api/v1/accounting/financial-statements/balance-sheet

Balance sheet: balance (debit βˆ’ credit) per asset/liability/equity account, for a fiscal year.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
fiscal_year_idDefault: current open fiscal year.

Request

cURL
curl "https://app.gecloud.me/api/v1/accounting/financial-statements/balance-sheet?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "fiscal_year_id": 18, "data": [
    { "account_number": "512", "name": "Bank", "account_type": "asset", "balance": "50000.000" }
  ] }
GET/api/v1/accounting/fiscal-year/current

Returns the currently open fiscal year.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.

Request

cURL
curl "https://app.gecloud.me/api/v1/accounting/fiscal-year/current?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": { "id": 18, "name": "2026", "start_date": "2026-01-01", "end_date": "2026-12-31", "status": "open" } }

Possible responses

  • status: 0 No open fiscal year for this business.
  • status: 1 Fiscal year found.

Bank Reconciliation

Bank accounts, statement import, and reconciliation against recorded payments. Restricted to businesses with enable_accounting=1, same access rule as Accounting (owner, or a cabinet with accounting scope).

GET/api/v1/bank-accounts

Lists a business's active bank accounts.

api_token required
ParameterDescription
api_tokenrequiredQuery string or Authorization header.
business_uidrequiredQuery string.

Request

cURL
curl "https://app.gecloud.me/api/v1/bank-accounts?business_uid=88123" \
  -H "Authorization: xxxx"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 5, "name": "Ecobank Account", "account_type": "bank", "currency_code": "XOF",
      "initial_balance": "500000.000", "balance": "647500.000", "is_active": "1" }
  ] }
POST/api/v1/bank-accounts/add

Creates a bank, cash, or mobile money account.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
namerequiredstring
account_typestringbank (default), cash, or mobile_money.
currency_codestring
initial_balancenumberDefault: 0.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/bank-accounts/add \
  -d "api_token=xxxx" -d "business_uid=88123" -d "name=Ecobank Account" \
  -d "account_type=bank" -d "initial_balance=500000"

Success response

200 OK
{ "status": 1, "message": "Bank account created", "id": 5 }
GET/api/v1/bank-accounts/{id}/transactions

Lists a bank account's transactions, with the matched payment if already reconciled.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
idrequiredURL segment β€” bank account id.
from, toOptional date filter.
reconciled0 or 1 to filter by reconciliation status.

Request

cURL
curl "https://app.gecloud.me/api/v1/bank-accounts/5/transactions?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 1, "date": "2026-07-15", "description": "Customer wire ACME",
      "amount": "150000.000", "type": "credit", "reference": "VIR001",
      "payment_record_id": null, "is_reconciled": "0" }
  ] }
POST/api/v1/bank-accounts/{id}/transactions/add

Imports a batch of bank transactions (statement) and automatically recalculates the account balance.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
idrequiredintURL segment.
transactionsrequiredJSONArray of {date, description, amount, type, reference} β€” type: credit or debit.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/bank-accounts/5/transactions/add \
  -d "api_token=xxxx" -d "business_uid=88123" \
  --data-urlencode 'transactions=[{"date":"2026-07-15","description":"Customer wire ACME","amount":150000,"type":"credit","reference":"VIR001"}]'

Success response

200 OK
{ "status": 1, "message": "2 transaction(s) imported" }
GET/api/v1/bank-transactions/{id}/suggestions

Suggests up to 5 unreconciled payments that may match this transaction (same amount within Β±0.01, date within Β±3 days).

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
idrequiredURL segment β€” bank transaction id.

Request

cURL
curl "https://app.gecloud.me/api/v1/bank-transactions/1/suggestions?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 876, "payment_date": "2026-07-16", "amount": "150000.000",
      "contact_name": "ACME SARL", "invoice_number": "FAC-0501" }
  ] }
POST/api/v1/bank-transactions/reconcile

Manually matches a bank transaction to a recorded payment.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
bank_txn_idrequiredint
payment_record_idrequiredint

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/bank-transactions/reconcile \
  -d "api_token=xxxx" -d "business_uid=88123" -d "bank_txn_id=1" -d "payment_record_id=876"

Success response

200 OK
{ "status": 1, "message": "Transaction reconciled" }

Possible responses

  • status: 0 Missing fields, or the transaction/payment doesn't belong to this business.
  • status: 1 Reconciled.
POST/api/v1/bank-transactions/unreconcile

Undoes an existing reconciliation.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
bank_txn_idrequiredint

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/bank-transactions/unreconcile \
  -d "api_token=xxxx" -d "business_uid=88123" -d "bank_txn_id=1"

Success response

200 OK
{ "status": 1, "message": "Transaction unreconciled" }
GET/api/v1/bank-accounts/{id}/summary

Reconciliation summary for an account: credit/debit totals and the reconciled share.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
idrequiredURL segment.
from, toOptional date filter.

Request

cURL
curl "https://app.gecloud.me/api/v1/bank-accounts/5/summary?api_token=xxxx&business_uid=88123"

Success response

200 OK
{ "status": 1, "data": {
    "total_credit": "150000.000", "total_debit": "2500.000",
    "reconciled_credit": "150000.000", "reconciled_debit": "0.000",
    "total_txn": "2", "reconciled_txn": "1" } }

Categories (income/expense)

Categories used to classify products, expenses, and forecast entries. Not to be confused with business categories (industry/sector), which are a separate global reference.

GET/api/v1/categories

Lists a business's income and/or expense categories.

api_token required
ParameterDescription
api_tokenrequiredQuery string.
business_uidrequiredQuery string.
typeincome or expense. Omitted = returns both, grouped.

Request

cURL
curl "https://app.gecloud.me/api/v1/categories?api_token=xxxx&business_uid=88123&type=expense"

Success response (with type)

200 OK
{ "status": 1, "data": [
    { "id": 465, "name": "Office supplies", "slug": "office-supplies", "type": "2" }
  ] }

Success response (without type)

200 OK
{ "status": 1, "data": {
    "income": [ { "id": 464, "name": "Merchandise sales", "type": "1" } ],
    "expense": [ { "id": 465, "name": "Office supplies", "type": "2" } ] } }
POST/api/v1/categories/add

Creates an income or expense category.

api_token required
FieldTypeDescription
api_tokenrequiredstring
business_uidrequiredstring
namerequiredstring
typerequiredstringincome or expense.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/categories/add \
  -d "api_token=xxxx" -d "business_uid=88123" -d "name=Merchandise sales" -d "type=income"

Success response

200 OK
{ "status": 1, "message": "Category created", "id": 464 }

Cabinet Workspace

Reserved for accounting firm accounts (profile_type = 'cabinet'). Manage clients β€” whether they have a geCloud account (invitation) or not (dossier).

GET/api/v1/cabinet/clients

Lists the authenticated cabinet's clients (linked accounts + dossiers).

api_token required
ParameterDescription
api_tokenrequiredQuery string.
statusOptional filter: pending, active, suspended, revoked.

Request

cURL
curl "https://app.gecloud.me/api/v1/cabinet/clients?api_token=xxxx"

Success response

200 OK
{ "status": 1, "data": [
    { "id": 13, "client_business_id": 385, "status": "active", "is_dossier": 1,
      "client_name": "Test Bakery", "client_email": "contact@test.local",
      "scope": "{\"accounting\":true,\"reports\":true,\"invoices\":true,\"expenses\":true}", "...": "..." }
  ] }

Possible responses

  • status: 0 Invalid token, or this account is not an accounting firm account.
  • status: 1 Client list.
POST/api/v1/cabinet/dossiers/add

Creates a client dossier β€” for a client with no geCloud account. The cabinet manages its accounting directly, no invitation or acceptance needed.

api_token required
FieldTypeDescription
api_tokenrequiredstring
namerequiredstringDossier's business name.
contact_email, contact_phonestringDossier contact details (no real account is created).
scopeJSONDefault: full access (accounting, reports, invoices, expenses all true).

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/cabinet/dossiers/add \
  -d "api_token=xxxx" -d "name=Boulangerie Test" -d "contact_email=contact@test.local"

Success response

200 OK
{ "status": 1, "message": "Dossier created.", "link_id": 13, "business_id": 385, "business_uid": "59862" }

Possible responses

  • status: 0 Missing name, or the cabinet plan's client limit has been reached.
  • status: 1 Dossier created β€” reuse business_uid on the Accounting endpoints.
POST/api/v1/cabinet/invite

Invites an existing geCloud client to grant the cabinet access, by email.

api_token required
FieldTypeDescription
api_tokenrequiredstring
client_emailrequiredstringEmail of the client's geCloud account.
scopeJSONDefault: full access.

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/cabinet/invite \
  -d "api_token=xxxx" -d "client_email=client@exemple.com"

Success response

200 OK
{ "status": 1, "message": "Invitation sent", "link_id": 14 }

Possible responses

  • status: 0 Missing email, no geCloud account at that address, already linked or pending, or cabinet plan's client limit reached.
  • status: 1 Invitation sent β€” awaiting the client's acceptance.
POST/api/v1/cabinet/revoke/{link_id}

Revokes access to a client (or deletes the link with a dossier).

api_token required
ParameterDescription
api_tokenrequiredForm field.
link_idrequiredURL segment β€” link id (returned by the client list).

Request

cURL
curl -X POST https://app.gecloud.me/api/v1/cabinet/revoke/13 \
  -d "api_token=xxxx"

Success response

200 OK
{ "status": 1, "message": "Access revoked" }

Possible responses

  • status: 0 Link not found, or doesn't belong to this cabinet.
  • status: 1 Access revoked.

Subscription

Read-only view of the authenticated user's active plan and their current usage against that plan's limits.

GET/api/v1/subscription

Returns the user's active plan, its limits, and current usage.

api_token required
ParameterDescription
api_tokenrequiredQuery string.

Request

cURL
curl "https://app.gecloud.me/api/v1/subscription?api_token=xxxx"

Success response (active subscription)

200 OK
{ "status": 1,
  "plan": { "package_id": 2, "package_name": "STARTER", "package_slug": "starter",
            "billing_type": "yearly", "status": "verified", "expire_on": "2027-07-21" },
  "limits": { "business": 3, "customer": 500, "invoice": 200, "estimate": 100, "user-roles": 2 },
  "usage":  { "business": 1, "customer": 42, "invoice": 18, "estimate": 5 } }

Success response (no active subscription)

200 OK
{ "status": 1, "plan": null, "message": "No active subscription" }

Note

In limits, -2 means unlimited, -1/0 means the feature is disabled on this plan, any other value is a numeric cap.

Reference

Static data useful for populating your forms (no authentication required).

GET/api/v1/countries

Full list of countries, with the ids used elsewhere in the API (country field).

No authentication required

Request

cURL
curl "https://app.gecloud.me/api/v1/countries"

Response β€” success

200 OK
{ "status": 1, "message": "Country list retrieved successfully",
  "data": [ { "id": 21, "name": "Benin", "code": "BJ", "dial_code": "+229", "currency_symbol": "F", "currency_name": "West African Franc" } ] }
GET/api/v1/account-categories

List of available business categories.

No authentication required

Request

cURL
curl "https://app.gecloud.me/api/v1/account-categories"

Response β€” success

200 OK
{ "status": 1, "message": "Business category list retrieved successfully",
  "data": [ { "id": 3, "name": "Retail & Distribution" } ] }

geCloud API documentation β€” gecloud.me