Retour Ă  l'application

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
Base URL : 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

CodeSignification
400Paramètres invalides / erreur de validation
401Clé API manquante, invalide ou désactivée
403Quota d'articles suivis dépassé (plan)
404Ressource introuvable
409Conflit — tous les backlinks sont déjà monitorés
429Rate limit atteint
500Erreur 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

ChampDescription
sites.usedSites (campagnes) déjà créés
backlinks.usedArticles suivis = backlinks des batches actifs non expirés
*.max / *.leftLimite du plan et capacité restante. null si compte illimité (is_unlimited: true).
Quotas par plan : Starter 1 site / 100 articles · Pro 3 sites / 500 articles · Business 5 sites / 2 500 articles (extensible par packs).

GET /batches/

Liste des batches avec pagination.

Paramètres query

ParamTypeDescription
activestringtrue ou false — filtrer par statut
pageintNuméro de page (défaut : 1)
per_pageintRé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.

Vérifiez la capacité restante via 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

ChampRequisDescription
backlinksOuiListe d'objets (max 10 000). Chaque objet : url_publication, ancre, url_destination (tous requis).
La notification au vendeur en cas d'anomalie est automatique sur le plan Business (désactivée sur Starter et Pro). Aucun paramètre à fournir.

Réponse 201

{
  "batch": { "id": "uuid...", ... },
  "backlinks_created": 45,
  "duplicates_skipped": 2,
  "backlinks_used": 365,
  "backlinks_left": 135
}
Les doublons (backlinks déjà en monitoring actif) sont automatiquement ignorés.

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.

Liste des backlinks d'un batch avec filtres et pagination.

Filtres

ParamValeurs
statuspending, ok, warning, error
link_foundtrue / false
is_dofollowtrue / false
article_removedtrue / false
pageNuméro de page
per_pageMax 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).

ParamDescription
format=csvTélécharger un fichier CSV (par défaut)
format=jsonRéponse JSON

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)

FlagDescription
article_removedArticle supprimé (article_removed ou HTTP 404)
link_removedLien retiré de la page
nofollowLien passé en nofollow
anchor_changedAncre modifiée vs ancre renseignée
ssl_invalidCertificat SSL invalide
deindexedDésindexé (dernier contrôle d'indexation)
has_anomalytrue si au moins un flag est levé
Ces flags sont présents sur chaque backlink, y compris dans GET …/backlinks/. Un flag à false peut signifier « OK » ou « pas encore vérifié » : recoupez avec status (pending = jamais contrôlé).

Historique des vérifications on-site. Paramètre limit (défaut 100, max 500).

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)")