REST-API

Endpunkte

Die REST-Endpunkte, die ein Workspace-API-Schlüssel aufrufen kann, gruppiert nach dem, womit sie arbeiten, mit den wichtigsten Parametern jedes einzelnen.

Konventionen

Alle Pfade sind relativ zu https://teddit.io/api. Senden Sie den Schlüssel wie unter Authentifizierung beschrieben.

  • Zugang ist die niedrigste Schlüsselrolle, die den Endpunkt aufrufen darf: viewer (ein Schlüssel Lesen), member (Lesen + Bearbeiten) oder admin (Lesen + Scannen). Eine höhere Rolle darf ihn immer ebenfalls aufrufen.
  • :orgId ist die Workspace-ID aus GET /whoami. :id ist eine Site-ID aus GET /orgs/:orgId/projects.
  • Zeitraum-Parameter. Die Bericht-Endpunkte nehmen period (day, week, month oder quarter; Voreinstellung week) und start (ein beliebiges Datum innerhalb des gewünschten Zeitraums, YYYY-MM-DD; Voreinstellung der letzte Zeitraum). Ihre Antworten wiederholen period und start und führen jeden Zeitraum mit Daten in periods auf.
  • In Antworten ist „genannt“ mentioned, „verlinkt“ ist ownCited, Ihr Platz ist brandRank, visibility ist der Sichtbarkeitswert, und ein Assistent ist ein provider mit dem Schlüssel openai, anthropic, perplexity, gemini, google_aio oder google_ai_mode.

Die MCP-Werkzeuge geben dieselben Daten zurück, die Beschreibung eines Werkzeugs beschreibt also auch den passenden Endpunkt.

Workspace

MethodePfadZugangZweck
GET/whoamiviewerDer Workspace, die Rolle und der Name des Schlüssels.
GET/orgs/:orgIdviewerDer Workspace: sein Name und die Rolle des Aufrufers.
GET/orgs/:orgId/dashboardviewerJede Site mit ihren aktuellen Zahlen, die verbundenen Assistenten und die Workspace-Limits mit den diesen Monat genutzten Scans.
GET/orgs/:orgId/projectsviewerDie Sites des Workspace.
GET/orgs/:orgId/usageviewerDas Guthaben, Aufladungen und was die Scans gekostet haben: diesen Monat insgesamt und pro Site mit der Grenze jeder Site, die letzten sechs Monate und der Preis pro Antwort des Standardmodells jedes Assistenten.
POST/orgs/:orgId/projectsadminEine Site anlegen.
GET/orgs/:orgId/providersviewerDie Assistenten, das Modell, mit dem jeder antwortet, und ob jeder verbunden ist.
GET/orgs/:orgId/membersviewerMitglieder, offene Einladungen und das Mitgliederlimit des Workspace.
POST/orgs/:orgId/invitationsadminEine Person per E-Mail einladen.
DELETE/orgs/:orgId/invitations/:invitationIdadminEine offene Einladung zurückziehen.
PATCH/orgs/:orgId/members/:userIdadminDie Rolle eines Mitglieds ändern.
DELETE/orgs/:orgId/members/:userIdadminEin Mitglied entfernen.

Eine Site anlegen nimmt name und url (beide Pflicht) und optional industry, brandTerms (weitere Namen, bis zu 50), competitors (Objekte mit name und domain, bis zu 50), language (Voreinstellung English) und location (Voreinstellung United States).

Einladen nimmt email und role (viewer, member oder admin; Voreinstellung member). Eine Rolle ändern nimmt role. Was ein Admin mit anderen Mitgliedern tun darf und was nicht, steht auf der Seite Rollen.

Für Schlüssel nicht verfügbar: alles unter /auth und /account, Workspaces anlegen, löschen und verlassen, einen Workspace umbenennen (PATCH /orgs/:orgId, nur Owner), Aufladen und Rechnungen (nur Owner) und Schlüssel verwalten (/orgs/:orgId/tokens).

Sites

MethodePfadZugangZweck
GET/projects/:idviewerDie Site, die Rolle des Aufrufers und die Zahl der gespeicherten Antworten.
PATCH/projects/:idmemberDie Einstellungen der Site ändern. Die Grenze, die Scan-Einstellungen und allowedProviders (die Assistenten, die die Site fragen darf, null für alle) brauchen einen Admin.
PATCH/projects/:id/scheduleadminGeplante Scans ein- oder ausschalten.
POST/projects/:id/reanalysememberJede gespeicherte Antwort mit den aktuellen Namen und Wettbewerbern erneut lesen. Ruft keinen Assistenten auf.

