Medikamenten-Bestellungen Extended
Ein Tierhalter bestellt in Petla ein Medikament zur Abholung nach. Ihre Software ruft die Bestellung ab und meldet zurück, was sie damit getan hat.
medications.receive erlaubt das Lesen, medications.statusInbound das Zurückmelden. Ein System, das Bestellungen nur in seiner eigenen Liste anzeigen will, deklariert die erste und sonst nichts. Ohne die jeweilige Fähigkeit antwortet der Aufruf mit 400 capability_not_declared.
⚠️ Ohne medications.receive erhalten Sie auch die medicationOrder.*-Ereignisse nicht — eine Meldung über ein Objekt, das Sie nicht lesen dürfen, wäre ein Hinweis auf einen 400.
1. Bestellungen abrufen
GET /medication-orders?since=2026-09-08T09:00:00.000Z&limit=50
Authorization: Bearer <Verbindungs-Token>
Petla-Clinic-Id: <clinicId>Der Aufruf ist an die Praxis gebunden, nicht an einen Termin: Eine Nachbestellung entsteht ohne Buchung, es gibt also nichts, woran sie hängen könnte. Das ist dieselbe Regel wie beim Anamnesebogen und der Grund, warum hier eine Liste steht, wo Dokumente keine haben: Dort ginge es um freigegebene Unterlagen der Praxis, hier um Anfragen, die die Praxis bearbeiten soll.
Gefiltert wird auf updatedAt, sortiert wird ebenso. Die Antwort trägt nextSince — aber nur bei einer vollen Seite; ist die Seite kürzer, gibt es nichts weiter zu holen.
⚠️ Anders als der Ereignis-Cursor läuft dieser Wert nicht ab: Es ist ein Blick auf den aktuellen Stand, kein Protokoll. Eine Bestellung erneut zu lesen kostet nichts, eine zu verpassen schon — deshalb ist ein unlesbares since ein ignorierter Parameter und kein 410.
Ohne since erhalten Sie den vollständigen Bestand. Das ist der Einstieg: Der Backfill des Ereignis-Stroms umfasst nur Termine, also lesen Sie hier einmal den Stand und folgen danach den Ereignissen.
Die Antwort
{
"orders": [
{
"id": "b3d1…",
"status": "REQUESTED",
"requestedAt": "2026-09-08T08:41:12.000Z",
"updatedAt": "2026-09-08T08:41:12.000Z",
"client": { "petlaBookerId": "9c02…", "firstName": "Marie",
"lastName": "Sommer", "email": "…", "phone": "…" },
"petlaPetId": "3f7c…",
"petNames": ["Rex"],
"items": [
{ "category": { "id": "a64e…", "name": "Wurmkur / Entwurmung" },
"itemId": null, "text": "Bravecto", "quantity": 2 }
],
"ownerNotes": "Bitte für zwei Monate.",
"readyBy": null,
"pickedUpAt": null
}
],
"nextSince": null
}Eine Position trägt itemId, wenn der Halter einen Eintrag aus der Liste der Praxis gewählt hat, und text, wenn er getippt hat. Rechnen Sie fest mit dem zweiten Fall. Die Auswahlliste ist je Praxis konfiguriert und in der Produktion praktisch leer; gemessen am 2026-09-08 trägt keine Position eine itemId.
Das bleibt auch dann so, wenn die Listen gefüllt sind: Ein Halter, der etwas außerhalb der Liste braucht, stellt eine echte Anfrage — eine reine Auswahlliste würde sie verlieren statt sie zu strukturieren.
⚠️ Es gibt keinen gemeinsamen Katalog zum Abgleichen. Anders als GET /vaccine-products, das flottenweit gilt, gehört eine Medikamenten-Kategorie einer Praxis; ein selbst angelegter Eintrag bedeutet für Ihre Artikelnummern nichts. Ordnen Sie zu, was Sie zuordnen können, und zeigen Sie den Rest an.
petlaPetId ist das eine Tier, das Petla auflösen konnte; petNames sind alle Namen, die der Halter genannt hat. Eine Bestellung kann mehrere Tiere betreffen — wer nur die Id liest, verliert die übrigen.
2. Den Stand zurückmelden
POST /medication-orders/{orderId}/status
Authorization: Bearer <Verbindungs-Token>
Petla-Clinic-Id: <clinicId>
Content-Type: application/json
{ "status": "READY", "readyBy": "2026-09-09T10:00:00.000Z",
"note": "Liegt an der Rezeption bereit." }Sie dürfen CONFIRMED, READY, PICKED_UP und DECLINED setzen. REQUESTED ist die Handlung des Halters, CANCELLED sein Rückzug — eine Absage der Praxis ist DECLINED. Die Reihenfolge dazwischen wird nicht geprüft: READY ohne vorheriges CONFIRMED ist eine Praxis, die die Ware vorbereitet und einen Klick übersprungen hat.
note wird der Praxis angezeigt und nie über die Notiz des Halters geschrieben — die ist die Bestellung selbst.
Schicken Sie denselben status erneut, antwortet Petla mit 200 und Idempotent-Replayed: true. Das ist der Aufruf, den Ihr HTTP-Client nach einer Zeitüberschreitung von selbst wiederholt, und ein 4xx darf nach § 11 nicht unverändert wiederholt werden — ein 409 hieße für ein regelkonformes PVS, die Meldung sei nicht angekommen.
Abgelehnt wird nur der Weg aus einem Endstand heraus: PICKED_UP, DECLINED und CANCELLED ergeben 409 medication_order_not_open mit meta.currentStatus.
Die Praxis kann dieselbe Bestellung auch im Petla-Dashboard bearbeiten — so wurde bisher jede Bestellung in der Produktion bearbeitet. Verlassen Sie sich deshalb nicht auf den Stand, den Sie zuletzt gesendet haben, sondern lesen Sie das aktuelle Objekt. Genau dafür gibt es medicationOrder.updated.
Die Ereignisse
medicationOrder.created, medicationOrder.updated und medicationOrder.cancelled laufen über denselben Ereignis-Strom wie Termine. Das Ereignis ist eine Benachrichtigung, kein Beleg: Lesen Sie das Objekt danach.
Jeder Code mit Bedeutung und Abhilfe: Fehlercodes.