Ressourcen · API und Bestellungen

Bestellungen in JSON: Schema ph.order/1.2

Versionierter Bestell-Payload ph.order/1.2: veröffentlichtes JSON-Schema, Kompatibilitätsregeln und Zustellbeispiele.

Wenn ein Verkauf bestätigt wird, wird die Bestellung in der Integration (Webhook, SFTP oder E-Mail) mit diesem kanonischen und versionierten JSON übermittelt. Diese Seite ist die genaue Spezifikation des Formats ph.order/1.2.

Formatregeln

  • Alle Schlüssel sind immer vorhanden; Schlüssel werden niemals weggelassen.
  • null bedeutet „unbekannter Wert“; es darf nicht als 0 interpretiert werden (einige Kanäle schlüsseln Steuern nicht pro Position auf).
  • Die Beträge sind Zahlen mit bis zu 2 Dezimalstellen.
  • tax_rate ist eine Dezimalzahl: 0.21 entspricht 21 %.
  • channel ist der interne Code des Kanals (z. B. ebay, wllp) und channel_name sein sichtbarer Name (z. B. Ebay, Wallapop).
  • total_gross ist der Verkaufspreis für den Verkäufer, einschließlich der Verkäuferprovision: channel_fees_gross (was der Kanal dem Verkäufer davon einbehält) und buyer_fees_gross (was der Käufer dem Kanal zusätzlich zum Preis zahlt, nie Teil von total_gross) sind informativ; shipping_gross (Versand) ebenfalls, und er kann je nach Kanal in total_gross enthalten sein oder nicht (die lines geben die Aufschlüsselung der Ware).

Beispiel-Payload

{
  "schema": "ph.order/1.2",
  "order_id": "123456789",
  "channel": "ebay",
  "channel_name": "Ebay",
  "created_at": "2026-06-18T10:32:00+00:00",
  "status": "accepted",
  "currency": "EUR",
  "original_currency": "EUR",
  "exchange_rate": 1.0,
  "customer": {
    "foreign_id": "a1b2c3d4",
    "first_name": "Toni",
    "last_name": "Bosch",
    "company_name": null,
    "email": "toni.bosch@example.com",
    "tax_number": "12345678Z",
    "phone": "+34600000000",
    "address": {
      "street": "Carrer Major 1",
      "city": "Campdevànol",
      "province": "Girona",
      "postal_code": "17530",
      "country": "ES"
    }
  },
  "lines": [
    {
      "external_id": "ITEM-001",
      "title": "Faro delantero izquierdo",
      "quantity": 1,
      "line_net": 100.00,
      "line_tax": 21.00,
      "line_gross": 121.00,
      "tax_rate": 0.21
    }
  ],
  "shipping_gross": 10.00,
  "channel_fees_gross": 13.00,
  "buyer_fees_gross": null,
  "total_net": 100.00,
  "total_tax": 21.00,
  "total_gross": 131.00,
  "carrier": "Correos",
  "tracking_code": "AB123456789ES",
  "tracking_url": "https://tracking.example.com/AB123456789ES",
  "payment_method": "card",
  "source_account": null
}

Felder

