API Monitolink
Intégrez le monitoring de backlinks directement dans vos outils et pipelines SEO.
Authentification
Chaque compte dispose d'une clé API unique, visible dans Mon compte → Clé API.
Ajoutez-la dans le header de chaque requĂŞte :
Authorization: Bearer ml_votre_cle_api
https://app.monito.link/api/v1/Rate limits
1 000 requêtes par jour par clé API. Au-delà , vous recevrez une réponse 429.
Codes erreur
| Code | Signification |
|---|---|
400 | Paramètres invalides / erreur de validation |
401 | Clé API manquante, invalide ou désactivée |
403 | Quota d'articles suivis dépassé (plan) |
404 | Ressource introuvable |
409 | Conflit — tous les backlinks sont déjà monitorés |
429 | Rate limit atteint |
500 | Erreur serveur |
GET /quota/
Retourne le plan, le nombre de sites disponibles et le nombre d'articles suivis (= backlinks des batches actifs). Permet de vérifier la capacité restante avant de poser des backlinks.
// Réponse
{
"plan": "pro",
"plan_status": "active",
"is_unlimited": false,
"user_email": "user@example.com",
"sites": { "used": 2, "max": 3, "left": 1 },
"backlinks": { "used": 320, "max": 500, "left": 180 }
}
Champs
| Champ | Description |
|---|---|
sites.used | Sites (campagnes) déjà créés |
backlinks.used | Articles suivis = backlinks des batches actifs non expirés |
*.max / *.left | Limite du plan et capacité restante. null si compte illimité (is_unlimited: true). |
GET /batches/
Liste des batches avec pagination.
Paramètres query
| Param | Type | Description |
|---|---|---|
active | string | true ou false — filtrer par statut |
page | int | Numéro de page (défaut : 1) |
per_page | int | Résultats par page (défaut : 20, max : 100) |
POST /batches/
Créer un batch de backlinks à monitorer. Le monitoring est persistant : il continue tant que l'article sponsorisé existe et que l'abonnement est actif. Chaque backlink compte comme un article suivi et est décompté du quota du plan.
GET /quota/ avant de poster. Si le quota d'articles suivis est dépassé, l'API renvoie 403 backlinks_quota_exceeded et le batch n'est pas créé.Body JSON
{
"backlinks": [
{
"url_publication": "https://blog.com/article",
"ancre": "mon ancre",
"url_destination": "https://monsite.com/page"
}
]
}
Paramètres
| Champ | Requis | Description |
|---|---|---|
backlinks | Oui | Liste d'objets (max 10 000). Chaque objet : url_publication, ancre, url_destination (tous requis). |
Réponse 201
{
"batch": { "id": "uuid...", ... },
"backlinks_created": 45,
"duplicates_skipped": 2,
"backlinks_used": 365,
"backlinks_left": 135
}
GET /batches/{uuid}/
Détails d'un batch avec statistiques (ok, warning, error, pending) et stats d'indexation.
DELETE /batches/{uuid}/
Stoppe le monitoring d'un batch. Les articles correspondants sont libérés du quota.
GET /batches/{uuid}/backlinks/
Liste des backlinks d'un batch avec filtres et pagination.
Filtres
| Param | Valeurs |
|---|---|
status | pending, ok, warning, error |
link_found | true / false |
is_dofollow | true / false |
article_removed | true / false |
page | Numéro de page |
per_page | Max 500 |
GET /batches/{uuid}/stats/
Statistiques d'indexation détaillées (total, indexed, not_indexed, pending, rate).
POST /batches/{uuid}/recheck/
Relance la vérification d'indexation.
// Body optionnel
{ "only_non_indexed": true }
GET /batches/{uuid}/export/
Export des anomalies (mĂŞme format que les alertes email).
| Param | Description |
|---|---|
format=csv | Télécharger un fichier CSV (par défaut) |
format=json | Réponse JSON |
GET /backlinks/{id}/
Détails complets d'un backlink : statut on-site, indexation, health score, et un bloc flags qui indique explicitement chaque anomalie.
// Extrait de la réponse
{
"backlink": {
"id": 1234,
"status": "warning",
"health_score": 25,
"link_found": true,
"is_dofollow": false,
"ancre_attendue": "mon ancre",
"ancre_actuelle": "autre ancre",
"ancre_matches": false,
"ssl_valid": false,
"http_status_code": 200,
"article_removed": false,
"flags": {
"article_removed": false,
"link_removed": false,
"nofollow": true,
"anchor_changed": true,
"ssl_invalid": true,
"deindexed": false,
"has_anomaly": true
},
"indexation": { "status": "completed", "is_indexed": true, ... }
}
}
Bloc flags (anomalies)
| Flag | Description |
|---|---|
article_removed | Article supprimé (article_removed ou HTTP 404) |
link_removed | Lien retiré de la page |
nofollow | Lien passé en nofollow |
anchor_changed | Ancre modifiée vs ancre renseignée |
ssl_invalid | Certificat SSL invalide |
deindexed | Désindexé (dernier contrôle d'indexation) |
has_anomaly | true si au moins un flag est levé |
GET …/backlinks/. Un flag à false peut signifier « OK » ou « pas encore vérifié » : recoupez avec status (pending = jamais contrôlé).GET /backlinks/{id}/history/
Historique des vérifications on-site. Paramètre limit (défaut 100, max 500).
GET /backlinks/{id}/indexation/
Historique des vérifications d'indexation. Paramètre limit (défaut 50, max 200).
Exemples cURL
# Vérifier sites & articles disponibles
curl -H "Authorization: Bearer ml_votre_cle" \
https://app.monito.link/api/v1/quota/
# Soumettre un batch
curl -X POST https://app.monito.link/api/v1/batches/ \
-H "Authorization: Bearer ml_votre_cle" \
-H "Content-Type: application/json" \
-d '{"backlinks": [{"url_publication": "https://blog.com/post", "ancre": "ancre", "url_destination": "https://monsite.com"}]}'
# Récupérer les backlinks en erreur
curl -H "Authorization: Bearer ml_votre_cle" \
"https://app.monito.link/api/v1/batches/UUID/backlinks/?status=error"
# Export anomalies CSV
curl -H "Authorization: Bearer ml_votre_cle" \
-o anomalies.csv \
https://app.monito.link/api/v1/batches/UUID/export/
Exemple Python
import requests, time
API_KEY = "ml_votre_cle"
BASE = "https://app.monito.link/api/v1"
H = {"Authorization": f"Bearer {API_KEY}"}
# 1. Vérifier sites & articles dispo
print(requests.get(f"{BASE}/quota/", headers=H).json())
# 2. Soumettre backlinks
r = requests.post(f"{BASE}/batches/", headers=H, json={
"backlinks": [
{"url_publication": "https://blog.com/post",
"ancre": "ancre",
"url_destination": "https://monsite.com"},
],
})
batch_id = r.json()["batch"]["id"]
# 3. Polling
while True:
stats = requests.get(f"{BASE}/batches/{batch_id}/", headers=H).json()["batch"]["stats"]
if stats["pending"] == 0: break
print(f"⏳ {stats['pending']} restants...")
time.sleep(60)
# 4. Récupérer les erreurs
for bl in requests.get(f"{BASE}/batches/{batch_id}/backlinks/?status=error", headers=H).json()["backlinks"]:
print(f"❌ {bl['url_publication']} → {bl['error_message']}")
# 5. Export
r = requests.get(f"{BASE}/batches/{batch_id}/export/?format=json", headers=H)
print(f"📊 {r.json()['total']} anomalie(s)")