Neu Die Doktorfy App startet am 22.10.
--Tage
--Std.
--Min
--Sek
Konto anlegen

Einbindung in deine Seite

Katalog, Verfügbarkeit und Warenkorb-Übernahme per API. Für Preisvergleiche, Apotheken-Tools, Shops und Partnerseiten. Es gibt für jedes System einen Weg.

KatalogAlle aktiven Produkte mit Hersteller, THC/CBD, Terpenen, GTIN und PZN.
VerfügbarkeitWelche Apotheken ein Produkt jetzt führen, mit Preis, Menge und Entfernung.
Warenkorb-ÜbernahmeDu übergibst die Auswahl, dein Kunde landet mit gefülltem Warenkorb bei uns.

Fertige Plugins zum Selbst-Installieren

Ein Download, ein Schlüssel, fertig. Der Button erscheint auf Produktseiten und im Warenkorb.

WooCommerce

WordPress 5.8+, PHP 7.4+
  1. ZIP unter Plugins → Installieren hochladen und aktivieren.
  2. Einstellungen → Doktorfy: Schlüssel eintragen.
  3. Beim Produkt die Doktorfy-ID (oder GTIN/PZN) eintragen.
ZIP herunterladen

Shopware 6

Shopware 6.6 und 6.7
  1. Ordner nach custom/plugins/ kopieren oder ZIP im Admin hochladen.
  2. bin/console plugin:install --activate DoktorfyIntegration
  3. Konfiguration: Schlüssel und Produktzuordnung (EAN = GTIN).
ZIP herunterladen

Shopify

Theme-Snippets, ohne App
  1. Zwei Snippet-Dateien im Theme anlegen und {% render %} einfügen.
  2. Metafeld doktorfy.id pro Produkt setzen (oder Barcode als GTIN).
  3. Öffentlichen Schlüssel bei uns anfragen, wir geben deinen Shop frei.
ZIP herunterladen

Ohne Server: öffentlicher Schlüssel

Seiten ohne eigenen Server (z. B. Shopify) nutzen einen öffentlichen Schlüssel pk_live_…. Er steht im Seitencode, kann aber nur Warenkörbe anlegen. Wir geben ihn nur für deine Adressen frei (Origin-Prüfung), dazu gelten Limits je Partner und je IP.

fetch("https://doktorfy.de/api/v1/partner/public/carts", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-Partner-Public-Key": "pk_live_DEIN_SCHLUESSEL" },
  body: JSON.stringify({ ref: "bestellung-123", items: [{ product_id: 3179, grams: 20 }] })
}).then(r => r.json()).then(j => { location.href = j.handoff_url; });

Getestet in einem echten Browser gegen die API: Produkt und Warenkorb führen zur Übernahme, eine nicht freigegebene Adresse wird blockiert, Fehlerfälle zeigen eine Meldung. Die Liquid-Snippets habe ich mit einer Liquid-Engine gerendert, aber nicht in einem Shopify-Shop installiert. WooCommerce (WordPress 6, WooCommerce 11.2, Block-Theme und Block-Warenkorb) und Shopware 6.7.2.2 wurden in echten Installationen geprüft.

Ohne Technik: nur ein Link

Du brauchst keinen Schlüssel, um auf Doktorfy zu verlinken. Jedes Produkt im Katalog hat eine eigene Adresse. Setze sie als Button auf deiner Seite.

Eine Provision lässt sich nur über die Warenkorb-Übernahme zuordnen, nicht über einen normalen Link.

Eine Anfrage: Warenkorb übergeben

Deine Seite sendet die ausgewählten Produkte an uns. Wir prüfen Bestand und wählen die passende Apotheke. Die Antwort enthält einen Link, auf den du deinen Kunden leitest.

curl -X POST https://doktorfy.de/api/v1/partner/carts \
  -H "Authorization: Bearer DEIN_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{"ref":"deine-bestellnr","items":[{"product_id":3179,"grams":20}],"mode":"abholung"}'
{
  "token": "…",
  "handoff_url": "https://doktorfy.de/uebernehmen/…",
  "expires_at": "…",
  "status": "ok"
}

