Zum Inhalt springen
Alle Artikel

Produktanleitungen

Die Records API für Käufe aus deinem eigenen Backend nutzen

Referenz zu POST /api/v1/widgets/{token}/records: Felder, Idempotenz, Antworten, Besucherzuordnung und warum Datensätze als Imported gekennzeichnet sind, nie als Verified.

Provedly-Team··6 Min. Lesezeit

Wenn deine Käufe nicht über Stripe Checkout, Shopify oder WooCommerce laufen, kommen sie über die Records API zu Provedly. Ein Server-zu-Server-POST pro Bestellung, authentifiziert mit einem Bearer-Key pro Widget, und der Kauf erscheint innerhalb des Rückblickzeitraums als Benachrichtigung. Auf diesem Weg erstellte Datensätze tragen ein sichtbares Label „Imported“ und nie das Kennzeichen „Verified“, und dieser Beitrag erklärt diese Regel ebenso wie die Mechanik.

Der Endpunkt

POST https://provedly.app/api/v1/widgets/{token}/records
Authorization: Bearer <widget api key>
Content-Type: application/json

Der Key wird pro Widget im Tab Data erzeugt und kann dort rotiert werden. Behandle ihn wie jedes Secret: Umgebungsvariable auf dem Server, nie im clientseitigen Code. Der Endpunkt ist nur für Server-zu-Server-Aufrufe gedacht; Aufrufe aus einem Browser sind für jeden mit Devtools sichtbar, und ein geleakter Key erlaubt Fremden, Datensätze in dein Widget zu posten.

Felder

Feld Regeln Hinweise
name Pflicht, String, max. 120 Wird vor der Anzeige über dein Namensformat umformatiert
city optional, max. 100
state optional, max. 100 Wird vom Ortsformat „Stadt, Bundesstaat“ genutzt
country optional, 2 Buchstaben ISO 3166-1 Alpha-2, wird beim Speichern großgeschrieben
product_name optional, max. 150 Fällt auf den Standard-Produktnamen des Widgets zurück
price optional, max. 30 Freitext wie „$49“ oder „€39“
avatar_url optional, URL Wird genutzt, wenn der Avatar-Stil „image“ ist
external_id optional, max. 120 Eindeutig pro Widget; eine Wiederholung liefert 422
occurred_at optional, ISO 8601 Standard ist jetzt
visitor optional Die Besucher-ID von Provedly, für die Zuordnung

Sende, was du hast. Ein Datensatz nur mit name ist gültig und wird mit dem Standardprodukt des Widgets und ohne Ort angezeigt.

Ein minimales Beispiel

curl -X POST https://provedly.app/api/v1/widgets/pp_your_token/records \
  -H "Authorization: Bearer $PROVEDLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Doe",
    "city": "Berlin",
    "country": "DE",
    "product_name": "Pro Plan",
    "price": "€49",
    "external_id": "order_123",
    "occurred_at": "2026-08-12T14:03:00Z"
  }'

Antworten:

201 Created
{ "id": 812, "hash": "9c1e0b7a…", "verified": false, "occurred_at": "2026-08-12T14:03:00+00:00" }

401 Unauthorized   wrong or missing bearer key
422 Unprocessable  validation errors, including a duplicate external_id

Beachte "verified": false in der Erfolgsantwort. Das ist kein Bug, und es gibt kein Flag, um es umzuschalten.

Wann du sie aufrufst

Ruf sie auf, nachdem die Zahlung bestätigt ist, nicht wenn die Bestellung angelegt wird. Ein Datensatz für einen abgebrochenen oder fehlgeschlagenen Checkout ist eine falsche Benachrichtigung, und genau das soll das System verhindern. In den meisten Backends heißt das: im Handler für den Erfolgs-Callback deines Zahlungsanbieters oder in dem Job, der eine Bestellung als bezahlt markiert.

Sende immer external_id. Zahlungs-Callbacks werden wiederholt, Queues liefern erneut aus, und Deploys starten Worker mitten im Job neu. Wenn external_id auf deine Bestell-ID gesetzt ist, liefert der zweite Versuch 422, und du kannst das als Erfolg behandeln. Ohne sie zeigst du irgendwann denselben Kauf zweimal.

Setz occurred_at auf den tatsächlichen Zahlungszeitpunkt, statt den Standard greifen zu lassen. Wenn sich eine Queue zwanzig Minuten lang staut, sagt der Toast trotzdem das Richtige, und der Datensatz landet auf der Verifizierungsseite an der richtigen Stelle.

