DocumentationExploiter vos données

API

Lire et écrire vos projets, mots-clés et positions depuis vos propres outils.

L’API est incluse dans tous les comptes, sans supplément. Tout ce que fait l’interface sur vos projets, vos mots-clés et vos positions se fait aussi par appel HTTP.

Un appel à l'APIGET /api/v1/keywords?project=42Authorization: Bearer pt_live_…{ "keyword": "acme shop", "position": 1, "best": 1, "url": "acme-shop.com" }Vos outilsTableaux de bord internesRapports clientsAlertes Slack ou e-mailL’API est incluse dans tous les comptes, sans surcoût.
Une requête authentifiée, une réponse JSON

Obtenir une clé

  1. 1Ouvrez Paramètres puis l’onglet CompteLa section Clé API est en bas de l’onglet.
  2. 2Cliquez sur GénérerLa clé commence par pt_live_. Copiez-la tout de suite : elle n’est affichée qu’une fois, car nous n’en conservons qu’une empreinte et son début. Elle vaut mot de passe.
  3. 3Révoquez ou régénérez à tout momentRégénérer remplace la clé existante, Révoquer la supprime. Dans les deux cas l’ancienne clé cesse immédiatement de fonctionner.
Une clé donne accès à toutes vos données. Gardez-la côté serveur, jamais dans un site ou une application livrée au public.

Authentification

Chaque requête porte la clé dans l’en-tête X-API-Key. L’URL de base est https://tool.positiontiger.com/api.

curl https://tool.positiontiger.com/api/projects \
  -H "X-API-Key: pt_live_votre_cle"

Sans clé valide, la réponse est un 401 avec {"error":"Unauthorized"}.

Les ressources

RessourceCe qu’elle permet
/projectsLister, créer, renommer et supprimer vos projets, leur ajouter ou retirer vos sites.
/sitesLister vos projets accessibles, y compris ceux partagés avec vous, en créer et en supprimer : ici, un « site » est un projet.
/keywordsLister, ajouter et supprimer des mots-clés (par terme ou une ligne de suivi à la fois), forcer un rafraîchissement, poser ou retirer des tags.
/positionsLire les positions relevées : c’est l’endpoint à utiliser pour alimenter un tableau de bord.
/competitorsLister, ajouter et retirer des concurrents sur un projet.
/tagsCréer, renommer, colorer et supprimer les tags d’un projet.

Lire des positions

GET /api/positions est la ressource la plus riche. Seul le projet est obligatoire : son nom (project) ou son identifiant (projectId, donné par GET /api/projects). Partout où l’API attend project, vous pouvez donner projectId à la place.

Un nom de projet est unique dans votre compte. Si d’anciens projets portent le même nom, project désigne toujours le plus ancien en lecture, et la réponse le signale dans meta (sameName liste les autres identifiants, note l’explique). Une écriture (ajout, suppression, actualisation, tags, concurrents) avec un tel nom est refusée (409, avec les identifiants) : utilisez alors projectId.

curl "https://tool.positiontiger.com/api/positions?project=Acme%20Shop&days=30&device=desktop&include=all" \
  -H "X-API-Key: pt_live_votre_cle"
ParamètreValeursPar défaut
projectle nom du projetobligatoire, sauf avec projectId
projectIdl’identifiant du projet, à la place du nom—
days1 à 36590
startDate, endDateAAAA-MM-JJ. endDate seul : les days jours qui le précèdentla fenêtre days
devicedesktop, mobile, allall
keywordsliste séparée par des virgulestous
tagsliste séparée par des virgules. Un tag que le projet n’a pas ne correspond à aucun mot-clé (liste vide)tous
siteun des sites du projet (son domaine exact, sous-domaines compris) : les positions sont mesurées pour ce site, sur tous les mots-clés. Un texte qui correspond à plusieurs sites renvoie un 400 qui les listele site suivi par chaque mot-clé, à défaut le premier de vos sites du projet
minPosition, maxPosition1 à 60aucun filtre
hideUnrankedtrue pour écarter les non positionnésfalse
sortByposition, volume, cpc, term, date, evolutionposition
orderasc ou descasc pour la position
limit, offsetlimit jusqu’à 500100 et 0
includevolume, cpc, history, allaucun extra

