API RhinoTendersBETA
Consommez le catalogue d'annonces de façon programmatique, dans les limites de votre propre plan d'abonnement.
Documentation pour agents IA (.txt)Introduction
L'API de données RhinoTenders permet à vos propres intégrations de récupérer le catalogue d'annonces auquel vous avez déjà accès via votre abonnement : vérification de statut, liste, filtres, organismes et détail d'une annonce.
C'est une API REST en lecture seule (tous les endpoints sont en GET). L'accès doit être activé par un administrateur RhinoTenders pour votre compte, puis vous générez vous-même votre token depuis votre espace API.
Authentification
Chaque requête doit inclure votre token en Bearer dans l'en-tête Authorization :
Authorization: Bearer <your_token>Votre token n'est affiché qu'une seule fois, à sa génération (ou régénération) depuis le dashboard — conservez-le en lieu sûr, il ne peut plus être récupéré ensuite.
Statut
/api/v1/data/statusVérifie que votre token est valide et retourne en un seul appel l'état de votre accès API, de votre abonnement et de votre quota. Utile pour vérifier votre intégration. Appel libre, ne consomme aucun quota.
Requête
curl -H "Authorization: Bearer <your_token>" \
"https://api.rhinotenders.com/api/v1/data/status"Réponse
{
"success": true,
"data": {
"token": { "name": "api-client", "created_at": "2026-08-01T10:00:00Z", "expires_at": "2027-08-01T10:00:00Z" },
"api_access": { "active": true },
"subscription": { "plan": "Standard", "status": "active" },
"quota": {
"daily": { "limit": 100, "used": 7, "remaining": 93, "resets_at": "2026-09-24T00:00:00Z" },
"total": { "limit": null, "used": null, "remaining": null }
}
}
}Liste des annonces
/api/v1/data/tendersRetourne les annonces correspondant aux filtres donnés. Mêmes paramètres que la recherche du site (recherche texte, activité, localisation, statut, type, organisme, dates). Les filtres avancés (organisme, date de fin) sont ignorés silencieusement si votre plan n'y donne pas accès — jamais d'erreur. Appel libre, ne consomme aucun quota, mais bloqué (403) si votre abonnement n'est pas actif ou si votre quota de consultation est déjà épuisé.
| tender_id | Un seul ID d'annonce — ignore tous les autres filtres. |
| tender_ids | Plusieurs ID séparés par des virgules — ignore tous les autres filtres. |
| search | Recherche texte (titre, code). |
| activity_id | ID(s) d'activité, séparés par des virgules. |
| location_id | ID(s) de localisation, séparés par des virgules. |
| status_id | ID(s) de statut, séparés par des virgules. |
| organism_id | ID(s) d'organisme — filtre avancé, ignoré si non autorisé par votre plan. |
| tender_type | National, International, ou les deux séparés par une virgule. |
| publish_date_start / publish_date_end | Plage de date de publication (AAAA-MM-JJ). |
| ending_date_start / ending_date_end | Plage de date limite — filtre avancé, ignoré si non autorisé par votre plan. |
| page / per_page | Pagination — per_page par défaut 20, plafond 100. |
Requête
curl -H "Authorization: Bearer <your_token>" \
"https://api.rhinotenders.com/api/v1/data/tenders?page=1&per_page=20&activity_id=12000000"Réponse
{
"success": true,
"data": [
{
"id": 1490301,
"title": "Etude et suivi realisation de 4 classes en extention",
"organism": { "id": 3358, "name": "APC - Commune d'El Milia Wilaya de Jijel" },
"location": { "id": 20, "name": "Jijel" },
"status": { "id": 4, "name": "Résultats" },
"publish_date": "2026-09-09",
"ending_date": "2026-09-20T08:00:00Z"
}
],
"meta": { "current_page": 1, "per_page": 20, "total": 187 }
}Données de filtre
/api/v1/data/tenders/filtersDonnées de référence pour construire vos filtres : activités, statuts, localisations, types. Un seul objet complet (pas de pagination), caché 1 à 2h côté serveur. hasAdvancedFilters reflète votre plan d'abonnement.
Requête
curl -H "Authorization: Bearer <your_token>" \
"https://api.rhinotenders.com/api/v1/data/tenders/filters"Réponse
{
"success": true,
"data": {
"locations": [{ "id": 20, "name": "Jijel", "type": "wilaya", "flag": null, "country_name": "Algérie" }],
"statuses": [{ "id": 4, "name": "Résultats" }],
"activities": [{ "id": 7233, "name": "[72110000] - Travaux de bâtiment" }],
"types": [
{ "value": "National", "label": "National" },
{ "value": "International", "label": "International" }
],
"hasAdvancedFilters": true
}
}Organismes
/api/v1/data/organizationsRecherche d'organismes par nom (q, insensible aux accents/casse) pour résoudre un organism_id à utiliser dans le filtre de la liste, ou pagination complète pour synchroniser l'annuaire. Uniquement les organismes ayant déjà publié au moins une annonce — jamais l'intégralité de l'annuaire interne.
| q | Recherche par nom, insensible aux accents/casse. |
| page / per_page | Pagination — per_page par défaut 50, plafond 500. |
Requête
curl -H "Authorization: Bearer <your_token>" \
"https://api.rhinotenders.com/api/v1/data/organizations?q=education&per_page=50"Réponse
{
"success": true,
"data": [
{ "id": 42, "name": "Ministère de l'Éducation" }
],
"meta": { "current_page": 1, "per_page": 50, "total": 3 }
}Détail d'une annonce
/api/v1/data/tenders/{id}Détail complet d'une annonce. Consomme une unité du quota de votre abonnement — exactement le même quota que la consultation sur le site (une annonce déjà vue, via l'API ou le site, n'est pas recomptée dans les 12 mois). Exception : les annonces de type "Consultation en ligne" et les annonces expirées depuis plus de 10 jours sont en accès libre, sans consommation. La forme de la réponse dépend du statut de l'annonce (voir les deux exemples ci-dessous).
Requête
curl -H "Authorization: Bearer <your_token>" \
"https://api.rhinotenders.com/api/v1/data/tenders/1490301"Réponse — Annonce standard
{
"success": true,
"data": {
"id": 1490301,
"slug": "etude-et-suivi-realisation-de-4-classes-en-extention",
"title": "Etude et suivi realisation de 4 classes en extention",
"code": "07/2026",
"publish_date": "2026-09-09",
"ending_date": "2026-09-20T08:00:00Z",
"is_expired": true,
"status": { "id": 4, "name": "Résultats" },
"tender_type": "National",
"qualification": null,
"address_cdc": "Étude de Maître Belhadj Ali, huissier de justice, Boumerdès",
"cdc_price": { "amount": "16000000.00", "currency": "DZD" },
"organism": { "id": 3358, "name": "APC - Commune d'El Milia Wilaya de Jijel" },
"location": { "id": 20, "name": "Jijel", "type": null, "country_id": null },
"activities": [
{ "id": 7233, "name": "[72110000] - Travaux de bâtiment" }
],
"lots": [
{
"id": 536288,
"name": "Etude et suivi realisation de 4 classes en extention",
"entreprise": "Entreprise travaux batiment Beldjoudi Samir",
"nif": null,
"montant": "22730697.89",
"devise": "DZD",
"delai": 5,
"delai_unit": "m",
"order": 0
}
]
},
"subscription": {
"daily": { "limit": 100, "used": 8, "remaining": 92, "resets_at": "2026-09-24T00:00:00Z" },
"total": { "limit": null, "used": null, "remaining": null }
}
}Réponse — Consultation en ligne (statut 9)
{
"success": true,
"data": {
"id": 1487429,
"slug": "invitation-to-competitive-bidding-projet-ao-202677-058",
"title": "Invitation to Competitive Bidding | Projet AO_2026/77_058",
"publish_date": "2026-09-07",
"ending_date": "2026-09-30T23:45:00Z",
"is_expired": false,
"organism": { "id": 19321, "name": "General Electric Algeria Turbines (« GEAT »)" },
"location": { "id": 2, "name": "Algérie" },
"status": { "id": 9, "name": "Consultation en ligne" },
"activities": [
{ "id": 7182, "name": "[40180000] - Tubes et raccords" }
]
},
"subscription": {
"daily": { "limit": 100, "used": 8, "remaining": 92, "resets_at": "2026-09-24T00:00:00Z" },
"total": { "limit": null, "used": null, "remaining": null }
}
}Codes d'erreur
| Statut | Signification |
|---|---|
| 401 | Token manquant, invalide, expiré ou révoqué (message générique, jamais de distinction). |
| 403 (api_access_disabled) | Accès API désactivé pour ce compte par un administrateur. |
| 403 (ability) | Capacité (ability) manquante sur le token. |
| 403 (subscription_inactive) | Aucun abonnement actif ne donne accès au catalogue. |
| 403 (quota_exceeded) | Quota d'abonnement épuisé pour la consultation d'annonces. |
| 404 | Annonce introuvable, non accessible, ou route invalide. |
| 422 | Paramètres de requête invalides (détail dans errors). |
| 429 | Limite de débit dépassée (30 requêtes/minute). |
Limites de débit
En plus du quota de votre abonnement (qui ne s'applique qu'aux appels de détail d'annonce), une limite technique de 30 requêtes par minute protège l'API contre les abus.
Cette limite est partagée entre tous les endpoints /v1/data pour votre compte (pas une limite séparée par endpoint). Une réponse 429 inclut les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et Retry-After.
