Endpoints
Les endpoints REST qu’une clé API d’espace de travail peut appeler, regroupés par ce sur quoi ils travaillent, avec les principaux paramètres de chacun.
Conventions
Tous les chemins sont relatifs à https://teddit.io/api. Envoyez la clé comme décrit sous Authentification.
- Accès est le rôle de clé le plus bas qui peut appeler l’endpoint :
viewer(une clé Lecture),member(Lecture + édition) ouadmin(Lecture + analyse). Un rôle supérieur peut toujours l’appeler aussi. :orgIdest l’identifiant de l’espace de travail donné parGET /whoami.:idest un identifiant de site donné parGET /orgs/:orgId/projects.- Paramètres de période. Les endpoints de rapport prennent
period(day,week,monthouquarter; par défautweek) etstart(n’importe quelle date dans la période voulue,YYYY-MM-DD; par défaut la dernière période). Leurs réponses répètentperiodetstartet listent chaque période qui a des données dansperiods. - Dans les réponses, « cité » est
mentioned, « lié » estownCited, votre place estbrandRank,visibilityest le score de visibilité, et un assistant est unprovideravec la cléopenai,anthropic,perplexity,gemini,google_aioougoogle_ai_mode.
Les outils MCP renvoient les mêmes données, donc la description d’un outil décrit aussi l’endpoint correspondant.
Espace de travail
| Méthode | Chemin | Accès | Rôle |
|---|---|---|---|
| GET | /whoami | viewer | L’espace de travail, le rôle et le nom de la clé. |
| GET | /orgs/:orgId | viewer | L’espace de travail : son nom et le rôle de l’appelant. |
| GET | /orgs/:orgId/dashboard | viewer | Chaque site avec ses chiffres actuels, les assistants connectés, et les limites de l’espace de travail avec les analyses utilisées ce mois-ci. |
| GET | /orgs/:orgId/projects | viewer | Les sites de l’espace de travail. |
| GET | /orgs/:orgId/usage | viewer | Le solde, les recharges, et ce que les analyses ont coûté : ce mois-ci au total et par site avec le plafond de chaque site, les six derniers mois, et le prix par réponse du modèle par défaut de chaque assistant. |
| POST | /orgs/:orgId/projects | admin | Ajouter un site. |
| GET | /orgs/:orgId/providers | viewer | Les assistants, le modèle avec lequel chacun répond, et si chacun est connecté. |
| GET | /orgs/:orgId/members | viewer | Les membres, les invitations en attente et la limite de membres de l’espace de travail. |
| POST | /orgs/:orgId/invitations | admin | Inviter une personne par e-mail. |
| DELETE | /orgs/:orgId/invitations/:invitationId | admin | Annuler une invitation en attente. |
| PATCH | /orgs/:orgId/members/:userId | admin | Changer le rôle d’un membre. |
| DELETE | /orgs/:orgId/members/:userId | admin | Retirer un membre. |
Ajouter un site prend name et url (tous deux obligatoires), et en option industry, brandTerms (autres noms, jusqu’à 50), competitors (objets avec name et domain, jusqu’à 50), language (par défaut English) et location (par défaut United States).
Inviter prend email et role (viewer, member ou admin ; par défaut member). Changer un rôle prend role. Ce qu’un admin peut et ne peut pas faire aux autres membres est sur la page Rôles.
Non disponible aux clés : tout ce qui est sous /auth et /account, créer, supprimer et quitter des espaces de travail, renommer un espace de travail (PATCH /orgs/:orgId, Owner seulement), recharger et les factures (Owner seulement) et gérer les clés (/orgs/:orgId/tokens).
Sites
| Méthode | Chemin | Accès | Rôle |
|---|---|---|---|
| GET | /projects/:id | viewer | Le site, le rôle de l’appelant et le nombre de réponses stockées. |
| PATCH | /projects/:id | member | Changer les réglages du site. Le plafond, les réglages d’analyse et allowedProviders (les assistants que le site peut interroger, null pour tous) exigent un admin. |
| PATCH | /projects/:id/schedule | admin | Activer ou désactiver les analyses planifiées. |
| POST | /projects/:id/reanalyse | member | Relire chaque réponse stockée avec les noms et concurrents actuels. N’appelle aucun assistant. |
Changer les réglages prend n’importe lequel de ces champs :
name,brandTerms: le nom de marque et ses autres noms. Changer l’un ou l’autre relit toutes les réponses stockées ; la réponse porte alors un résuméreanalysis.industry,language,location(le pays).scanFrequencyDays(1 à 365) : l’intervalle entre les analyses planifiées.monthlyCapUsd: le plafond mensuel du site en dollars américains.nullou0le retire.scanSettings: les réglages d’analyse enregistrés, remplacés en bloc. Un objet avecproviders(clés d’assistant ; omis signifie tous les connectés),models(clé d’assistant vers modèle),category,budgetUsd(le maximum qu’une analyse peut coûter ; 0 signifie le double de son estimation) etskipAtCap(falselaisse les analyses démarrer même quand le plafond mensuel est dépensé).
Calendrier prend enabled (true ou false). Activer le calendrier programme la première analyse pour la nuit suivante (UTC) ; les réponses d’une analyse planifiée arrivent en quelques heures.
Supprimer un site, avec ses prompts, ses analyses et ses réponses, est réservé à un Owner connecté et n’est pas disponible aux clés.
Personas d’acheteurs
GET /projects/:id/personas liste les personas d’un site avec le nombre de prompts que chacun pose ; POST (member) en ajoute un avec name (jusqu’à 80 caractères) et context (jusqu’à 600) : qui pose la question, avec ses mots. PATCH /projects/:id/personas/:personaId change l’un ou l’autre ; DELETE en retire un, et ses prompts sont posés nus à partir de l’analyse suivante. Les prompts prennent personaId à la création, à la modification et à la modification en masse (null l’efface). Chaque réponse conserve les mots avec lesquels elle a été posée comme context.
Rapports
Tous sont en GET, exigent viewer, et prennent les paramètres de période.
| Chemin | Renvoie |
|---|---|
/projects/:id/report | Le Tableau de bord : report avec les décomptes actuels et précédents, la part de voix, le classement des marques, les lignes par assistant, ce qui a changé, les sources les plus citées, les séries des graphiques et scope : ce sur quoi les chiffres ont été mesurés (assistants, réponses par question, lieu, langue, d’où les réponses de chaque assistant ont été lues). report est null avant la première analyse. |
/projects/:id/shares | Les liens de partage du rapport du site (admin). POST avec un label optionnel en crée un et renvoie son url ; DELETE /projects/:id/shares/:shareId le révoque définitivement. Un lien ouvre /share/:token sans connexion, pour n’importe quelle période, signé du nom et du logo de rapport de l’espace de travail (PATCH /orgs/:id avec reportName et reportLogo, Owner). |
/projects/:id/trends | Dix périodes : les parts du site par période, chaque prompt actif avec ses verdicts par période, les prompts gagnés et perdus, les parts par catégorie, et les listes tenus, volatils et perdus. |
/projects/:id/sentiment | Le ton par assistant parmi les réponses qui vous citent. Ajoutez answers=1 pour obtenir ces réponses une par une, chacune avec son ton et la phrase citée. |
/projects/:id/sources | Chaque domaine cité par les assistants, le type de site et si les réponses qui le citent vous citent ; et vos propres pages avec les prompts et assistants qui pointent vers chacune. |
/projects/:id/competitors | Les concurrents suivis, à quelle fréquence chaque marque est citée au total et par assistant, les décomptes face à face, et des suggestions de noms non suivis. |
/projects/:id/competitors/:competitorId | Un concurrent face à vous : chiffres appariés, par assistant, par catégorie, les prompts répartis en trois, et leurs pages citées. |
curl "https://teddit.io/api/projects/12/report?period=month&start=2026-09-15" \ -H "Authorization: Bearer tdt_…"
Comment les chiffres de ces réponses sont calculés : Indicateurs et statuts.
Prompts et catégories
| Méthode | Chemin | Accès | Rôle |
|---|---|---|---|
| GET | /projects/:id/prompts | viewer | La liste des prompts avec le dernier verdict de chaque assistant et les cases d’historique. |
| GET | /projects/:id/prompts/export.csv | viewer | La même liste en fichier CSV. |
| POST | /projects/:id/prompts | member | Ajouter un prompt. |
| PATCH | /projects/:id/prompts/:promptId | member | Modifier un prompt. |
| POST | /projects/:id/prompts/bulk | member | Définir un statut ou une catégorie sur plusieurs prompts, ou les supprimer. |
| POST | /projects/:id/prompts/import | member | Importer des prompts depuis un texte CSV. |
| POST | /projects/:id/prompts/rewrite | admin | Réécrire les requêtes de recherche importées en questions complètes. Non facturé ; exige un solde supérieur à zéro. Jusqu’à 10 appels par heure. |
| GET | /projects/:id/prompts/rewrite/pending | viewer | Combien de prompts importés sont encore des requêtes brutes. |
| GET | /projects/:id/prompts/:promptId | viewer | Un prompt : le dernier verdict par assistant, chaque réponse dans le temps, l’historique semaine après semaine. |
| GET | /projects/:id/prompts/:promptId/answer | viewer | Une réponse mot pour mot, avec les marques citées, les sources et les recherches web. |
| GET | /projects/:id/categories | viewer | Les catégories avec leur nombre de prompts. |
| POST | /projects/:id/categories | member | Ajouter une catégorie vide. |
| POST | /projects/:id/categories/merge | member | Renommer, fusionner ou supprimer des catégories. |
La liste et l’export prennent les mêmes paramètres de requête : q (recherche de texte), category, status (draft, active, paused), intent, verdict (named, lost, cited, missing, failed), competitor (le nom d’un concurrent suivi), stability (held, volatile, lost) et scanned (yes, never). La liste prend aussi sort (created, text, category, rank, scanned), dir (asc, desc), page, perPage (5 à 200, par défaut 20) et les paramètres de période, qui définissent ce que représente une case d’historique.
Ajouter prend text (3 à 500 caractères, obligatoire), category ou categories (une liste de jusqu’à 8), intent (par défaut informational), funnel (par défaut awareness) et status (par défaut active). Un texte déjà suivi répond 409. Modifier prend les mêmes champs, tous optionnels ; categories remplace toute la liste.
En masse prend ids (1 à 5000) et status, category ou delete: true. Supprimer un prompt supprime ses réponses.
Importer prend contents (le texte du fichier, jusqu’à 2 000 000 caractères), status (par défaut draft) et dryRun. Il renvoie rows, created, updated, skipped et categories. Le format du fichier est sur la page Importer des prompts.
Une réponse prend engine (une clé d’assistant ; par défaut le premier assistant qui a répondu) ou r (l’identifiant d’une réponse passée, pris dans les results du prompt).
Fusionner des catégories prend names (les catégories à regrouper) et into (le nom qu’elles deviennent). Un seul nom est un renommage, plusieurs sont une fusion, et un into vide retire les catégories de leurs prompts.
Concurrents et pages
| Méthode | Chemin | Accès | Rôle |
|---|---|---|---|
| POST | /projects/:id/competitors | member | Suivre un concurrent. |
| PATCH | /projects/:id/competitors/:competitorId | member | Changer un concurrent. Seuls les champs envoyés changent. |
| DELETE | /projects/:id/competitors/:competitorId | member | Cesser de suivre un concurrent. Les réponses stockées sont conservées. |
| GET | /projects/:id/pages | viewer | Vos pages depuis le sitemap avec leurs titres, et si une réponse actuelle pointe vers chacune. |
| GET | /projects/:id/crawlers | viewer | Ce que le robots.txt laisse lire à chaque robot IA, la ligne décisive, le llms.txt, et l’historique des vérifications. |
| POST | /projects/:id/crawlers/check | member | Relire le robots.txt et le llms.txt maintenant ; renvoie la même chose que le GET. |
| GET | /projects/:id/searches | viewer | Les recherches web effectuées par les assistants pour les prompts actifs, les plus fréquentes en premier. |
| GET | /projects/:id/pages/:pageId/prompts | viewer | Les prompts dont les réponses actuelles pointent vers une page. |
| POST | /projects/:id/pages/import-sitemap | member | Relire le sitemap du site maintenant et ajouter les pages pas encore listées. Jusqu’à 10 appels par heure. |
Suivre prend name (obligatoire), domain, aliases (autres noms, jusqu’à 30), color et logo. Changer prend les mêmes champs, tous optionnels : seul ce que vous envoyez change, aliases remplace toute la liste, et domain: null retire le domaine. Les trois endpoints de concurrents relisent les réponses stockées quand les noms changent et renvoient le résultat comme reanalysis.
Pages prend q, section (la première partie du chemin), shown (yes ou no), page et perPage (5 à 200, par défaut 50).
Analyses
| Méthode | Chemin | Accès | Rôle |
|---|---|---|---|
| GET | /projects/:id/scan-options | viewer | Les assistants connectés, leurs modèles avec un coût par réponse, les prompts actifs par catégorie, les analyses utilisées ce mois-ci et les dépenses du site ce mois-ci. |
| POST | /projects/:id/scans/estimate | viewer | Le coût attendu d’une analyse telle que configurée. |
| POST | /projects/:id/scans | admin | Lancer une analyse. |
| GET | /projects/:id/scans/live | viewer | L’analyse en cours, s’il y en a une, avec le rythme et le temps restant. |
| POST | /projects/:id/scans/:scanId/cancel | admin | Arrêter une analyse en cours. |
| GET | /projects/:id/scans | viewer | Les 30 dernières analyses. |
| GET | /projects/:id/scans/:scanId | viewer | Une analyse et les réponses qu’elle a collectées, 25 par page. |
Estimer et lancer prennent le même corps. Chaque champ est optionnel :
providers: des clés d’assistant. Vide signifie chaque assistant connecté.promptIds: un ensemble choisi de prompts. Vide signifie chaque prompt actif. Les prompts qui ne sont pas actifs sont ignorés.category: analyser une catégorie.sample: analyser ce nombre de prompts, tirés au hasard.models: clé d’assistant vers modèle, parmi les options descan-options.chatgpt-appetgemini-app(rapide : réponse immédiate) etchatgpt-app-queueetgemini-app-queue(lent et moins cher : quelques minutes) prennent la réponse telle que l’application l’affiche.saved:trueprend les assistants, les modèles et la catégorie des réglages d’analyse enregistrés du site plutôt que de cette requête. Au lancement, il prend aussi la limite par analyse enregistrée.- Lancement seulement :
budgetUsd(arrêter dès que l’analyse a coûté ce montant ; omis, le double de son estimation) etlabel.
Estimer renvoie prompts, answers, cost et formatted. Lancer renvoie l’analyse, répond 402 quand le solde ne couvre pas l’analyse, et 400 avec la raison pour tout le reste qui l’empêche de démarrer. Les raisons, et comment le coût est compté, sont sur la page Solde et limites de dépenses.
Une analyse prend tab (all, notNamed, competitorsOnly, errors), engine (une clé d’assistant) et page. Les statuts d’analyse sont queued, running, cancelling, cancelled, done et failed.
Un exemple complet
Trouver le site, ajouter un prompt, chiffrer une analyse d’une catégorie, la lancer et lire le résultat. Lancer l’analyse exige une clé Lecture + analyse.
KEY="tdt_…"
API="https://teddit.io/api"
# 1. Which workspace is this key for?
curl "$API/whoami" -H "Authorization: Bearer $KEY"
# → "org": { "id": 3, … }
# 2. The sites of the workspace
curl "$API/orgs/3/projects" -H "Authorization: Bearer $KEY"
# → "projects": [{ "id": 12, "domain": "brightloop.example", … }]
# 3. Add a prompt
curl -X POST "$API/projects/12/prompts" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"text": "What does email automation cost for 10,000 contacts?", "category": "pricing", "intent": "commercial"}'
# 4. What would a scan of that category cost?
curl -X POST "$API/projects/12/scans/estimate" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"category": "pricing"}'
# → { "prompts": …, "answers": …, "cost": …, "formatted": "$…" }
# 5. Run it, and stop at 2 dollars
curl -X POST "$API/projects/12/scans" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"category": "pricing", "budgetUsd": 2}'
# 6. Follow it until "run" is null
curl "$API/projects/12/scans/live" -H "Authorization: Bearer $KEY"
# 7. Read this week's report
curl "$API/projects/12/report" -H "Authorization: Bearer $KEY"