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
| Campo | Tipo | Descripción |
|---|---|---|
schema | string | Identificador del esquema y su versión. Siempre «ph.order/1.0» dentro de la versión mayor 1. |
order_id | string | Identificador único del pedido. |
channel | string | Código interno del canal de venta (p. ej. ebay, wllp). |
channel_name | string | Nombre visible del canal de venta (p. ej. Ebay, Wallapop). |
created_at | string | null | Fecha y hora de creación del pedido, en formato ISO 8601. |
status | string | Estado del pedido (p. ej. accepted). Lista de valores abierta. |
currency | string | null | Moneda del pedido en formato ISO 4217 (p. ej. EUR). |
customer | object | Datos del comprador (objeto; ver campos más abajo). |
lines | array | Líneas del pedido, una por artículo (lista de objetos; ver campos más abajo). |
shipping_gross | number | null | Importe del envío con impuestos incluidos. |
channel_fees_gross | number | null | Comisión del canal o cargo del marketplace asociado al pedido (informativo; no forma parte de total_gross). |
total_net | number | null | Base imponible total del pedido (sin impuestos). |
total_tax | number | null | Importe total de impuestos del pedido. |
total_gross | number | null | Importe total a cobrar, impuestos incluidos. |
carrier | string | null | Transportista del envío. |
tracking_code | string | null | Código de seguimiento del envío. |
tracking_url | string | null | URL de seguimiento del envío. |
payment_method | string | null | Método de pago (p. ej. card). Lista de valores abierta. |
source_account | string | null | Cuenta de origen en el canal de venta, si aplica. |
customer.foreign_id | string | null | Identificador del comprador en el canal de origen. |
customer.first_name | string | null | Nombre del comprador. |
customer.last_name | string | null | Apellidos del comprador. |
customer.company_name | string | null | Razón social del comprador, si es una empresa. |
customer.email | string | null | Correo electrónico del comprador. |
customer.tax_number | string | null | Identificación fiscal del comprador (NIF/CIF/VAT). |
customer.phone | string | null | Teléfono del comprador. |
customer.address | object | Dirección de envío del comprador (objeto; ver campos más abajo). |
customer.address.street | string | null | Calle y número de la dirección de envío. |
customer.address.city | string | null | Población de la dirección de envío. |
customer.address.province | string | null | Provincia o región de la dirección de envío. |
customer.address.postal_code | string | null | Código postal de la dirección de envío. |
customer.address.country | string | null | País de la dirección de envío, en formato ISO 3166-1 alpha-2 (p. ej. ES). |
lines[].external_id | string | null | Identificador del artículo en el catálogo (SKU o referencia). |
lines[].title | string | null | Título o descripción del artículo. |
lines[].quantity | integer | null | Unidades del artículo en esta línea. |
lines[].line_net | number | null | Base imponible de la línea (sin impuestos). |
lines[].line_tax | number | null | Importe de impuestos de la línea. |
lines[].line_gross | number | null | Importe de la línea con impuestos incluidos. |
lines[].tax_rate | number | null | Tipo 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.