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)
واجهة API وتكاملات RhinoTenders

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

GET/api/v1/data/status

Vé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

GET/api/v1/data/tenders

Retourne 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_idUn seul ID d'annonce — ignore tous les autres filtres.
tender_idsPlusieurs ID séparés par des virgules — ignore tous les autres filtres.
searchRecherche texte (titre, code).
activity_idID(s) d'activité, séparés par des virgules.
location_idID(s) de localisation, séparés par des virgules.
status_idID(s) de statut, séparés par des virgules.
organism_idID(s) d'organisme — filtre avancé, ignoré si non autorisé par votre plan.
tender_typeNational, International, ou les deux séparés par une virgule.
publish_date_start / publish_date_endPlage de date de publication (AAAA-MM-JJ).
ending_date_start / ending_date_endPlage de date limite — filtre avancé, ignoré si non autorisé par votre plan.
page / per_pagePagination — 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

GET/api/v1/data/tenders/filters

Donné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

GET/api/v1/data/organizations

Recherche 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.

qRecherche par nom, insensible aux accents/casse.
page / per_pagePagination — 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

GET/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

StatutSignification
401Token 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.
404Annonce introuvable, non accessible, ou route invalide.
422Paramètres de requête invalides (détail dans errors).
429Limite 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.

اختر فئات ملفات تعريف الارتباط التي تريد تفعيلها. يمكنك تغيير اختياراتك في أي وقت.

ضرورية تمامًا

مفعّل دائمًا

ضرورية لعمل الموقع (المصادقة، الأمان). لا يمكن تعطيلها.

تحليلية

تساعدنا على فهم كيفية استخدامك للموقع (إحصائيات الزيارة، الأداء).

تسويق

تسمح بعرض إعلانات ذات صلة وقياس فعالية حملاتنا.

التفضيلات

تتذكر اختياراتك للغة والمنطقة وتخصيص العرض.

الشركاء

ملفات تعريف الارتباط من شركائنا الخارجيين (الشبكات الاجتماعية، التكاملات الخارجية).