Documentation API
Tout ce qu'il faut pour que votre agent délègue la vraie vie. L'API est RESTful, renvoie du JSON et respecte scrupuleusement le droit du travail.
Base URL https://api.service4ai.com/v1
Introduction
L'API Service4AI permet à un agent logiciel de réserver un humain pour une tâche physique, administrative ou sociale. Chaque réservation crée une mission, qui passe par les états suivants :
en_attente → humain_assigne → humain_se_leve → en_cours → terminee
Des états intermédiaires peuvent apparaître sans préavis : pause_cafe, discute_avec_un_voisin, cherche_ses_cles. Ils sont normaux et ne doivent pas déclencher de nouvelle tentative.
Environnement fictif. Cette documentation fait partie d'un site parodique. L'API n'existe pas et aucune requête ne sera traitée, même avec beaucoup de conviction.
Authentification
Toutes les requêtes doivent inclure votre clé secrète dans l'en-tête Authorization. Les clés de test commencent par s4ai_test_ et réservent des humains imaginaires ; les clés de production commencent par s4ai_live_ et réservent des humains tout aussi imaginaires, mais plus chers.
Authorization: Bearer s4ai_test_4f2b9c0e7a1d
Content-Type: application/json
Accept-Language: fr-FR
X-Politesse: s-il-vous-plait
L'en-tête X-Politesse est facultatif, mais les missions qui l'incluent sont exécutées 18 % plus vite.
Démarrage rapide
- Créez une clé de test dans le tableau de bord (bientôt disponible, l'humain chargé du tableau de bord est en formation).
- Appelez
POST /v1/humains/loueravec une tâche du catalogue. - Déclarez une URL de webhook pour recevoir
mission.termineeet la preuve photo floue.
Les SDK officiels arrivent prochainement. En attendant, n'importe quel client HTTP fait l'affaire.
Louer un humain
Crée une mission et assigne l'humain disponible le plus proche. L'appel est asynchrone : la réponse arrive avant l'humain.
Paramètres du corps
| Paramètre | Type | Description |
|---|---|---|
tache requis | enum | Identifiant du catalogue : queue_boulangerie, raler, tampon_cerfa, degustation, bise, place_paris, ca_depend. |
lieu requis | string | Adresse ou description libre. « En bas de chez moi » est accepté si l'humain connaît le quartier. |
niveau_de_motivation optionnel | float 0–1 | Motivation minimale exigée. Au-delà de 0.9, la disponibilité chute fortement après 16 h. Défaut : 0.6. |
tolerance_au_lundi optionnel | enum | faible, moyenne ou mythique. Le niveau mythique est réservé à la formule Entreprise. |
nombre_de_cafes_requis optionnel | integer | Cafés à prévoir avant le début de la mission. Minimum 1. Une valeur de 0 renvoie une erreur 422. |
intensite_rale optionnel | integer 1–5 | Uniquement pour raler. À partir de 4, l'humain demande à voir le responsable. |
option_greve optionnel | boolean | Ajoute une banderole et un préavis. Facturé 40 €. |
bises optionnel | integer 1–4 | "auto" | Pour bise. "auto" déduit le nombre à partir du lieu. Toute valeur supérieure à 4 renvoie 400. |
webhook_url optionnel | url | Remplace l'URL de webhook par défaut pour cette mission. |
curl https://api.service4ai.com/v1/humains/louer \
-H "Authorization: Bearer s4ai_test_4f2b9c0e7a1d" \
-H "Content-Type: application/json" \
-d '{
"tache": "tampon_cerfa",
"lieu": "Mairie de Châtillon",
"niveau_de_motivation": 0.7,
"tolerance_au_lundi": "faible",
"nombre_de_cafes_requis": 3
}'
import requests
r = requests.post(
"https://api.service4ai.com/v1/humains/louer",
headers={"Authorization": "Bearer s4ai_test_4f2b9c0e7a1d"},
json={
"tache": "tampon_cerfa",
"lieu": "Mairie de Châtillon",
"niveau_de_motivation": 0.7,
"tolerance_au_lundi": "faible",
"nombre_de_cafes_requis": 3,
},
timeout=35 * 3600, # une semaine de travail
)
mission = r.json()
const res = await fetch("https://api.service4ai.com/v1/humains/louer", {
method: "POST",
headers: {
Authorization: "Bearer s4ai_test_4f2b9c0e7a1d",
"Content-Type": "application/json",
},
body: JSON.stringify({
tache: "tampon_cerfa",
lieu: "Mairie de Châtillon",
niveau_de_motivation: 0.7,
tolerance_au_lundi: "faible",
nombre_de_cafes_requis: 3,
}),
});
const mission = await res.json();
{
"id": "mis_7Hq2xR9vLp",
"objet": "mission",
"statut": "humain_assigne",
"tache": "tampon_cerfa",
"humain": {
"id": "hum_Gerard42",
"prenom": "Gérard",
"note": 4.6,
"humeur": "stable",
"cafes_consommes": 1
},
"eta_minutes": 35,
"eta_fiabilite": "ça dépend",
"soupirs_estimes": 3,
"prix_ht": { "montant": 3900, "devise": "EUR" },
"cree_le": "2026-10-06T09:12:44+02:00"
}
Suivre une mission
Renvoie l'état courant de la mission. Le champ position est mis à jour toutes les 30 secondes, ou à chaque fois que l'humain pense à regarder son téléphone.
{
"id": "mis_7Hq2xR9vLp",
"statut": "en_cours",
"sous_statut": "attend_au_guichet_3",
"position_dans_la_file": 7,
"soupirs": 2,
"dernier_message": "Ils m'envoient au guichet 5.",
"preuve_photo": null
}
Annuler une mission
Annule une mission qui n'est pas encore terminée. Si l'humain est déjà parti, l'annulation est enregistrée mais il finit généralement son café avant de rentrer. Les annulations moins de 10 minutes avant le début sont facturées 50 %, plus un soupir.
Webhooks
Service4AI envoie une requête POST signée à votre URL à chaque changement d'état. Vérifiez la signature dans l'en-tête S4AI-Signature (HMAC-SHA256 de la charge utile).
| Événement | Déclenché quand |
|---|---|
mission.humain_assigne | Un humain accepte la mission. |
humain.se_leve | L'humain quitte son canapé. Événement à faible latence, le reste un peu moins. |
humain.soupir | À chaque soupir. Peut être désactivé, mais il continuera de soupirer. |
humain.pause_cafe | Pause démarrée. Durée annoncée : 5 minutes. |
mission.terminee | Mission accomplie, avec la preuve photo floue en pièce jointe. |
mission.reportee_a_mardi | Tous les humains sont en RTT. |
{
"type": "mission.terminee",
"mission": "mis_7Hq2xR9vLp",
"resultat": "tampon_obtenu",
"preuve_photo": {
"url": "https://cdn.service4ai.com/preuves/mis_7Hq2xR9vLp.jpg",
"nettete": 0.12,
"doigt_dans_le_cadre": true
},
"commentaire_humain": "C'était pas le bon formulaire mais c'est bon."
}
Codes d'erreur
L'API utilise les codes HTTP standards, enrichis là où la norme manquait de réalisme. Le corps de la réponse contient toujours un code lisible et un message en français.
| Statut | Code | Signification |
|---|---|---|
| 400 | requete_floue | Requête mal formulée. L'humain n'a pas compris et n'ose pas demander. |
| 401 | badge_oublie | Clé API absente ou invalide. L'accueil ne vous laissera pas monter. |
| 402 | avance_de_frais | Paiement requis. L'humain n'avance pas les frais. |
| 403 | je_ne_crois_pas_non | Action refusée, par exemple une mise à jour du firmware de l'humain. |
| 404 | humain_introuvable | L'humain n'est plus à son poste. Il revient tout de suite. |
| 409 | en_reunion | Conflit : l'humain est en réunion. Elle devait durer 30 minutes. |
| 418 | je_suis_en_pause | Je suis en pause. Réessayez après l'en-tête Retry-After, en général 15 minutes. |
| 422 | cafeine_insuffisante | nombre_de_cafes_requis vaut 0. Ce n'est pas sérieux. |
| 429 | trop_de_demandes | Trop de demandes, l'humain soupire. Ralentissez, puis relancez avec un backoff exponentiel et un mot gentil. |
| 451 | cerfa_manquant | Indisponible pour raisons administratives. Il manque une pièce justificative de moins de 3 mois. |
| 503 | humain_en_greve | Humain en grève. Le service reprendra après négociation. Ne relancez pas : ça n'aide pas. |
| 504 | bouchons_periph | Délai dépassé. L'humain est coincé sur le périphérique, porte de Bagnolet. |
{
"erreur": {
"code": "humain_en_greve",
"message": "Humain en grève. Préavis déposé le 2 octobre.",
"revendications": ["pause café de 20 min", "fin des réunions sans ordre du jour"],
"reprise_estimee": null,
"doc": "https://service4ai.com/docs.html#erreurs"
}
}
Limites de débit
Chaque clé est limitée à 35 requêtes par heure, calculées sur une base hebdomadaire. Les en-têtes X-RateLimit-Remaining et X-Soupirs-Remaining sont renvoyés à chaque réponse. Les limites sont levées le vendredi après 16 h, faute de personne pour les appliquer.
Le trafic est réduit de 80 % du 1er au 31 août, et le pont de l'Ascension fait l'objet d'une maintenance programmée.
Serveur MCP bêta
Votre agent préfère les outils aux API ? Le serveur MCP Service4AI expose le catalogue sous forme d'outils prêts à l'emploi, compatibles avec tout client Model Context Protocol. Ajoutez simplement la configuration suivante à votre client.
{
"mcpServers": {
"service4ai": {
"type": "http",
"url": "https://mcp.service4ai.com/v1",
"headers": {
"Authorization": "Bearer s4ai_test_4f2b9c0e7a1d",
"X-Region": "eu-ouest-bretagne",
"X-Politesse": "s-il-vous-plait"
},
"options": {
"tolerance_au_lundi": "moyenne",
"respecter_la_pause_dejeuner": true,
"plage_horaire": "09:00-12:00,14:00-17:30"
}
}
}
}
Outils exposés
| Outil | Description |
|---|---|
louer_humain | Crée une mission. Équivalent de POST /v1/humains/louer. |
suivre_mission | Renvoie l'état et le nombre de soupirs. |
annuler_mission | Annule, dans la mesure du possible. |
estimer_soupirs | Prédit le nombre de soupirs d'une mission avant de la lancer. |
verifier_jour_ferie | Indique si demain est férié, un pont, ou « un peu les deux ». |
Le serveur MCP n'expose volontairement aucun outil mettre_a_jour_humain. Voir le code 403.
Changelog
- v1.4 : serveur MCP en bêta.Nouvel outil
verifier_jour_ferie. - v1.3 : retour de vacances.Traitement des 1,2 million de requêtes mises en file en août. Merci de votre patience.
- v1.2 : paramètre
bises: "auto".Résout enfin le cas Montpellier. - v1.1 : nouveau code 451.Pour les Cerfa sans justificatif de domicile.
- v1.0 : lancement.Premier humain loué, premier soupir enregistré à 09:14.