Chaque ligne renvoie le mot-clé, la position, la position précédente, l’évolution, l’URL classée, la date, l’appareil, la localisation, le site suivi et les tags. meta.filtered donne le total, à utiliser pour paginer avec offset.

Votre site compte avec tous ses sous-domaines (fr.exemple.com, blog.exemple.com), comme dans le tableau de bord : la position est la meilleure d’entre eux, et url dit laquelle.

La position et la date sont celles du dernier relevé, comme dans le tableau de bord et les rapports : un mot-clé vérifié où votre site n’apparaît pas dans les résultats renvoie "position": null à la date de ce relevé. lastRankedPosition et lastRankedDate donnent la dernière fois où votre site était classé (null s’il ne l’a jamais été). previousPosition est la position au relevé précédent. Avec une endDate passée, la position et la date sont celles du dernier relevé jusqu’à cette date incluse.

{
  "keywords": [
    {
      "term": "acme shop",
      "position": 1,
      "previousPosition": 2,
      "evolution": 1,
      "url": "https://acme-shop.com/",
      "date": "2026-09-22T00:00:00Z",
      "lastRankedPosition": 1,
      "lastRankedDate": "2026-09-22T00:00:00Z",
      "device": "desktop",
      "location": "FR",
      "site": "https://acme-shop.com",
      "tags": ["brand"]
    }
  ],
  "meta": { "project": "Acme Shop", "projectId": 4746, "filtered": 381, "returned": 100, "limit": 100, "offset": 0 }
}

Les dates sont au format AAAA-MM-JJT00:00:00Z (le jour du relevé, en UTC). Si les positions ne peuvent pas être lues à ce moment-là, la réponse est un 503 avec un en-tête Retry-After : réessayez quelques minutes plus tard (aucune position n’est renvoyée vide à tort).

Ajouter un mot-clé

curl -X POST https://tool.positiontiger.com/api/keywords \
  -H "X-API-Key: pt_live_votre_cle" \
  -H "Content-Type: application/json" \
  -d '{"project":"Acme Shop","term":"perceuse sans fil","location":"FR","lang":"fr","device":"desktop"}'

Un mot-clé déjà suivi dans le projet (même terme, pays, langue et appareil) renvoie un 409, sans rien débiter. Le même terme dans un autre pays ou sur l’autre appareil est un autre mot-clé. Un mot-clé déjà suivi dans un autre de vos projets (même terme, pays, langue et appareil) n’est gratuit que si vous l’avez déjà payé aujourd’hui (jour UTC) : il reprend ce relevé. Sinon, il coûte 6 pages et il est relevé tout de suite. Si votre solde est vide, la réponse est un 403 avec le code INSUFFICIENT_CREDITS.

location est le code du pays (FR par défaut). Un pays où nous ne relevons pas les positions est refusé : 400, avec la liste de tous les pays et de leur code dans countries, et rien n’est débité.

lang est la langue de la recherche, par défaut celle du pays. Toute langue est acceptée avec tout pays, comme dans le tableau de bord : les positions sont demandées à Google dans ce pays (gl) avec cette langue (hl), soit ce que voit une personne dans ce pays dont Google est réglé dans cette langue. Quand Google Ads n’a pas de volume pour cette langue dans ce pays, c’est le volume des langues du pays qui est affiché.

Projets