Einstellungen ändern nimmt beliebige dieser Felder:

  • name, brandTerms: der Markenname und seine weiteren Namen. Eine Änderung von einem der beiden liest alle gespeicherten Antworten erneut; die Antwort trägt dann eine reanalysis-Zusammenfassung.
  • industry, language, location (das Land).
  • scanFrequencyDays (1 bis 365): der Abstand zwischen geplanten Scans.
  • monthlyCapUsd: die Monatsgrenze der Site in US-Dollar. null oder 0 entfernt sie.
  • scanSettings: die gespeicherten Scan-Einstellungen, als Ganzes ersetzt. Ein Objekt mit providers (Assistenten-Schlüssel; weggelassen bedeutet alle verbundenen), models (Assistenten-Schlüssel zu Modell), category, budgetUsd (das Meiste, was ein Scan kosten darf; 0 bedeutet das Doppelte seiner Schätzung) und skipAtCap (false lässt Scans starten, auch wenn die Monatsgrenze ausgeschöpft ist).

Zeitplan nimmt enabled (true oder false). Das Einschalten des Zeitplans setzt den ersten Scan auf die nächste Nacht (UTC); die Antworten eines geplanten Scans kommen innerhalb weniger Stunden an.

Eine Site zu löschen, mit ihren Prompts, Scans und Antworten, ist einem angemeldeten Owner vorbehalten und für Schlüssel nicht verfügbar.

Käufer-Personas

GET /projects/:id/personas listet die Personas einer Site mit der Zahl der Prompts, die jede als Fragende nutzen; POST (member) fügt eine hinzu mit name (bis zu 80 Zeichen) und context (bis zu 600): wer fragt, in dessen Worten. PATCH /projects/:id/personas/:personaId ändert eines von beiden; DELETE entfernt eine, und ihre Prompts werden ab dem nächsten Scan ohne Persona gestellt. Prompts nehmen personaId beim Anlegen, Bearbeiten und Stapelbearbeiten (null löscht sie). Jede Antwort behält den Wortlaut, mit dem sie gestellt wurde, als context.

Berichte

Alle diese sind GET, brauchen viewer und nehmen die Zeitraum-Parameter.

PfadGibt zurück
/projects/:id/reportDas Dashboard: report mit den Zahlen jetzt und davor, Share of Voice, der Markenrangliste, Zeilen pro Assistent, was sich geändert hat, den meistzitierten Quellen, den Diagrammreihen und scope: worauf die Zahlen gemessen wurden (Assistenten, Antworten pro Frage, Ort, Sprache, woher die Antworten jedes Assistenten gelesen wurden). report ist vor dem ersten Scan null.
/projects/:id/sharesBerichtslinks für den Bericht der Site (admin). POST mit optionalem label erstellt einen und gibt seine url zurück; DELETE /projects/:id/shares/:shareId widerruft ihn endgültig. Ein Link öffnet /share/:token ohne Anmeldung, für jeden Zeitraum, mit Berichtsname und Logo des Workspace (PATCH /orgs/:id mit reportName und reportLogo, Owner).
/projects/:id/trendsZehn Zeiträume: die Anteile der Site pro Zeitraum, jeder aktive Prompt mit seinen Urteilen pro Zeitraum, gewonnene und verlorene Prompts, Anteile pro Kategorie und die Listen gehalten, schwankend und verloren.
/projects/:id/sentimentTonalität pro Assistent unter den Antworten, die Sie nennen. Fügen Sie answers=1 hinzu, um diese Antworten einzeln zu bekommen, jede mit ihrer Tonalität und dem zitierten Satz.
/projects/:id/sourcesJede Domain, die die Assistenten zitiert haben, welche Art von Site sie ist und ob die Antworten, die sie zitieren, Sie nennen; und Ihre eigenen Seiten mit den Prompts und Assistenten, die auf jede verlinken.
/projects/:id/competitorsDie verfolgten Wettbewerber, wie oft jede Marke insgesamt und pro Assistent genannt wird, Zahlen im direkten Vergleich und Vorschläge nicht verfolgter Namen.
/projects/:id/competitors/:competitorIdEin Wettbewerber gegen Sie: gepaarte Zahlen, pro Assistent, pro Kategorie, die Prompts dreifach aufgeteilt und seine zitierten Seiten.
curl "https://teddit.io/api/projects/12/report?period=month&start=2026-09-15" \
  -H "Authorization: Bearer tdt_…"