FeldTypBeschreibung
schemastringKennung des Schemas und seiner Version, „ph.order/HAUPT.NEBEN“ (heute ph.order/1.2). Nur auf die Hauptversion achten.
order_idstringEindeutige Kennung der Bestellung.
channelstringInterner Code des Verkaufskanals (z. B. ebay, wllp).
channel_namestringSichtbarer Name des Verkaufskanals (z. B. Ebay, Wallapop).
created_atstring | nullDatum und Uhrzeit der Erstellung der Bestellung, im Format ISO 8601.
statusstringStatus der Bestellung (z. B. accepted). Offene Werteliste.
currencystring | nullWährung der Beträge der Bestellung im Format ISO 4217 (z. B. EUR).
original_currencystring | nullWährung, in der der Käufer bezahlt hat, im Format ISO 4217. Weicht sie ab, wurde die Bestellung umgerechnet und ihre Beträge sind in currency.
exchange_ratenumber | nullEinheiten von original_currency, die eine Einheit von currency bei der Umrechnung der Bestellung wert war (z. B. 0.8346 Pfund pro Euro); 1, wenn nicht umgerechnet wurde.
customerobjectDaten des Käufers (Objekt; siehe Felder weiter unten).
linesarrayPositionen der Bestellung, eine pro Artikel (Liste von Objekten; siehe Felder weiter unten).
shipping_grossnumber | nullBetrag des Versands inklusive Steuern.
channel_fees_grossnumber | nullProvision, die der Kanal dem Verkäufer für die Bestellung einbehält (informativ; in total_gross enthalten, der Kanal zieht sie von der Auszahlung ab).
buyer_fees_grossnumber | nullGebühren, die der Käufer dem Kanal zusätzlich zum Preis zahlt, z. B. der Käuferschutz (informativ; nicht Teil von total_gross).
total_netnumber | nullGesamte Bemessungsgrundlage der Bestellung (ohne Steuern).
total_taxnumber | nullGesamter Steuerbetrag der Bestellung.
total_grossnumber | nullVerkaufspreis für den Verkäufer, inklusive Steuern und Verkäuferprovision (der Versand kann je nach Kanal enthalten sein oder nicht).
carrierstring | nullTransporteur des Versands.
tracking_codestring | nullSendungsverfolgungscode des Versands.
tracking_urlstring | nullSendungsverfolgungs-URL des Versands.
payment_methodstring | nullZahlungsmethode (z. B. card). Offene Werteliste.
source_accountstring | nullHerkunftskonto im Verkaufskanal, sofern zutreffend.
customer.foreign_idstring | nullKennung des Käufers im Herkunftskanal.
customer.first_namestring | nullVorname des Käufers.
customer.last_namestring | nullNachname des Käufers.
customer.company_namestring | nullFirmenname des Käufers, sofern es sich um ein Unternehmen handelt.
customer.emailstring | nullE-Mail-Adresse des Käufers.
customer.tax_numberstring | nullSteuernummer des Käufers (NIF/CIF/VAT).
customer.phonestring | nullTelefon des Käufers.
customer.addressobjectLieferadresse des Käufers (Objekt; siehe Felder weiter unten).
customer.address.streetstring | nullStraße und Hausnummer der Lieferadresse.
customer.address.citystring | nullOrt der Lieferadresse.
customer.address.provincestring | nullProvinz oder Region der Lieferadresse.
customer.address.postal_codestring | nullPostleitzahl der Lieferadresse.
customer.address.countrystring | nullLand der Lieferadresse, im Format ISO 3166-1 alpha-2 (z. B. ES).
lines[].external_idstring | nullKennung des Artikels im Katalog (SKU oder Referenz).
lines[].titlestring | nullTitel oder Beschreibung des Artikels.
lines[].quantityinteger | nullEinheiten des Artikels in dieser Position.
lines[].line_netnumber | nullBemessungsgrundlage der Position (ohne Steuern).
lines[].line_taxnumber | nullSteuerbetrag der Position.
lines[].line_grossnumber | nullBetrag der Position inklusive Steuern.
lines[].tax_ratenumber | nullSteuersatz der Position als Dezimalzahl (0.21 = 21 %).

Kompatibilität und Versionen

Um die Integration bei künftigen Versionen nicht erneut anfassen zu müssen, sollte der Reader nach diesen Regeln aufgebaut werden:

  • Versionierung: Das Feld schema ist ph.order/HAUPT.NEBEN (heute ph.order/1.2). Achten Sie nur auf die HAUPT-Version (die 1) und akzeptieren Sie jede Nebenversion.
  • Veröffentlichte Versionen: 1.0, das ursprüngliche Schema. 1.1 fügt buyer_fees_gross hinzu und legt channel_fees_gross in allen Kanälen als die Provision fest, die der Kanal dem Verkäufer berechnet; bei Wallapop enthielt es den Käuferschutz des Käufers, der nach buyer_fees_gross wandert. 1.2 fügt original_currency und exchange_rate hinzu: Eine in einer anderen Währung bezahlte Bestellung kommt mit Beträgen in Euro an, und diese Felder geben an, in welcher Währung der Käufer bezahlt hat und zu welchem Kurs.
  • Es wird nur hinzugefügt, niemals entfernt: Innerhalb der Hauptversion 1 sind die Änderungen additiv. Es können neue Felder hinzugefügt werden (immer vorhanden, mit null, wenn sie nicht zutreffen), aber ein bestehendes Feld wird niemals entfernt, umbenannt oder in Typ oder Bedeutung geändert. Einzige Ausnahme: die von 1.1, bei den veröffentlichten Versionen beschrieben.
  • Nicht erkannte Felder ignorieren: Der Reader muss sie verwerfen, ohne zu scheitern (nicht mit additionalProperties: false validieren).
  • Offene Wertelisten: In status, channel, payment_method, currency und original_currency können neue Werte auftauchen; behandeln Sie einen unbekannten Wert, ohne zu brechen (z. B. als „sonstiges“).
  • Nur eine Änderung der HAUPT-Version (ph.order/2.0) würde eine Anpassung erfordern, und sie würde rechtzeitig angekündigt; die Nebenversionen erfordern keinerlei Änderung seitens des Konsumenten, abgesehen von der oben genannten Ausnahme in 1.1.

Zur Validierung mit einem JSON Schema wird ein lockeres für ph.order/1.x bereitgestellt, das all dies bereits berücksichtigt (akzeptiert neue Felder und jede Nebenversion). Um die Änderung zu koordinieren oder das Schema und Test-Payloads anzufordern, wenden Sie sich an den Ansprechpartner bei Portal Hero.