MéthodeCheminCe qu’il fait
GET/api/projectsListe tous vos projets, avec le nombre de mots-clés, les sites suivis et les concurrents. ?include=keywords ajoute les mots-clés.
GET/api/projects/{id}Récupère un projet par son identifiant.
POST/api/projectsCrée un projet : name, et si besoin trackedSites et logo.
PUT/api/projectsRenomme un projet ou lui ajoute des sites : projectId (ou name) et newName, logo, trackedSites. trackedSites ajoute les sites qui manquent au projet : ceux qui n’y figurent pas restent, et un site déjà présent (comme site ou comme concurrent) n’est pas ajouté une seconde fois.
DELETE/api/projects/sitesRetire un ou plusieurs de vos sites d’un projet : projectId (ou project), url ou urls. Pour un concurrent, c’est DELETE /api/competitors.
DELETE/api/projectsSupprime un projet et tout ce qu’il contient : projectId (ou name). Un nom porté par deux projets renvoie un 409 avec leurs identifiants.

DELETE /api/projects/sites reconnaît un site à son domaine, avec ou sans https://, quel que soit le chemin (www.exemple.com et https://www.exemple.com/fr sont le même site). Il ne retire jamais le dernier de vos sites du projet : la demande est alors refusée (409) et rien n’est retiré ; ajoutez d’abord un autre site. Les mots-clés du projet et leur historique restent. La réponse donne le nombre de sites retirés (deleted) et ceux qui restent (trackedSites).

Sites

Dans /api/sites, un « site » est un projet : siteId est l’identifiant d’un projet. Pour ajouter ou retirer un des sites suivis dans un projet, voir PUT /api/projects et DELETE /api/projects/sites ci-dessus.

MéthodeCheminCe qu’il fait
GET/api/sitesListe les projets auxquels vous avez accès, y compris ceux partagés avec vous, avec votre rôle. Les autres ressources ne lisent que vos propres projets : l’identifiant d’un projet partagé avec vous y renvoie un 404.
GET/api/sites/{id}Récupère un projet par son identifiant.
POST/api/sitesCrée un projet : name, et si besoin logo.
DELETE/api/sitesSupprime le projet entier, avec ses mots-clés, ses sites et ses concurrents : siteId, l’identifiant du projet. Pour retirer un seul de vos sites, c’est DELETE /api/projects/sites.

Mots-clés

MéthodeCheminCe qu’il fait
GET/api/keywordsListe vos mots-clés, avec leur localisation, leur langue, leur appareil et leurs tags. ?project= restreint à un projet.
GET/api/keywords/{id}Récupère un mot-clé par son id de suivi — celui renvoyé par GET /api/keywords, pas le keywordId.
POST/api/keywordsAjoute un mot-clé : project, term, et si besoin location, lang, device.
DELETE/api/keywordsSupprime des mots-clés par terme : project et terms. Chaque terme est supprimé du projet dans tous ses pays et sur ses deux appareils.
DELETE/api/keywords/{id}Supprime une seule ligne de suivi : un mot-clé, dans un projet, un pays et sur un appareil. id est celui que renvoie GET /api/keywords, pas le keywordId. Une ligne qui n’est pas dans un de vos projets renvoie un 404.
POST/api/keywords/refreshMet des mots-clés en file de relevé, tout de suite : project (ou projectId), une liste keywords, ou "mode": "all" pour tous les mots-clés du compte.
POST/api/keywords/tagsPose un tag sur une liste de mots-clés : project, keywords, tag.
DELETE/api/keywords/tagsRetire ce tag des mêmes mots-clés.

Chaque mot-clé porte deux identifiants distincts, et ils ne sont pas interchangeables. id est votre ligne de suivi : propre à votre compte, c’est lui que prennent GET et DELETE /api/keywords/{id}. keywordId désigne le mot-clé lui-même — le couple terme + langue + pays — et il est partagé par tous les comptes qui suivent ce terme. Les deux suites de numéros avancent séparément, donc l’un passé à la place de l’autre désigne un mot-clé sans rapport. GET /api/keywords renvoie les deux, à titre indicatif. Pour lire des positions, aucun identifiant n’est nécessaire : GET /api/positions travaille sur le nom du projet et les termes.

Une suppression, par terme ou par id, ne retire que vos lignes de suivi. Un relevé déjà lancé au moment de la suppression est fait, et décompté ; un relevé encore en attente est retiré de la file, sauf si le mot-clé reste suivi sur cet appareil.

