Ressourcen · API und Bestellungen

Pedidos en JSON: esquema ph.order/1.0

Payload versionado de pedidos ph.order/1.0: esquema JSON publicado, reglas de compatibilidad y ejemplos de entrega.

Cuando se confirma una venta, el pedido se entrega en la integración (webhook, SFTP o correo) con este JSON canónico y versionado. Esta página es la especificación exacta del formato ph.order/1.0.

Reglas de formato

  • Todas las claves están siempre presentes; las claves nunca se omiten.
  • null significa «dato desconocido»; no debe interpretarse como 0 (algunos canales no desglosan impuestos por línea).
  • Los importes son números con hasta 2 decimales.
  • tax_rate es un decimal: 0.21 equivale al 21 %.
  • channel es el código interno del canal (p. ej. ebay, wllp) y channel_name su nombre visible (p. ej. Ebay, Wallapop).
  • total_gross es el importe total del pedido para el vendedor. shipping_gross (transporte) y channel_fees_gross (comisión del canal) se indican siempre de forma informativa; la comisión nunca forma parte de total_gross, y el transporte puede estar incluido o no según el canal (las lines dan el desglose de la mercancía).

Ejemplo de payload

{
  "schema": "ph.order/1.0",
  "order_id": "123456789",
  "channel": "ebay",
  "channel_name": "Ebay",
  "created_at": "2026-06-18T10:32:00+00:00",
  "status": "accepted",
  "currency": "EUR",
  "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,
  "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
}

Campos

CampoTipoDescripción
schemastringIdentificador del esquema y su versión. Siempre «ph.order/1.0» dentro de la versión mayor 1.
order_idstringIdentificador único del pedido.
channelstringCódigo interno del canal de venta (p. ej. ebay, wllp).
channel_namestringNombre visible del canal de venta (p. ej. Ebay, Wallapop).
created_atstring | nullFecha y hora de creación del pedido, en formato ISO 8601.
statusstringEstado del pedido (p. ej. accepted). Lista de valores abierta.
currencystring | nullMoneda del pedido en formato ISO 4217 (p. ej. EUR).
customerobjectDatos del comprador (objeto; ver campos más abajo).
linesarrayLíneas del pedido, una por artículo (lista de objetos; ver campos más abajo).
shipping_grossnumber | nullImporte del envío con impuestos incluidos.
channel_fees_grossnumber | nullComisión del canal o cargo del marketplace asociado al pedido (informativo; no forma parte de total_gross).
total_netnumber | nullBase imponible total del pedido (sin impuestos).
total_taxnumber | nullImporte total de impuestos del pedido.
total_grossnumber | nullImporte total a cobrar, impuestos incluidos.
carrierstring | nullTransportista del envío.
tracking_codestring | nullCódigo de seguimiento del envío.
tracking_urlstring | nullURL de seguimiento del envío.
payment_methodstring | nullMétodo de pago (p. ej. card). Lista de valores abierta.
source_accountstring | nullCuenta de origen en el canal de venta, si aplica.
customer.foreign_idstring | nullIdentificador del comprador en el canal de origen.
customer.first_namestring | nullNombre del comprador.
customer.last_namestring | nullApellidos del comprador.
customer.company_namestring | nullRazón social del comprador, si es una empresa.
customer.emailstring | nullCorreo electrónico del comprador.
customer.tax_numberstring | nullIdentificación fiscal del comprador (NIF/CIF/VAT).
customer.phonestring | nullTeléfono del comprador.
customer.addressobjectDirección de envío del comprador (objeto; ver campos más abajo).
customer.address.streetstring | nullCalle y número de la dirección de envío.
customer.address.citystring | nullPoblación de la dirección de envío.
customer.address.provincestring | nullProvincia o región de la dirección de envío.
customer.address.postal_codestring | nullCódigo postal de la dirección de envío.
customer.address.countrystring | nullPaís de la dirección de envío, en formato ISO 3166-1 alpha-2 (p. ej. ES).
lines[].external_idstring | nullIdentificador del artículo en el catálogo (SKU o referencia).
lines[].titlestring | nullTítulo o descripción del artículo.
lines[].quantityinteger | nullUnidades del artículo en esta línea.
lines[].line_netnumber | nullBase imponible de la línea (sin impuestos).
lines[].line_taxnumber | nullImporte de impuestos de la línea.
lines[].line_grossnumber | nullImporte de la línea con impuestos incluidos.
lines[].tax_ratenumber | nullTipo impositivo de la línea en decimal (0.21 = 21 %).

Compatibilidad y versiones

Para no tener que volver a tocar la integración en futuras versiones, conviene construir el lector siguiendo estas reglas:

  • Versionado: el campo schema es ph.order/MAYOR.MENOR (hoy ph.order/1.0). Fijarse solo en el MAYOR (el 1) y aceptar cualquier versión menor.
  • Solo se añade, nunca se quita: dentro de la versión mayor 1 los cambios son aditivos. Se podrán añadir campos nuevos (siempre presentes, con null cuando no apliquen), pero nunca se eliminará, renombrará ni se cambiará el tipo o el significado de un campo existente.
  • Ignorar los campos no reconocidos: el lector debe descartarlos sin fallar (no validar con additionalProperties: false).
  • Listas de valores abiertas: en status, channel, payment_method y currency pueden aparecer valores nuevos; tratar un valor desconocido sin romper (p. ej. como «otro»).
  • Solo un cambio de versión MAYOR (ph.order/2.0) requeriría adaptación, y se avisaría con antelación; las versiones menores no exigen ningún cambio por parte del consumidor.

Para validar con un JSON Schema, se facilita uno laxo para ph.order/1.x que ya contempla todo esto (acepta campos nuevos y cualquier versión menor). Para coordinar el cambio o solicitar el esquema y payloads de prueba, contactar con el responsable en Portal Hero.