API v3 — Active

Documentation API CKAN

Accédez aux données ouvertes du portail transport via une API REST puissante. Recherchez, filtrez et intégrez les jeux de données dans vos applications.


Vue d'ensemble

L'API Action CKAN v3 — une interface REST complète

Version API
v3
Action API (stable)
Format
JSON
Requêtes & réponses
Méthodes
GET / POST
Lecture & écriture
Auth
Token
Header Authorization
BASE URL https://catalogue-data.transport.tn/api/3/action/

L'API CKAN expose toutes les fonctionnalités du portail de données ouvertes via des endpoints REST. Vous pouvez lister les jeux de données, rechercher des ressources, interroger le DataStore avec des filtres SQL, et gérer vos organisations — tout cela de façon programmatique.

Chaque réponse retourne un objet JSON avec trois clés : success, result et help.

Démarrage rapide

Votre première requête API en 30 secondes

Commencez par lister tous les jeux de données disponibles sur le portail :

# Lister tous les jeux de données
curl https://catalogue-data.transport.tn/api/3/action/package_list

# Rechercher avec un terme
curl https://catalogue-data.transport.tn/api/3/action/package_search \
  -d '{"q": "transport", "rows": 5}'
import requests

# Lister tous les jeux de données
response = requests.get(
    "https://catalogue-data.transport.tn/api/3/action/package_list"
)
datasets = response.json()["result"]

# Rechercher des datasets sur le transport
search = requests.post(
    "https://catalogue-data.transport.tn/api/3/action/package_search",
    json={"q": "transport", "rows": 5}
)
print(search.json()["result"]["results"])
// Lister tous les jeux de données
const resp = await fetch(
  "https://catalogue-data.transport.tn/api/3/action/package_list"
);
const { result } = await resp.json();

// Recherche avancée
const search = await fetch(
  "https://catalogue-data.transport.tn/api/3/action/package_search", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ q: "transport", rows: 5 })
});
library(httr2)

req <- request("https://catalogue-data.transport.tn/api/3/action/package_list")
result <- req %>%
  req_perform() %>%
  resp_body_json()

print(result$result)
# Lister tous les jeux de données
$response = Invoke-RestMethod "https://catalogue-data.transport.tn/api/3/action/package_list"
$response.result