Der Link ist 24 Stunden gültig. Der Bestand wird beim Öffnen neu geprüft, weil er sich ändern kann.

PHP (WordPress, WooCommerce, Shopware, Gambio, Eigenbau)

Der Aufruf läuft immer auf deinem Server, nie im Browser. So bleibt dein Schlüssel geheim.

<?php
// Beispiel: Button "Bei Doktorfy bestellen"
function doktorfy_handoff(int $productId, int $grams, string $ref): ?string {
    $ch = curl_init("https://doktorfy.de/api/v1/partner/carts");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_HTTPHEADER => [
            "Authorization: Bearer " . getenv("DOKTORFY_API_KEY"),
            "Content-Type: application/json",
        ],
        CURLOPT_POSTFIELDS => json_encode([
            "ref"   => $ref,
            "items" => [["product_id" => $productId, "grams" => $grams]],
        ]),
    ]);
    $res = json_decode((string)curl_exec($ch), true);
    return $res["handoff_url"] ?? null;
}

$url = doktorfy_handoff(3179, 20, "bestellung-123");
if ($url) { header("Location: " . $url); exit; }

Node.js / JavaScript (serverseitig)

const res = await fetch("https://doktorfy.de/api/v1/partner/carts", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.DOKTORFY_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    ref: "bestellung-123",
    items: [{ product_id: 3179, grams: 20 }],
  }),
});
const { handoff_url } = await res.json();
// Kunde auf handoff_url weiterleiten

Katalog und Verfügbarkeit abrufen

curl "https://doktorfy.de/api/v1/partner/catalog?limit=100&available=1" \
  -H "Authorization: Bearer DEIN_SCHLUESSEL"

curl "https://doktorfy.de/api/v1/partner/catalog/3179/availability?lat=50.94&lng=6.96&radius_km=50" \
  -H "Authorization: Bearer DEIN_SCHLUESSEL"
AufrufZweck
GET /catalogProdukte, Parameter limit, cursor, available, form, manufacturer
GET /catalog/{id}/availabilityApotheken mit Preis, Menge, Abholung, Versand, Express, optional Entfernung
POST /cartsWarenkorb anlegen, Antwort mit handoff_url
GET /carts/{token}Status: open, claimed, expired, ordered

Webhooks (optional)

Du hinterlegst eine https-Adresse. Wir melden cart.claimed (Kunde hat den Link geöffnet) und order.created (Bestellung entstanden, mit order_ref). Jede Meldung ist mit HMAC-SHA256 signiert.

<?php
$body = file_get_contents("php://input");
$sig  = $_SERVER["HTTP_X_DOKTORFY_SIGNATURE"] ?? "";
$calc = "sha256=" . hash_hmac("sha256", $body, getenv("DOKTORFY_WEBHOOK_SECRET"));
if (!hash_equals($calc, $sig)) { http_response_code(401); exit; }
http_response_code(200); // sonst Wiederholung nach 1 min, 5 min, 30 min, 2 h, 12 h

Wichtig

  • Der Schlüssel gehört nie in den Browser oder in öffentlichen Code.
  • Limit: 120 Anfragen pro Minute. Antworten sind JSON.
  • Preise stehen in Cent je 10 g. Mengen sind Vielfache von 10 g.
  • Ein Warenkorb enthält höchstens 100 g und genau eine Apotheke (MedCanG).
  • Über die API laufen keine Patientendaten. Das Rezept entsteht erst bei uns nach ärztlicher Prüfung.
  • Bestand und Preise ändern sich laufend. Zeige sie als Hinweis, nicht als Zusage.

Integration anfragen

Schreib uns kurz, wofür du die API nutzen willst. Du bekommst deinen Schlüssel und einen Ansprechpartner.

Integration anfragen →
Bleiben Sie informiert

Medizinisches Cannabis.
Direkt in Ihr Postfach.

Ratgeber, klinische Updates und Angebote vom Doktorfy-Team. Kein Spam. Jederzeit abbestellbar.

Klinisch geprüft DSGVO-konform Wöchentlicher Newsletter