Wie die Zahlen in diesen Antworten berechnet werden: Kennzahlen und Status.

Prompts und Kategorien

MethodePfadZugangZweck
GET/projects/:id/promptsviewerDie Prompt-Liste mit dem letzten Urteil jedes Assistenten und den Verlaufskästchen.
GET/projects/:id/prompts/export.csvviewerDieselbe Liste als CSV-Datei.
POST/projects/:id/promptsmemberEinen Prompt hinzufügen.
PATCH/projects/:id/prompts/:promptIdmemberEinen Prompt bearbeiten.
POST/projects/:id/prompts/bulkmemberEinen Status oder eine Kategorie für viele Prompts setzen, oder sie löschen.
POST/projects/:id/prompts/importmemberPrompts aus CSV-Text importieren.
POST/projects/:id/prompts/rewriteadminImportierte Suchanfragen zu vollständigen Fragen umschreiben. Nicht berechnet; braucht ein Guthaben über null. Bis zu 10 Aufrufe pro Stunde.
GET/projects/:id/prompts/rewrite/pendingviewerWie viele importierte Prompts noch rohe Anfragen sind.
GET/projects/:id/prompts/:promptIdviewerEin Prompt: das letzte Urteil pro Assistent, jede Antwort im Zeitverlauf, die Historie Woche für Woche.
GET/projects/:id/prompts/:promptId/answerviewerEine Antwort Wort für Wort, mit genannten Marken, Quellen und Websuchen.
GET/projects/:id/categoriesviewerDie Kategorien mit ihren Prompt-Zahlen.
POST/projects/:id/categoriesmemberEine leere Kategorie anlegen.
POST/projects/:id/categories/mergememberKategorien umbenennen, zusammenführen oder entfernen.

Die Liste und der Export nehmen dieselben Query-Parameter: q (Textsuche), category, status (draft, active, paused), intent, verdict (named, lost, cited, missing, failed), competitor (der Name eines verfolgten Wettbewerbers), stability (held, volatile, lost) und scanned (yes, never). Die Liste nimmt außerdem sort (created, text, category, rank, scanned), dir (asc, desc), page, perPage (5 bis 200, Voreinstellung 20) und die Zeitraum-Parameter, die festlegen, wofür ein Verlaufskästchen steht.

Hinzufügen nimmt text (3 bis 500 Zeichen, Pflicht), category oder categories (eine Liste von bis zu 8), intent (Voreinstellung informational), funnel (Voreinstellung awareness) und status (Voreinstellung active). Ein bereits verfolgter Text antwortet 409. Bearbeiten nimmt dieselben Felder, alle optional; categories ersetzt die ganze Liste.

Stapel nimmt ids (1 bis 5000) und status, category oder delete: true. Das Löschen eines Prompts löscht seine Antworten.

Import nimmt contents (der Text der Datei, bis zu 2.000.000 Zeichen), status (Voreinstellung draft) und dryRun. Er gibt rows, created, updated, skipped und categories zurück. Das Dateiformat steht auf der Seite Prompts importieren.

Eine Antwort nimmt engine (ein Assistenten-Schlüssel; Voreinstellung der erste Assistent, der geantwortet hat) oder r (die ID einer früheren Antwort, aus den results des Prompts).

Kategorien zusammenführen nimmt names (die zusammenzulegenden Kategorien) und into (der Name, den sie bekommen). Ein Name ist eine Umbenennung, mehrere sind eine Zusammenführung, und ein leeres into entfernt die Kategorien von ihren Prompts.

Wettbewerber und Seiten