# Recherche avec filtre
$body = @{ q = "transport"; rows = 5 } | ConvertTo-Json
$search = Invoke-RestMethod "https://catalogue-data.transport.tn/api/3/action/package_search" `
  -Method Post -Body $body -ContentType "application/json"
200 OK — Réponse type
{
  "help": "https://catalogue-data.transport.tn/api/3/action/help_show?name=package_list",
  "success": true,
  "result": [
    "lignes-de-bus-tunis",
    "horaires-metro-leger",
    "stations-louage-interurbain",
    "reseau-train-banlieue-sncft"
  ]
}

Authentification

Tokens API pour les opérations d'écriture

Les endpoints de lecture (GET) sont accessibles sans authentification. Un API Token est requis uniquement pour les opérations de création, modification ou suppression.

Depuis CKAN 2.9, les tokens API remplacent les anciennes clés API. Générez votre token depuis votre profil utilisateur sur le portail.

# Passer le token dans le header Authorization
curl https://catalogue-data.transport.tn/api/3/action/package_create \
  -H "Authorization: VOTRE_API_TOKEN" \
  -d '{"name": "mon-dataset", "title": "Mon jeu de données"}'
import requests

API_TOKEN = "votre-token-ici"
BASE = "https://catalogue-data.transport.tn/api/3/action"

response = requests.post(
    f"{BASE}/package_create",
    headers={"Authorization": API_TOKEN},
    json={
        "name": "mon-dataset",
        "title": "Mon jeu de données",
        "owner_org": "transport-tunisie"
    }
)
const API_TOKEN = "votre-token-ici";

const resp = await fetch(
  "https://catalogue-data.transport.tn/api/3/action/package_create", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": API_TOKEN
    },
    body: JSON.stringify({
      name: "mon-dataset",
      title: "Mon jeu de données"
    })
});

Jeux de données (Packages)

CRUD complet sur les datasets du portail

GET /api/3/action/package_list

Retourne la liste de tous les noms de jeux de données disponibles sur le portail.

ParamètreTypeDescription
limit optintNombre max de résultats
offset optintDécalage pour la pagination
GET /api/3/action/package_show?id={id}

Retourne les métadonnées complètes d'un jeu de données, incluant ses ressources, tags et organisation.

ParamètreTypeDescription
id requisstringNom ou UUID du dataset
POST /api/3/action/package_search

Recherche dans les jeux de données avec un moteur Solr supportant les filtres, facettes et tri.

ParamètreTypeDescription
q optstringRequête de recherche (syntaxe Solr)
fq optstringFiltre query (ex: organization:transport)
sort optstringTri (ex: name asc)
rows optintNombre de résultats (défaut: 10)
start optintOffset de pagination
facet.field optlistChamps pour les facettes
POST /api/3/action/package_create

Crée un nouveau jeu de données. Nécessite un token d'authentification.

ParamètreTypeDescription
name requisstringIdentifiant unique (slug, minuscules)
title optstringTitre lisible
owner_org optstringID de l'organisation propriétaire
notes optstringDescription (Markdown supporté)

Ressources

Fichiers et URLs attachés aux jeux de données

GET /api/3/action/resource_show?id={id}

Retourne les métadonnées d'une ressource (URL, format, taille, date de modification).

ParamètreTypeDescription
id requisstringUUID de la ressource
GET /api/3/action/resource_search?query={field:term}

Recherche de ressources par champ. (ex: format:CSV, name:horaires)

ParamètreTypeDescription
query requisstringRecherche au format champ:valeur
limit optintNombre max de résultats

DataStore API

Requêtes structurées sur les données tabulaires

Le DataStore permet d'interroger directement les données CSV/XLS chargées dans CKAN, avec filtres, tri, et même des requêtes SQL complètes.

POST /api/3/action/datastore_search

Recherche dans les données d'une ressource DataStore. Supporte la recherche full-text, les filtres par champs et la pagination.

ParamètreTypeDescription
resource_id requisstringUUID de la ressource
q optstringRecherche full-text sur tous les champs
filters optobjectFiltres par champ : {"ville": "Tunis"}
limit optintNombre de résultats (défaut: 100)
offset optintOffset pour pagination
sort optstringTri (ex: "nom asc")
curl https://catalogue-data.transport.tn/api/3/action/datastore_search \
  -H "Authorization: $API_TOKEN" \
  -d '{
  "resource_id": "RESOURCE_UUID",
  "limit": 5,
  "q": "tunis"
}'
from ckanapi import RemoteCKAN

rc = RemoteCKAN("https://catalogue-data.transport.tn", apikey=API_TOKEN)
result = rc.action.datastore_search(
    resource_id="RESOURCE_UUID",
    limit=5,
    q="tunis"
)
print(result["records"])
const resp = await fetch(
  "https://catalogue-data.transport.tn/api/3/action/datastore_search", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": API_TOKEN
    },
    body: JSON.stringify({
      resource_id: "RESOURCE_UUID",
      limit: 5,
      q: "tunis"
    })
});
POST /api/3/action/datastore_search_sql

Exécute des requêtes SQL en lecture seule (SELECT) sur les données du DataStore.

ParamètreTypeDescription
sql requisstringRequête SQL (SELECT uniquement)

Seules les requêtes SELECT sont autorisées. Les identifiants de ressources doivent être entre guillemets doubles dans le SQL.

Testez l'API en direct

Exécutez des requêtes depuis cette page

Veuillez valider le captcha

        


      

Codes d'erreur

Comprendre les réponses d'erreur

200
OK Succès — success: true
400
Bad Request Requête mal formée ou paramètres invalides
403
Forbidden Token absent ou invalide
404
Not Found Ressource ou dataset introuvable
409
Conflict Conflit (nom déjà existant)
500
Server Error Erreur serveur interne

Attention : CKAN retourne toujours un HTTP 200 même en cas d'erreur logique. C'est le champ "success": false qui indique l'échec. Les codes HTTP 400/403/409/500 n'apparaissent que pour les erreurs de format graves. Vérifiez donc toujours le champ success dans chaque réponse.

Exemple de réponse d'erreur :

{
  "help": "...",
  "success": false,
  "error": {
    "__type": "Authorization Error",
    "message": "Access denied"
  }
}

Documentation officielle CKAN

Ressources complètes et références

CKAN v2.11 — Documentation en ligne

Retrouvez la référence complète de l'API Action, le guide du DataStore, et toutes les fonctions disponibles.

Guide API Action

Référence complète de toutes les fonctions : get, create, update, delete, patch.

docs.ckan.org/en/latest/api →

DataStore & DataPusher

Guide du DataStore pour les requêtes sur données structurées et import automatique.

DataStore Documentation →

ckanapi — Client Python

Bibliothèque Python officielle pour interagir avec CKAN de manière simple et robuste.

github.com/ckan/ckanapi →