MENU navbar-image

Introduction

API REST multi-tenant pour la gestion d'associations africaines (tontines, ONG, mutuelles, syndicats).

Identification du tenant

Toutes les routes /api/v1/* (sauf register, login et login/select-tenant) nécessitent le header X-Tenant-Slug :

X-Tenant-Slug: mon-association

Le slug est l'identifiant unique de l'association, choisi lors de l'inscription.

Format de réponse uniforme

Toutes les réponses suivent ce format :

{
  "success": true,
  "message": "Description lisible.",
  "data": {},
  "meta": { "timestamp": "2026-04-27T10:00:00+00:00", "version": "v1" }
}

En cas d'erreur, le champ errors s'ajoute et data vaut null.

Codes d'erreur

Code Signification
200 Succès
201 Ressource créée
401 Token manquant ou expiré
403 Accès interdit (tenant suspendu)
404 Ressource ou tenant introuvable
422 Validation échouée
429 Trop de requêtes (100/min API · 10/min auth)
500 Erreur serveur interne
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.

Obtenez votre token via POST /api/v1/auth/login, puis passez-le en header : Authorization: Bearer {token}

Authentication

Se déconnecter

requires authentication

Révoque tous les tokens Sanctum de l'utilisateur connecté (toutes les sessions).

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

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/logout';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Déconnexion réussie):


{
    "success": true,
    "message": "Déconnexion réussie.",
    "data": null,
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Token manquant ou expiré):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Profil et permissions

requires authentication

Retourne le profil complet de l'utilisateur connecté et la liste de ses permissions dans le contexte du tenant courant.

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

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/me';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Succès):


{
    "success": true,
    "message": "Utilisateur courant.",
    "data": {
        "user": {
            "id": "550e8400-e29b-41d4-a716-446655440000",
            "tenant_id": "660e8400-e29b-41d4-a716-446655440000",
            "first_name": "Kofi",
            "last_name": "Mensah",
            "email": "kofi@example.com",
            "phone": "+22997000000",
            "avatar_url": null,
            "locale": "fr",
            "is_active": true,
            "last_login_at": "2026-04-27T10:00:00+00:00",
            "roles": [
                {
                    "name": "admin",
                    "guard_name": "web"
                }
            ]
        },
        "permissions": [
            "manage-members",
            "manage-cotisations",
            "view-reports"
        ]
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Token manquant ou expiré):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/auth/me

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Rafraîchir le token

requires authentication

Révoque le token courant et émet un nouveau token Sanctum valide 24h. Utile pour prolonger une session sans redemander les credentials.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/auth/refresh" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/auth/refresh"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/refresh';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Token rafraîchi):


{
    "success": true,
    "message": "Token rafraîchi.",
    "data": {
        "token": "3|assovix_newFreshToken789xyz"
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Token manquant ou expiré):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/auth/refresh

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Créer un compte association

Crée simultanément un nouveau tenant (association) et son premier utilisateur avec le rôle admin. Retourne un token Sanctum immédiatement utilisable. Ce endpoint ne nécessite pas le header X-Tenant-Slug car le tenant n'existe pas encore.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/auth/register" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"association_name\": \"Tontine Les Amis\",
    \"association_type\": \"tontine\",
    \"slug\": \"tontine-les-amis\",
    \"country\": \"BJ\",
    \"currency\": \"XOF\",
    \"first_name\": \"Kofi\",
    \"last_name\": \"Mensah\",
    \"email\": \"kofi@example.com\",
    \"phone\": \"+22997000000\",
    \"password\": \"Secret@2026!\",
    \"password_confirmation\": \"Secret@2026!\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/auth/register"
);

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

let body = {
    "association_name": "Tontine Les Amis",
    "association_type": "tontine",
    "slug": "tontine-les-amis",
    "country": "BJ",
    "currency": "XOF",
    "first_name": "Kofi",
    "last_name": "Mensah",
    "email": "kofi@example.com",
    "phone": "+22997000000",
    "password": "Secret@2026!",
    "password_confirmation": "Secret@2026!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/register';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'association_name' => 'Tontine Les Amis',
            'association_type' => 'tontine',
            'slug' => 'tontine-les-amis',
            'country' => 'BJ',
            'currency' => 'XOF',
            'first_name' => 'Kofi',
            'last_name' => 'Mensah',
            'email' => 'kofi@example.com',
            'phone' => '+22997000000',
            'password' => 'Secret@2026!',
            'password_confirmation' => 'Secret@2026!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Inscription réussie):


{
    "success": true,
    "message": "Inscription réussie.",
    "data": {
        "token": "1|assovix_K2c3QTLQgDywEmIa0qaXL1ivbosnIr4",
        "user": {
            "id": "550e8400-e29b-41d4-a716-446655440000",
            "tenant_id": "660e8400-e29b-41d4-a716-446655440000",
            "first_name": "Kofi",
            "last_name": "Mensah",
            "email": "kofi@example.com",
            "phone": "+22997000000",
            "avatar_url": null,
            "locale": "fr",
            "is_active": true,
            "last_login_at": null
        },
        "tenant": {
            "id": "660e8400-e29b-41d4-a716-446655440000",
            "name": "Tontine Les Amis",
            "association_type": "tontine",
            "slug": "tontine-les-amis",
            "country": "BJ",
            "currency": "XOF",
            "plan": "free",
            "status": "trial",
            "trial_ends_at": "2026-05-11T10:00:00+00:00"
        }
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (422, Slug déjà utilisé):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "slug": [
            "The slug has already been taken."
        ]
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (422, Email invalide):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "email": [
            "The email field must be a valid email address."
        ]
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (422, Mot de passe trop court):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "password": [
            "The password field must be at least 8 characters."
        ]
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/auth/register

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

association_name   string     

Nom de l'association. Example: Tontine Les Amis

association_type   string     

Type d'association : tontine, mutuelle, ong, syndicat, club_culturel, association_sportive, communaute_religieuse. Example: tontine

slug   string     

Identifiant URL unique (minuscules, chiffres, tirets). Example: tontine-les-amis

country   string     

Code pays ISO 3166-1 alpha-2. Example: BJ

currency   string     

Devise : XOF, XAF, GNF, USD, EUR. Example: XOF

first_name   string     

Prénom de l'administrateur. Example: Kofi

last_name   string     

Nom de famille. Example: Mensah

email   string     

Adresse email. Example: kofi@example.com

phone   string  optional    

Numéro de téléphone (optionnel). Example: +22997000000

password   string     

Mot de passe (min. 8 caractères). Example: Secret@2026!

password_confirmation   string     

Confirmation du mot de passe. Example: Secret@2026!

Se connecter

Authentifie un utilisateur sans header X-Tenant-Slug. Le système identifie automatiquement l'association en croisant email et password.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"kofi@example.com\",
    \"password\": \"Secret@2026!\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/auth/login"
);

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

let body = {
    "email": "kofi@example.com",
    "password": "Secret@2026!"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/login';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'kofi@example.com',
            'password' => 'Secret@2026!',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Connexion directe (un seul tenant)):


{
    "success": true,
    "message": "Connexion réussie.",
    "data": {
        "token": "2|assovix_4xK2c3QTLQgDywEmIa0qaXL1ivbosnIr4",
        "user": {
            "id": "550e8400-...",
            "email": "kofi@example.com",
            "is_active": true
        },
        "tenant": {
            "id": "660e8400-...",
            "name": "Tontine Les Amis",
            "slug": "tontine-les-amis"
        },
        "permissions": [
            "manage-members"
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (200, Sélection d'association requise):


{
    "success": true,
    "message": "Plusieurs associations correspondent. Sélectionnez-en une.",
    "data": {
        "requires_tenant_selection": true,
        "login_intent": "lit_9f3a2b81e4c64d9bb9a1d0e2f1c8b3a7",
        "expires_at": "2026-05-04T10:05:00+00:00",
        "associations": [
            {
                "id": "660e8400-...",
                "name": "Tontine Les Amis",
                "slug": "tontine-les-amis",
                "association_type": "tontine",
                "logo_url": null,
                "country": "BJ"
            }
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (422, Identifiants incorrects):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "email": [
            "Identifiants incorrects."
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Adresse email de l'utilisateur. Example: kofi@example.com

password   string     

Mot de passe. Example: Secret@2026!

Sélectionner une association après login multi-tenant

Consomme un login_intent émis par POST /auth/login quand l'email matche plusieurs associations, et retourne un token Sanctum complet pour le tenant choisi. Le login_intent est one-shot : un second appel échoue. TTL 5 min.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/auth/login/select-tenant" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"login_intent\": \"lit_9f3a2b81e4c64d9bb9a1d0e2f1c8b3a7\",
    \"tenant_id\": \"660e8400-e29b-41d4-a716-446655440000\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/auth/login/select-tenant"
);

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

let body = {
    "login_intent": "lit_9f3a2b81e4c64d9bb9a1d0e2f1c8b3a7",
    "tenant_id": "660e8400-e29b-41d4-a716-446655440000"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/auth/login/select-tenant';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'login_intent' => 'lit_9f3a2b81e4c64d9bb9a1d0e2f1c8b3a7',
            'tenant_id' => '660e8400-e29b-41d4-a716-446655440000',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Sélection réussie):


{
    "success": true,
    "message": "Connexion réussie.",
    "data": {
        "token": "3|assovix_freshTokenForSelectedTenant",
        "user": {
            "id": "550e8400-...",
            "email": "kofi@example.com"
        },
        "tenant": {
            "id": "660e8400-...",
            "name": "Tontine Les Amis",
            "slug": "tontine-les-amis"
        },
        "permissions": [
            "manage-members"
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:00:30+00:00",
        "version": "v1"
    }
}
 

Example response (422, Intent expiré ou inconnu):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "login_intent": [
            "Lien expiré, recommencez la connexion."
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:05:30+00:00",
        "version": "v1"
    }
}
 

Example response (422, Tenant non autorisé pour cet intent):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "tenant_id": [
            "Sélection invalide."
        ]
    },
    "meta": {
        "timestamp": "2026-05-04T10:00:30+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/auth/login/select-tenant

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

login_intent   string     

Identifiant retourné par /auth/login. Example: lit_9f3a2b81e4c64d9bb9a1d0e2f1c8b3a7

tenant_id   string     

UUID de l'association choisie. Example: 660e8400-e29b-41d4-a716-446655440000

Tenant (Admin)

Lister les tenants

requires authentication

Retourne la liste paginée de tous les tenants (25 par page), triée par date de création décroissante. Filtres disponibles : status et search (recherche dans name et slug).

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/admin/tenants?status=active&search=tontine&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants"
);

const params = {
    "status": "active",
    "search": "tontine",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'active',
            'search' => 'tontine',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Liste paginée):


{
    "success": true,
    "message": "Liste des tenants.",
    "data": [
        {
            "id": "660e8400-e29b-41d4-a716-446655440000",
            "name": "Tontine Les Amis",
            "slug": "tontine-les-amis",
            "country": "BJ",
            "currency": "XOF",
            "plan": "free",
            "status": "trial",
            "trial_ends_at": "2026-05-11T10:00:00+00:00",
            "created_at": "2026-04-27T10:00:00+00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "last_page": 3,
        "per_page": 25,
        "total": 72,
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/admin/tenants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

Filtre par statut. Valeurs : active, suspended, trial. Example: active

search   string  optional    

Recherche dans le nom ou le slug du tenant. Example: tontine

page   integer  optional    

Numéro de page. Défaut: 1. Example: 1

Créer un tenant

requires authentication

Crée manuellement un nouveau tenant sans créer d'utilisateur associé. Réservé au super admin de la plateforme.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/admin/tenants" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"ONG Solidarité Bénin\",
    \"slug\": \"ong-solidarite-benin\",
    \"country\": \"SN\",
    \"currency\": \"XOF\",
    \"plan\": \"free\",
    \"status\": \"trial\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants"
);

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

let body = {
    "name": "ONG Solidarité Bénin",
    "slug": "ong-solidarite-benin",
    "country": "SN",
    "currency": "XOF",
    "plan": "free",
    "status": "trial"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'ONG Solidarité Bénin',
            'slug' => 'ong-solidarite-benin',
            'country' => 'SN',
            'currency' => 'XOF',
            'plan' => 'free',
            'status' => 'trial',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (201, Tenant créé):


{
    "success": true,
    "message": "Tenant créé.",
    "data": {
        "id": "770e8400-e29b-41d4-a716-446655440000",
        "name": "ONG Solidarité Bénin",
        "slug": "ong-solidarite-benin",
        "country": "SN",
        "currency": "XOF",
        "plan": "free",
        "status": "trial",
        "created_at": "2026-04-27T10:00:00+00:00"
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (422, Slug dupliqué):


{
    "success": false,
    "message": "Données invalides.",
    "data": null,
    "errors": {
        "slug": [
            "The slug has already been taken."
        ]
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/admin/tenants

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Nom de l'association. Example: ONG Solidarité Bénin

slug   string     

Identifiant URL unique (minuscules, chiffres, tirets). Example: ong-solidarite-benin

country   string  optional    

Code pays ISO 3166-1 alpha-2. Example: SN

currency   string  optional    

Devise : XOF, XAF, GNF, USD, EUR. Example: XOF

plan   string  optional    

Plan : free, starter, pro, enterprise. Example: free

status   string  optional    

Statut : active, suspended, trial. Example: trial

Modifier un tenant

requires authentication

Met à jour les informations d'un tenant existant. Seuls les champs envoyés sont modifiés (comportement PATCH sur PUT).

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Tontine Les Amis v2\",
    \"country\": \"CI\",
    \"currency\": \"XOF\",
    \"plan\": \"starter\",
    \"locale\": \"fr\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000"
);

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

let body = {
    "name": "Tontine Les Amis v2",
    "country": "CI",
    "currency": "XOF",
    "plan": "starter",
    "locale": "fr"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Tontine Les Amis v2',
            'country' => 'CI',
            'currency' => 'XOF',
            'plan' => 'starter',
            'locale' => 'fr',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Tenant mis à jour):


{
    "success": true,
    "message": "Tenant mis à jour.",
    "data": {
        "id": "660e8400-e29b-41d4-a716-446655440000",
        "name": "Tontine Les Amis v2",
        "slug": "tontine-les-amis",
        "country": "CI",
        "currency": "XOF",
        "plan": "starter",
        "status": "trial"
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (404, Tenant introuvable):


{
    "success": false,
    "message": "Ressource introuvable.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/admin/tenants/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du tenant. Example: 660e8400-e29b-41d4-a716-446655440000

Body Parameters

name   string  optional    

Nouveau nom de l'association. Example: Tontine Les Amis v2

country   string  optional    

Code pays ISO 3166-1 alpha-2. Example: CI

currency   string  optional    

Devise : XOF, XAF, GNF, USD, EUR. Example: XOF

plan   string  optional    

Plan : free, starter, pro, enterprise. Example: starter

locale   string  optional    

Locale BCP 47. Example: fr

Suspendre un tenant

requires authentication

Passe le statut du tenant à suspended. Les utilisateurs du tenant recevront une erreur 403 sur chaque requête.

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/suspend" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/suspend"
);

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


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/suspend';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Tenant suspendu):


{
    "success": true,
    "message": "Tenant suspendu.",
    "data": {
        "id": "660e8400-e29b-41d4-a716-446655440000",
        "name": "Tontine Les Amis",
        "slug": "tontine-les-amis",
        "status": "suspended"
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (404, Tenant introuvable):


{
    "success": false,
    "message": "Ressource introuvable.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/admin/tenants/{id}/suspend

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du tenant. Example: 660e8400-e29b-41d4-a716-446655440000

Activer un tenant

requires authentication

Passe le statut du tenant à active. Rétablit l'accès complet à l'API pour les utilisateurs du tenant.

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/activate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/activate"
);

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


fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000/activate';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Tenant activé):


{
    "success": true,
    "message": "Tenant activé.",
    "data": {
        "id": "660e8400-e29b-41d4-a716-446655440000",
        "name": "Tontine Les Amis",
        "slug": "tontine-les-amis",
        "status": "active"
    },
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (404, Tenant introuvable):


{
    "success": false,
    "message": "Ressource introuvable.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/admin/tenants/{id}/activate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du tenant. Example: 660e8400-e29b-41d4-a716-446655440000

Supprimer un tenant

requires authentication

Soft-delete du tenant. Les données sont conservées en base (deleted_at non null). Cette action est réversible via une restauration manuelle.

Example request:
curl --request DELETE \
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/admin/tenants/660e8400-e29b-41d4-a716-446655440000';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Tenant supprimé):


{
    "success": true,
    "message": "Tenant supprimé.",
    "data": null,
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (401, Non authentifié):


{
    "success": false,
    "message": "Non authentifié.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Example response (404, Tenant introuvable):


{
    "success": false,
    "message": "Ressource introuvable.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-04-27T10:00:00+00:00",
        "version": "v1"
    }
}
 

Request      

DELETE api/admin/tenants/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du tenant. Example: 660e8400-e29b-41d4-a716-446655440000

Member Groups

Liste des groupes

requires authentication

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/member-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/member-groups"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/member-groups';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/member-groups

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Créer un groupe

requires authentication

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/member-groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Bureau\",
    \"description\": \"Rerum non doloribus aspernatur ad eius molestiae accusantium.\",
    \"color\": \"#059669\",
    \"parent_id\": null
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/member-groups"
);

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

let body = {
    "name": "Bureau",
    "description": "Rerum non doloribus aspernatur ad eius molestiae accusantium.",
    "color": "#059669",
    "parent_id": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/member-groups';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'Bureau',
            'description' => 'Rerum non doloribus aspernatur ad eius molestiae accusantium.',
            'color' => '#059669',
            'parent_id' => null,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/member-groups

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Nom du groupe. Example: Bureau

description   string  optional    

Example: Rerum non doloribus aspernatur ad eius molestiae accusantium.

color   string  optional    

Couleur hex (ex: #059669). Example: #059669

parent_id   string  optional    

UUID du groupe parent.

Modifier un groupe

requires authentication

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"vwgshl\",
    \"description\": \"Rerum non doloribus aspernatur ad eius molestiae accusantium.\",
    \"color\": \"#057Fce\",
    \"parent_id\": \"a00372d2-8e4a-326e-8cb5-f40c121e1465\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000"
);

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

let body = {
    "name": "vwgshl",
    "description": "Rerum non doloribus aspernatur ad eius molestiae accusantium.",
    "color": "#057Fce",
    "parent_id": "a00372d2-8e4a-326e-8cb5-f40c121e1465"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'vwgshl',
            'description' => 'Rerum non doloribus aspernatur ad eius molestiae accusantium.',
            'color' => '#057Fce',
            'parent_id' => 'a00372d2-8e4a-326e-8cb5-f40c121e1465',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/v1/member-groups/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du groupe. Example: 550e8400-e29b-41d4-a716-446655440000

Body Parameters

name   string  optional    

validation.max. Example: vwgshl

description   string  optional    

Example: Rerum non doloribus aspernatur ad eius molestiae accusantium.

color   string  optional    

Must match the regex /^#[0-9A-Fa-f]{6}$/. Example: #057Fce

parent_id   string  optional    

validation.uuid The id of an existing record in the member_groups table. Must not be one of . Example: a00372d2-8e4a-326e-8cb5-f40c121e1465

Supprimer un groupe

requires authentication

Refusé si le groupe contient des membres (actifs ou supprimés).

Example request:
curl --request DELETE \
    "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

DELETE api/v1/member-groups/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du groupe. Example: 550e8400-e29b-41d4-a716-446655440000

Membres d'un groupe

requires authentication

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000/members" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000/members"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/member-groups/550e8400-e29b-41d4-a716-446655440000/members';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/member-groups/{id}/members

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du groupe. Example: 550e8400-e29b-41d4-a716-446655440000

Members

Statistiques des membres

requires authentication

Retourne le total, la répartition par statut et par groupe, les nouveaux ce mois/année.

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members/stats" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/stats"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/stats';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/members/stats

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Exporter les membres en CSV

requires authentication

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members/export?status=active&group_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/export"
);

const params = {
    "status": "active",
    "group_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/export';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'status' => 'active',
            'group_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/members/export

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

status   string  optional    

Filtre statut. Example: active

group_id   string  optional    

Filtre groupe.

Télécharger le template CSV d'import

requires authentication

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members/template" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/template"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/template';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/members/template

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Importer des membres depuis CSV

requires authentication

Importe des membres depuis un fichier CSV. Max 1000 lignes. Colonnes requises : first_name, last_name. Toutes les autres sont optionnelles.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/members/import" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "file=@/tmp/phpp1mf123miqh60k0Ndre" 
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/import"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Tenant-Slug": "demo",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/import';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'file',
                'contents' => fopen('/tmp/phpp1mf123miqh60k0Ndre', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/members/import

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

file   file     

Fichier CSV (max 5MB). Example: /tmp/phpp1mf123miqh60k0Ndre

Liste des membres

requires authentication

Retourne la liste paginée des membres du tenant courant. Supporte la recherche, le filtrage et le tri.

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members?search=Kofi&status=active&group_id=&sponsor_id=&joined_from=2026-01-01&joined_to=2026-12-31&sort=member_number&order=asc&per_page=25" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members"
);

const params = {
    "search": "Kofi",
    "status": "active",
    "group_id": "",
    "sponsor_id": "",
    "joined_from": "2026-01-01",
    "joined_to": "2026-12-31",
    "sort": "member_number",
    "order": "asc",
    "per_page": "25",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'search' => 'Kofi',
            'status' => 'active',
            'group_id' => '',
            'sponsor_id' => '',
            'joined_from' => '2026-01-01',
            'joined_to' => '2026-12-31',
            'sort' => 'member_number',
            'order' => 'asc',
            'per_page' => '25',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/members

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

search   string  optional    

Recherche sur nom, prénom, email, numéro. Example: Kofi

status   string  optional    

Filtre statut : active, inactive, pending, suspended, honorary, deceased. Example: active

group_id   string  optional    

UUID du groupe.

sponsor_id   string  optional    

UUID du parrain.

joined_from   string  optional    

Date début adhésion (YYYY-MM-DD). Example: 2026-01-01

joined_to   string  optional    

Date fin adhésion (YYYY-MM-DD). Example: 2026-12-31

sort   string  optional    

Champ de tri : member_number, last_name, joined_at. Example: member_number

order   string  optional    

Ordre : asc ou desc. Example: asc

per_page   integer  optional    

Résultats par page (max 100). Example: 25

Créer un membre

requires authentication

Crée un nouveau membre. Le numéro de membre est généré automatiquement. Envoyer les fichiers en multipart/form-data.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/members" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "first_name=Kofi"\
    --form "last_name=Mensah"\
    --form "email=kofi@example.com"\
    --form "phone=+22997000000"\
    --form "gender=M"\
    --form "birth_date=1990-01-15"\
    --form "address=wgshlz"\
    --form "city=aedjxa"\
    --form "country=BJ"\
    --form "profession=izxgnx"\
    --form "status=pending"\
    --form "group_id="\
    --form "sponsor_id=4b9c5595-1c58-3e6a-9a54-8e9361992634"\
    --form "joined_at=2026-05-04T13:50:09"\
    --form "notes=architecto"\
    --form "photo=@/tmp/phplpmhm1q3qb1be2fPotQ" \
    --form "id_card=@/tmp/phpld6dgoqkoiso5PfQU1Z" 
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Tenant-Slug": "demo",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('first_name', 'Kofi');
body.append('last_name', 'Mensah');
body.append('email', 'kofi@example.com');
body.append('phone', '+22997000000');
body.append('gender', 'M');
body.append('birth_date', '1990-01-15');
body.append('address', 'wgshlz');
body.append('city', 'aedjxa');
body.append('country', 'BJ');
body.append('profession', 'izxgnx');
body.append('status', 'pending');
body.append('group_id', '');
body.append('sponsor_id', '4b9c5595-1c58-3e6a-9a54-8e9361992634');
body.append('joined_at', '2026-05-04T13:50:09');
body.append('notes', 'architecto');
body.append('photo', document.querySelector('input[name="photo"]').files[0]);
body.append('id_card', document.querySelector('input[name="id_card"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'first_name',
                'contents' => 'Kofi'
            ],
            [
                'name' => 'last_name',
                'contents' => 'Mensah'
            ],
            [
                'name' => 'email',
                'contents' => 'kofi@example.com'
            ],
            [
                'name' => 'phone',
                'contents' => '+22997000000'
            ],
            [
                'name' => 'gender',
                'contents' => 'M'
            ],
            [
                'name' => 'birth_date',
                'contents' => '1990-01-15'
            ],
            [
                'name' => 'address',
                'contents' => 'wgshlz'
            ],
            [
                'name' => 'city',
                'contents' => 'aedjxa'
            ],
            [
                'name' => 'country',
                'contents' => 'BJ'
            ],
            [
                'name' => 'profession',
                'contents' => 'izxgnx'
            ],
            [
                'name' => 'status',
                'contents' => 'pending'
            ],
            [
                'name' => 'group_id',
                'contents' => ''
            ],
            [
                'name' => 'sponsor_id',
                'contents' => '4b9c5595-1c58-3e6a-9a54-8e9361992634'
            ],
            [
                'name' => 'joined_at',
                'contents' => '2026-05-04T13:50:09'
            ],
            [
                'name' => 'notes',
                'contents' => 'architecto'
            ],
            [
                'name' => 'photo',
                'contents' => fopen('/tmp/phplpmhm1q3qb1be2fPotQ', 'r')
            ],
            [
                'name' => 'id_card',
                'contents' => fopen('/tmp/phpld6dgoqkoiso5PfQU1Z', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/members

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

first_name   string     

Prénom. Example: Kofi

last_name   string     

Nom de famille. Example: Mensah

email   string  optional    

Email (unique par tenant). Example: kofi@example.com

phone   string  optional    

Téléphone. Example: +22997000000

gender   string  optional    

Genre : M, F, other. Example: M

birth_date   string  optional    

Date de naissance (YYYY-MM-DD). Example: 1990-01-15

address   string  optional    

validation.max. Example: wgshlz

city   string  optional    

validation.max. Example: aedjxa

country   string  optional    

Code pays ISO alpha-2. Example: BJ

profession   string  optional    

validation.max. Example: izxgnx

status   string  optional    

Statut. Example: pending

group_id   string  optional    

UUID du groupe.

sponsor_id   string  optional    

validation.uuid The id of an existing record in the members table. Example: 4b9c5595-1c58-3e6a-9a54-8e9361992634

joined_at   string  optional    

validation.date. Example: 2026-05-04T13:50:09

notes   string  optional    

Example: architecto

photo   file  optional    

Photo membre (jpg/png, max 2MB). Example: /tmp/phplpmhm1q3qb1be2fPotQ

id_card   file  optional    

Pièce d'identité (jpg/png/pdf, max 5MB). Example: /tmp/phpld6dgoqkoiso5PfQU1Z

Détail d'un membre

requires authentication

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

GET api/v1/members/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Modifier un membre

requires authentication

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "first_name=vwgshl"\
    --form "last_name=zaedjx"\
    --form "email=rosenbaum.javonte@example.com"\
    --form "phone=xgnxor"\
    --form "gender=F"\
    --form "birth_date=2026-03-12"\
    --form "address=wgshlz"\
    --form "city=aedjxa"\
    --form "country=uu"\
    --form "profession=izxgnx"\
    --form "group_id=5b0c0231-0539-3fcd-86ff-38b36e835b89"\
    --form "sponsor_id=4b9c5595-1c58-3e6a-9a54-8e9361992634"\
    --form "joined_at=2026-05-04T13:50:09"\
    --form "notes=architecto"\
    --form "photo=@/tmp/phptoen5fts82a3cVdrNtV" \
    --form "id_card=@/tmp/phppnn0durqe4jueR6lxOg" 
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Tenant-Slug": "demo",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('first_name', 'vwgshl');
body.append('last_name', 'zaedjx');
body.append('email', 'rosenbaum.javonte@example.com');
body.append('phone', 'xgnxor');
body.append('gender', 'F');
body.append('birth_date', '2026-03-12');
body.append('address', 'wgshlz');
body.append('city', 'aedjxa');
body.append('country', 'uu');
body.append('profession', 'izxgnx');
body.append('group_id', '5b0c0231-0539-3fcd-86ff-38b36e835b89');
body.append('sponsor_id', '4b9c5595-1c58-3e6a-9a54-8e9361992634');
body.append('joined_at', '2026-05-04T13:50:09');
body.append('notes', 'architecto');
body.append('photo', document.querySelector('input[name="photo"]').files[0]);
body.append('id_card', document.querySelector('input[name="id_card"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'first_name',
                'contents' => 'vwgshl'
            ],
            [
                'name' => 'last_name',
                'contents' => 'zaedjx'
            ],
            [
                'name' => 'email',
                'contents' => 'rosenbaum.javonte@example.com'
            ],
            [
                'name' => 'phone',
                'contents' => 'xgnxor'
            ],
            [
                'name' => 'gender',
                'contents' => 'F'
            ],
            [
                'name' => 'birth_date',
                'contents' => '2026-03-12'
            ],
            [
                'name' => 'address',
                'contents' => 'wgshlz'
            ],
            [
                'name' => 'city',
                'contents' => 'aedjxa'
            ],
            [
                'name' => 'country',
                'contents' => 'uu'
            ],
            [
                'name' => 'profession',
                'contents' => 'izxgnx'
            ],
            [
                'name' => 'group_id',
                'contents' => '5b0c0231-0539-3fcd-86ff-38b36e835b89'
            ],
            [
                'name' => 'sponsor_id',
                'contents' => '4b9c5595-1c58-3e6a-9a54-8e9361992634'
            ],
            [
                'name' => 'joined_at',
                'contents' => '2026-05-04T13:50:09'
            ],
            [
                'name' => 'notes',
                'contents' => 'architecto'
            ],
            [
                'name' => 'photo',
                'contents' => fopen('/tmp/phptoen5fts82a3cVdrNtV', 'r')
            ],
            [
                'name' => 'id_card',
                'contents' => fopen('/tmp/phppnn0durqe4jueR6lxOg', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/v1/members/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Body Parameters

first_name   string  optional    

validation.max. Example: vwgshl

last_name   string  optional    

validation.max. Example: zaedjx

email   string  optional    

validation.email validation.max. Example: rosenbaum.javonte@example.com

phone   string  optional    

validation.max. Example: xgnxor

gender   string  optional    

Example: F

Must be one of:
  • M
  • F
  • other
birth_date   string  optional    

validation.date validation.before. Example: 2026-03-12

address   string  optional    

validation.max. Example: wgshlz

city   string  optional    

validation.max. Example: aedjxa

country   string  optional    

validation.size. Example: uu

profession   string  optional    

validation.max. Example: izxgnx

group_id   string  optional    

validation.uuid The id of an existing record in the member_groups table. Example: 5b0c0231-0539-3fcd-86ff-38b36e835b89

sponsor_id   string  optional    

validation.uuid The id of an existing record in the members table. Must not be one of . Example: 4b9c5595-1c58-3e6a-9a54-8e9361992634

joined_at   string  optional    

validation.date. Example: 2026-05-04T13:50:09

notes   string  optional    

Example: architecto

photo   file  optional    

Must be a file. validation.max. Example: /tmp/phptoen5fts82a3cVdrNtV

id_card   file  optional    

Must be a file. validation.max. Example: /tmp/phppnn0durqe4jueR6lxOg

Supprimer un membre (soft delete)

requires authentication

Example request:
curl --request DELETE \
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000"
);

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


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

DELETE api/v1/members/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Restaurer un membre supprimé

requires authentication

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/restore" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/restore"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/restore';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/members/{id}/restore

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Changer le statut d'un membre

requires authentication

Example request:
curl --request PUT \
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/status" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"active\",
    \"reason\": \"Cotisations à jour\"
}"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/status"
);

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

let body = {
    "status": "active",
    "reason": "Cotisations à jour"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/status';
$response = $client->put(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'status' => 'active',
            'reason' => 'Cotisations à jour',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

PUT api/v1/members/{id}/status

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Body Parameters

status   string     

Nouveau statut : active, inactive, suspended, honorary, deceased. Example: active

reason   string  optional    

Raison du changement (optionnel). Example: Cotisations à jour

Télécharger la carte membre PDF

requires authentication

Génère et retourne la carte membre au format PDF (A6 paysage). Le QR code intégré pointe vers l'endpoint de vérification publique.

Example request:
curl --request GET \
    --get "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200, Carte PDF):


file {"description": "Fichier PDF de la carte membre"}
 

Request      

GET api/v1/members/{id}/card

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000

Régénérer le token QR code de la carte

requires authentication

Invalide l'ancien QR code et génère un nouveau token.

Example request:
curl --request POST \
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card/regenerate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Tenant-Slug: demo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card/regenerate"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-assovix.gestiem.com/api/v1/members/550e8400-e29b-41d4-a716-446655440000/card/regenerate';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Tenant-Slug' => 'demo',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (500):

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

{
    "success": false,
    "message": "Erreur serveur.",
    "data": null,
    "errors": [],
    "meta": {
        "timestamp": "2026-05-04T13:50:09+00:00",
        "version": "v1"
    }
}
 

Request      

POST api/v1/members/{id}/card/regenerate

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

X-Tenant-Slug        

Example: demo

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

UUID du membre. Example: 550e8400-e29b-41d4-a716-446655440000