MethodePfadZugangZweck
POST/projects/:id/competitorsmemberEinen Wettbewerber verfolgen.
PATCH/projects/:id/competitors/:competitorIdmemberEinen Wettbewerber ändern. Nur die gesendeten Felder ändern sich.
DELETE/projects/:id/competitors/:competitorIdmemberEinen Wettbewerber nicht mehr verfolgen. Gespeicherte Antworten bleiben erhalten.
GET/projects/:id/pagesviewerIhre Seiten aus der Sitemap mit ihren Titeln, und ob eine aktuelle Antwort auf jede verlinkt.
GET/projects/:id/crawlersviewerWas robots.txt jeden KI-Crawler lesen lässt, die entscheidende Zeile, llms.txt und die Historie der Prüfungen.
POST/projects/:id/crawlers/checkmemberrobots.txt und llms.txt jetzt erneut lesen; gibt dasselbe zurück wie das GET.
GET/projects/:id/searchesviewerDie Websuchen, die die Assistenten für die aktiven Prompts ausgeführt haben, die häufigsten zuerst.
GET/projects/:id/pages/:pageId/promptsviewerDie Prompts, deren aktuelle Antworten auf eine Seite verlinken.
POST/projects/:id/pages/import-sitemapmemberDie Sitemap der Site jetzt erneut lesen und die noch nicht aufgeführten Seiten hinzufügen. Bis zu 10 Aufrufe pro Stunde.

Verfolgen nimmt name (Pflicht), domain, aliases (weitere Namen, bis zu 30), color und logo. Ändern nimmt dieselben Felder, alle optional: Nur was Sie senden, ändert sich, aliases ersetzt die ganze Liste, und domain: null entfernt die Domain. Alle drei Wettbewerber-Endpunkte lesen die gespeicherten Antworten erneut, wenn sich die Namen ändern, und geben das Ergebnis als reanalysis zurück.

Seiten nimmt q, section (der erste Teil des Pfads), shown (yes oder no), page und perPage (5 bis 200, Voreinstellung 50).

Scans

MethodePfadZugangZweck
GET/projects/:id/scan-optionsviewerDie verbundenen Assistenten, ihre Modelle mit Kosten pro Antwort, aktive Prompts pro Kategorie, diesen Monat genutzte Scans und die Ausgaben der Site in diesem Monat.
POST/projects/:id/scans/estimateviewerDie erwarteten Kosten eines Scans, wie konfiguriert.
POST/projects/:id/scansadminEinen Scan starten.
GET/projects/:id/scans/liveviewerDer laufende Scan, falls vorhanden, mit Tempo und verbleibender Zeit.
POST/projects/:id/scans/:scanId/canceladminEinen laufenden Scan stoppen.
GET/projects/:id/scansviewerDie letzten 30 Scans.
GET/projects/:id/scans/:scanIdviewerEin Scan und die Antworten, die er gesammelt hat, 25 pro Seite.

Schätzung und Start nehmen denselben Body. Jedes Feld ist optional:

  • providers: Assistenten-Schlüssel. Leer bedeutet jeder verbundene Assistent.
  • promptIds: eine gewählte Auswahl von Prompts. Leer bedeutet jeder aktive Prompt. Prompts, die nicht aktiv sind, werden übersprungen.
  • category: eine Kategorie scannen.
  • sample: so viele Prompts scannen, zufällig gezogen.
  • models: Assistenten-Schlüssel zu Modell, aus den Optionen in scan-options. chatgpt-app und gemini-app (schnell: sofort beantwortet) sowie chatgpt-app-queue und gemini-app-queue (langsam und günstiger: einige Minuten) nehmen die Antwort, wie die App sie zeigt.
  • saved: true nimmt die Assistenten, Modelle und Kategorie aus den gespeicherten Scan-Einstellungen der Site statt aus dieser Anfrage. Beim Start nimmt es auch das gespeicherte Limit pro Scan.
  • Nur beim Start: budgetUsd (stoppen, sobald der Scan so viel gekostet hat; weggelassen, das Doppelte seiner Schätzung) und label.

Die Schätzung gibt prompts, answers, cost und formatted zurück. Der Start gibt den Scan zurück, antwortet 402, wenn das Guthaben den Scan nicht deckt, und 400 mit dem Grund für alles andere, was ihn am Starten hindert. Die Gründe, und wie Kosten gezählt werden, stehen auf der Seite Guthaben und Ausgabengrenzen.

Ein Scan nimmt tab (all, notNamed, competitorsOnly, errors), engine (ein Assistenten-Schlüssel) und page. Scan-Status sind queued, running, cancelling, cancelled, done und failed.

Ein vollständiges Beispiel

Die Site finden, einen Prompt hinzufügen, einen Scan einer Kategorie bepreisen, ihn starten und das Ergebnis lesen. Den Scan zu starten braucht einen Schlüssel Lesen + Scannen.

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"