POST /api/keywords/refresh doit toujours dire quoi rafraîchir : un projet (project ou projectId), une liste non vide de termes (keywords, dans tous vos projets si aucun n’est donné), ou "mode": "all" pour tous les mots-clés du compte, envoyé seul : le corps est exactement {"mode": "all"}, et tout autre champ à côté est refusé (400). Un corps vide, {} ou un champ mal orthographié est refusé (400), sans rien rafraîchir ni débiter. Chaque relevé est décompté, 6 pages par mot-clé et par appareil, même si le mot-clé a déjà été relevé aujourd’hui.

Positions

Une seule ressource, GET /api/positions, dont les paramètres font tout le travail. Les combinaisons les plus utiles :

AppelCe qu’il renvoie
?project=NomToutes les positions du projet sur les 90 derniers jours.
&maxPosition=10Seulement le Top 10.
&include=volume,cpcLe volume de recherche et le CPC avec chaque ligne : les vôtres quand vous les avez corrigés dans le tableau de bord, comme il les affiche.
&include=history&days=30L’historique sur la période : un point par jour où votre site était classé (les jours non classés n’y figurent pas).
&device=mobileLes positions mobiles seulement.
&minPosition=1&maxPosition=50&hideUnranked=trueUne tranche de positions, sans les non positionnés.

Concurrents

MéthodeCheminCe qu’il fait
GET/api/competitors?project=Liste les concurrents d’un projet.
GET/api/competitors/{id}Récupère un concurrent par son identifiant.
POST/api/competitorsAjoute un ou plusieurs concurrents : project, url ou urls. added compte ceux réellement ajoutés : un site que le projet a déjà, comme concurrent ou comme site, ne l’est pas une seconde fois.
DELETE/api/competitorsRetire un ou plusieurs concurrents du projet : project, url ou urls.

Tags

MéthodeCheminCe qu’il fait
GET/api/tags?project=Liste les tags d’un projet, avec le nombre de mots-clés de chacun.
GET/api/tags/{id}Récupère un tag par son identifiant.
POST/api/tagsCrée un tag : project, name, color.
PUT/api/tagsRenomme un tag ou change sa couleur.
DELETE/api/tagsSupprime un tag : project, name ou names.

Essayer sans risque

Le Playground API du tableau de bord liste les endpoints, génère le code dans une douzaine de langages et montre une réponse d’exemple. Les requêtes lancées depuis le playground ne modifient pas vos projets.

PositionTiger
Reports
381mots-clés
100%
227 008pages de résultat
API
N

PositionTiger API

Projets

GETListe tous vos projetsGETRécupérer un projet par idPOSTCréer un projetPUTRenommer un projetDELETESupprimer un projet

Sites

GETListe tous vos sitesGETRécupérer un site par idPOSTCréer un siteDELETESupprimer un site

Mots-clés

GETListe tous vos mots-clésPOSTAjouter un mot-cléPOSTRafraîchir des mots-clés

Requête

GET/api/projects

Afficher la cléExécuter
ccURLJJavaScriptPPythonPPHPRRubyGGoNNode.jsPPowerShellCC#JJavaSSwiftRR
curl -X GET "https://tool.positiontiger.com/api/projects" \
  -H "X-API-Key: pt_••••••••••••••••••••a4f2" \
  -H "Content-Type: application/json"

Réponse

200 OK

Données d’exemple. Exécuter une requête ici ne modifie pas vos projets.

{
  "projects": [
    {
      "id": 1,
      "name": "Jardin & Terrasse",
      "keywordCount": 203,
      "trackedSites": ["https://jardin-terrasse.fr"],
      "competitors": ["https://gamm-vert.fr", "https://truffaut.com"]
    },
    {
      "id": 2,
      "name": "Mobilier intérieur",
      "keywordCount": 84,
      "trackedSites": ["https://mobilier-inte.fr"],
      "competitors": ["https://conforama.fr"]
    }
  ],
  "total": 2
}
Le playground : les endpoints, la requête, la réponse

Une question qui n’a pas sa réponse ici ? Écrivez-nous.