Zuordnung

Die Kennzahl proof-unterstützter Bestellungen im Dashboard zählt Käufer, die vor dem Kauf eine Benachrichtigung gesehen haben, zugeordnet über die Besucher-ID innerhalb eines 30-Tage-Fensters. Bei API-Datensätzen funktioniert das nur, wenn du die ID mitsendest.

Auf dem Client, an der Stelle, an der der Besucher den Checkout beginnt:

const visitor = window.Provedly?.visitorId();
// include it in your checkout form or API call

Auf dem Server gibst du sie als visitor im Datensatz weiter. Wenn dein Checkout auf einer anderen Domain liegt als das Widget, trag die ID per URL oder in deiner Session hinüber. Provedly schätzt nie eine Zuordnung, eine fehlende ID führt also zu einer leeren Kennzahl statt zu einer falschen. Siehe Proof-unterstützte Bestellungen messen.

Warum API-Datensätze nie „Verified“ sind

Provedly kann einen Webhook von Stripe, Shopify oder WooCommerce verifizieren, weil der Anbieter die Nutzlast mit einem Secret signiert und Provedly die Signatur prüft. Ein POST von deinem Server trägt einen Bearer-Key, und der beweist, dass der Aufrufer den Key besitzt, nicht dass eine Zahlung stattgefunden hat. Ein Händler könnte hundert Datensätze in einer Schleife per Script erzeugen. Provedly kann den Unterschied von außen nicht erkennen, also bekommen API-Datensätze nie das Verifizierungszeichen. Sie erscheinen im Widget mit einem Label „Imported“, das keine Einstellung, kein Plan und keine Support-Anfrage entfernen kann, und die öffentliche Verifizierungsseite führt sie unter „Site owner's backend (API)“ auf.

Das ist eine bewusste Entscheidung, und sie ist der Hauptgrund, warum es Provedly gibt. Die meisten Benachrichtigungstools akzeptieren, Stand Oktober 2026 und laut ihren Angeboten, beliebige Kaufeinträge und zeigen sie genauso an wie echte. Ein Besucher hat keine Möglichkeit, das zu erkennen. Bei Provedly tragen nur signierte Bestellungen das Verifizierungszeichen, und die Verifizierungsseite listet jede Quelle auf. Wenn du das Verifizierungszeichen willst, leite Zahlungen über einen Anbieter mit signiertem Webhook, wie in Stripe-Webhooks für verifizierte Käufe beschrieben.

Nachträglich befüllen

Für die Historie solltest du die API nicht in einer Schleife über die Bestellungen des letzten Jahres laufen lassen. Nutze stattdessen den CSV-Import im Tab Data; er erkennt Duplikate über Name und Stadt innerhalb einer Stunde, setzt occurred_at pro Zeile und speichert Zeilen außerhalb des Rückblickzeitraums, ohne sie anzuzeigen. Die API ist für den laufenden Strom gedacht. Siehe Frühere Bestellungen per CSV importieren.

Häufige Fragen

Gibt es ein Rate Limit?

Poste einen Datensatz pro Bestellung, wenn sie passiert, und du erreichst kein Limit. Für umfangreiche Historie nutze den CSV-Import.

Kann ich einen Datensatz nach dem Posten ändern oder löschen?

Datensätze lassen sich im Dashboard entfernen. Einen Update-Endpunkt gibt es nicht; poste einen korrigierten Datensatz mit neuer external_id und lösche den alten.

Kann ich einen Preis in einer Währung übergeben, die das Widget nicht kennt?

Ja. price ist Freitext mit bis zu 30 Zeichen und wird so angezeigt, wie du ihn sendest. Formatiere ihn auf deiner Seite, einschließlich Währungssymbol.

Die API und verifizierte Webhooks sind im Free-Plan enthalten: vollständige Referenz lesen oder ein Widget anlegen.

apibackendintegration

Neue Artikel per E-Mail erhalten

Ehrlicher Social Proof, verifizierte Käufe und was die Conversion wirklich bewegt. Höchstens ein paar E-Mails im Monat; Abmelden mit einem Klick.

Wir schicken dir eine E-Mail zur Bestätigung. Deine Adresse wird nur für diesen Newsletter verwendet; siehe Datenschutzerklärung (auf Englisch).

Zeig Proof, hinter dem du stehen kannst.

Kostenloser Plan, eine Website, 2,000 Impressionen im Monat, verifizierte Käufe inklusive. Im kostenlosen Plan verlinkt das Badge auf deine Verifizierungsseite, und genau darum geht es.