Orders
Visión General
El dominio Orders es responsable del ciclo de vida de los pedidos en la plataforma Getnet. Un pedido representa una solicitud de acreditación, compra de equipo o cambio de producto realizada por un merchant (establecimiento comercial).
Creación de Pedido — POST /orders
Prerrequisito: Selección de Ofertas
Antes de crear un pedido, el canal debe haber realizado previamente la llamada al endpoint
GET /offerings (documentado en offerings.md), mostrado las ofertas disponibles al cliente y capturado la selección del establecimiento.El canal puede recibir una o más ofertas disponibles. El cliente selecciona una o más ofertas para contratar.
⚠️ Guarde elorder_iddevuelto por la creación del pedido — es obligatorio en todas las llamadas posteriores:PUT /orders/{order_id}(actualización),POST /orders/{order_id}/validation(validación) yPUT /orders/{order_id}/submit(envío). Sin él no es posible dar continuidad al pedido.
Cumplimentación del campo merchant
El campo
merchant identifica el establecimiento que está realizando el pedido. El registro del merchant debe haber sido realizado previamente conforme se describe en merchants.md.Prerrequisito — Registro del merchant
Antes de crear el pedido, el canal debe llamar a
GET /merchants/{merchant_id} para confirmar que el merchant existe y obtener su identificador.Regla de mapeo
El campo
merchant_id está en la raíz del objeto devuelto por GET /merchants/{merchant_id}. El campo merchant del pedido debe cumplimentarse únicamente con ese valor:Campo en el pedido (merchant) | Origen en el retorno de GET /merchants/{merchant_id} |
|---|---|
merchant_id | merchant_id (raíz del objeto) |
Ejemplo
Retorno de
GET /merchants/{merchant_id} (simplificado):json
{
"merchant_id": "6a0fc6f29a4f90ca92a8670e",
"acquirer_code": "getnet",
"merchant_legal_data": {}
}json
{
"merchant_id": "6a0fc6f29a4f90ca92a8670e",
"acquirer_code": "getnet",
"merchant_legal_data": {}
}Campo
merchant en el payload de POST /orders:json
{
"merchant": {
"merchant_id": "6a0fc6f29a4f90ca92a8670e"
}
}json
{
"merchant": {
"merchant_id": "6a0fc6f29a4f90ca92a8670e"
}
}Cumplimentación del campo items
El campo
items del payload de POST /orders es un array que representa, de forma aplanada (flat), todos los productos de todas las ofertas seleccionadas por el cliente.Regla general de mapeo
Para cada oferta seleccionada por el cliente, itere sobre el array
items[] de la oferta devuelta por GET /offerings. Cada entrada de ese array se convierte en un objeto dentro del items[] del pedido.text
GET /offerings → offering[n].items[x] → POST /orders → items[sequencial]
text
GET /offerings → offering[n].items[x] → POST /orders → items[sequencial]
Campos obligatorios de cada ítem del pedido
Campo en el pedido (items[*]) | Origen en el retorno de GET /offerings | Observación |
|---|---|---|
item_sequence_number | — | Secuencial global creciente (1, 2, 3…) considerando todos los ítems de todas las ofertas seleccionadas. |
offering.priced_offering_id | offering.priced_offering_id (raíz de la oferta) | El priced_offering_id está en la raíz del objeto de la oferta, no dentro de items. |
offering.smart_offering_id | offering.priced_offering_id (raíz de la oferta) | Debe cumplimentarse con el mismo valor de priced_offering_id. |
product | offering.items[x].product | El objeto product debe enviarse íntegramente como se devuelve en la oferta. |
quantity | offering.items[x].quantity | Cantidad indicada en la oferta para ese producto. |
Campos opcionales/condicionales de cada ítem del pedido
Los campos siguientes existen dentro de
items[x] en el retorno de GET /offerings para determinados tipos de producto. Cuando están presentes, deben reenviarse en el ítem correspondiente del pedido:Campo en el pedido (items[*]) | Origen en el retorno de GET /offerings | Cuando está presente |
|---|---|---|
settlement_period | offering.items[x].settlement_period | Productos de tipo composite (adquirencia). |
unit_price | offering.items[x].unit_price | Productos con precificación (p. ej.: terminal con alquiler mensual). |
total_price | offering.items[x].total_price | Productos con precificación (p. ej.: terminal con alquiler mensual). |
Cumplimentación del campo delivery_info
El campo
delivery_info contiene la información de entrega del equipo.Prerrequisito — Consulta de tipos de envío
Antes de cumplimentar
delivery_info, el canal debe llamar a GET /offerings/delivery-data (documentado en offerings.yaml) informando el legal_document_number y el postal_code del cliente. La respuesta devuelve los tipos de envío disponibles en el array delivery_methods[].El cliente selecciona el tipo de envío deseado entre los disponibles:
delivery_type | Descripción |
|---|---|
scheduled | Entrega Programada |
normal | Entrega Convencional |
express | Entrega Express |
Dirección de entrega — delivery_address
Debe cumplimentarse con la dirección de entrega del equipo informada por el cliente. Sigue la misma estructura que los campos de dirección del merchant (
business_address, residential_address, commercial_address).Campos por tipo de envío
Programada (scheduled)
| Campo | Origen / Valor |
|---|---|
delivery_type | "scheduled" (fijo) |
delivery_amount | delivery_methods[x].delivery_amount de GET /offerings/delivery-data |
delivery_time | delivery_methods[x].delivery_time de GET /offerings/delivery-data |
recommended_delivery_period | Período seleccionado por el cliente ("morning", "afternoon" o "night") |
period_grid | Entrada de delivery_methods[x].period_grid[] correspondiente al período seleccionado por el cliente |
delivery_reference_point | Punto de referencia informado por el cliente |
delivery_time_type | null |
Ejemplo:
json
{
"delivery_info": {
"delivery_type": "scheduled",
"delivery_amount": 0,
"delivery_time": "0",
"recommended_delivery_period": "morning",
"period_grid": [
{
"date": "2024-12-04",
"recommended_delivery_period": "M",
"begin_time": "08:00:00",
"end_time": "11:30:00"
}
],
"delivery_reference_point": "Próximo ao mercado da esquina",
"delivery_time_type": null,
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}json
{
"delivery_info": {
"delivery_type": "scheduled",
"delivery_amount": 0,
"delivery_time": "0",
"recommended_delivery_period": "morning",
"period_grid": [
{
"date": "2024-12-04",
"recommended_delivery_period": "M",
"begin_time": "08:00:00",
"end_time": "11:30:00"
}
],
"delivery_reference_point": "Próximo ao mercado da esquina",
"delivery_time_type": null,
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}Convencional (normal)
| Campo | Origen / Valor |
|---|---|
delivery_type | "normal" (fijo) |
delivery_amount | delivery_methods[x].delivery_amount de GET /offerings/delivery-data |
delivery_time | delivery_methods[x].delivery_time de GET /offerings/delivery-data |
delivery_time_type | delivery_methods[x].delivery_time_type de GET /offerings/delivery-data (D o H) |
Ejemplo:
json
{
"delivery_info": {
"delivery_type": "normal",
"delivery_amount": 0,
"delivery_time": "3",
"delivery_time_type": "D",
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}json
{
"delivery_info": {
"delivery_type": "normal",
"delivery_amount": 0,
"delivery_time": "3",
"delivery_time_type": "D",
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}Express (express)
| Campo | Origen / Valor |
|---|---|
delivery_type | "express" (fijo) |
delivery_amount | delivery_methods[x].delivery_amount de GET /offerings/delivery-data |
delivery_time | delivery_methods[x].delivery_time de GET /offerings/delivery-data |
delivery_time_type | delivery_methods[x].delivery_time_type de GET /offerings/delivery-data (D o H) |
Ejemplo:
json
{
"delivery_info": {
"delivery_type": "express",
"delivery_amount": 2500,
"delivery_time": "3",
"delivery_time_type": "D",
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}json
{
"delivery_info": {
"delivery_type": "express",
"delivery_amount": 2500,
"delivery_time": "3",
"delivery_time_type": "D",
"delivery_address": {
"street": "Rua Exemplo",
"number": "123",
"district": "Centro",
"city": "Porto Alegre",
"state": "RS",
"postal_code": "90000000",
"country": "BR"
}
}
}Ejemplo de mapeo
Retorno de GET /offerings (simplificado)
El cliente seleccionó dos ofertas: "Adquirência Físico Aluguel" (1 ítem) y "Oferta E-commerce - Link de Pagamento V2" (7 ítems). A continuación, la estructura resumida del retorno:
json
[
{
"priced_offering_id": "6a0fc78fd653164a21cf71f8",
"smart_offering_id": "6a0fc78fd653164a21cf71f8",
"name": "Adquirência Físico Aluguel",
"items": [
{
"item_sequence_number": 1,
"product": {
"product_id": "693241e8c4e00969b33efaf1",
"name": "ADQUIRENCIA FÍSICO ALUGUEL",
"product_type": "composite",
"composite_type": "acquirer",
"transaction_channel_types": ["physical"],
"modalities": ["rent"]
},
"quantity": 1,
"settlement_period": "receive_now_2"
}
]
},
{
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201",
"name": "Oferta E-commerce - Link de Pagamento V2",
"items": [
{
"item_sequence_number": 1,
"product": {
"product_id": "69b2ece03abb838e8be1b21d",
"name": "Terminal Ecommerce",
"product_type": "terminal",
"terminal_type": "ecommerce",
"transaction_channel_type": "online",
"modality": "rent",
"delivery_method": "na",
"wireless": false,
"print_receipt": false,
"model": "ecommerce"
},
"quantity": 1,
"unit_price": 0,
"total_price": 0
},
{
"item_sequence_number": 2,
"product": {
"product_id": "52fadc5225294c7781c862c4e4a2d91a",
"name": "Conta SuperGet",
"product_type": "service",
"service_type": "service",
"product_configuration": { "keyword": "prepaid_card", "issuer": "superget" }
},
"quantity": 1
},
{
"item_sequence_number": 3,
"product": {
"product_id": "6781192295d5d10a6194fe15",
"name": "GetPay (link de pagamento)",
"product_type": "service",
"service_type": "ecommerce_service",
"product_configuration": { "keyword": "ecommerce_payment_link" }
},
"quantity": 1
}
]
}
]json
[
{
"priced_offering_id": "6a0fc78fd653164a21cf71f8",
"smart_offering_id": "6a0fc78fd653164a21cf71f8",
"name": "Adquirência Físico Aluguel",
"items": [
{
"item_sequence_number": 1,
"product": {
"product_id": "693241e8c4e00969b33efaf1",
"name": "ADQUIRENCIA FÍSICO ALUGUEL",
"product_type": "composite",
"composite_type": "acquirer",
"transaction_channel_types": ["physical"],
"modalities": ["rent"]
},
"quantity": 1,
"settlement_period": "receive_now_2"
}
]
},
{
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201",
"name": "Oferta E-commerce - Link de Pagamento V2",
"items": [
{
"item_sequence_number": 1,
"product": {
"product_id": "69b2ece03abb838e8be1b21d",
"name": "Terminal Ecommerce",
"product_type": "terminal",
"terminal_type": "ecommerce",
"transaction_channel_type": "online",
"modality": "rent",
"delivery_method": "na",
"wireless": false,
"print_receipt": false,
"model": "ecommerce"
},
"quantity": 1,
"unit_price": 0,
"total_price": 0
},
{
"item_sequence_number": 2,
"product": {
"product_id": "52fadc5225294c7781c862c4e4a2d91a",
"name": "Conta SuperGet",
"product_type": "service",
"service_type": "service",
"product_configuration": { "keyword": "prepaid_card", "issuer": "superget" }
},
"quantity": 1
},
{
"item_sequence_number": 3,
"product": {
"product_id": "6781192295d5d10a6194fe15",
"name": "GetPay (link de pagamento)",
"product_type": "service",
"service_type": "ecommerce_service",
"product_configuration": { "keyword": "ecommerce_payment_link" }
},
"quantity": 1
}
]
}
]Payload resultante para POST /orders — campo items
Todos los ítems se aplanan en un único array con numeración secuencial global:
json
{
"items": [
{
"item_sequence_number": 1,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf71f8",
"smart_offering_id": "6a0fc78fd653164a21cf71f8"
},
"product": {
"product_id": "693241e8c4e00969b33efaf1",
"name": "ADQUIRENCIA FÍSICO ALUGUEL",
"product_type": "composite",
"composite_type": "acquirer",
"transaction_channel_types": ["physical"],
"modalities": ["rent"]
},
"quantity": 1,
"settlement_period": "receive_now_2"
},
{
"item_sequence_number": 2,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "69b2ece03abb838e8be1b21d",
"name": "Terminal Ecommerce",
"product_type": "terminal",
"terminal_type": "ecommerce",
"transaction_channel_type": "online",
"modality": "rent",
"delivery_method": "na",
"wireless": false,
"print_receipt": false,
"model": "ecommerce"
},
"quantity": 1,
"unit_price": 0,
"total_price": 0
},
{
"item_sequence_number": 3,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "52fadc5225294c7781c862c4e4a2d91a",
"name": "Conta SuperGet",
"product_type": "service",
"service_type": "service",
"product_configuration": { "keyword": "prepaid_card", "issuer": "superget" }
},
"quantity": 1
},
{
"item_sequence_number": 4,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "6781192295d5d10a6194fe15",
"name": "GetPay (link de pagamento)",
"product_type": "service",
"service_type": "ecommerce_service",
"product_configuration": { "keyword": "ecommerce_payment_link" }
},
"quantity": 1
}
]
}json
{
"items": [
{
"item_sequence_number": 1,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf71f8",
"smart_offering_id": "6a0fc78fd653164a21cf71f8"
},
"product": {
"product_id": "693241e8c4e00969b33efaf1",
"name": "ADQUIRENCIA FÍSICO ALUGUEL",
"product_type": "composite",
"composite_type": "acquirer",
"transaction_channel_types": ["physical"],
"modalities": ["rent"]
},
"quantity": 1,
"settlement_period": "receive_now_2"
},
{
"item_sequence_number": 2,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "69b2ece03abb838e8be1b21d",
"name": "Terminal Ecommerce",
"product_type": "terminal",
"terminal_type": "ecommerce",
"transaction_channel_type": "online",
"modality": "rent",
"delivery_method": "na",
"wireless": false,
"print_receipt": false,
"model": "ecommerce"
},
"quantity": 1,
"unit_price": 0,
"total_price": 0
},
{
"item_sequence_number": 3,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "52fadc5225294c7781c862c4e4a2d91a",
"name": "Conta SuperGet",
"product_type": "service",
"service_type": "service",
"product_configuration": { "keyword": "prepaid_card", "issuer": "superget" }
},
"quantity": 1
},
{
"item_sequence_number": 4,
"offering": {
"priced_offering_id": "6a0fc78fd653164a21cf7201",
"smart_offering_id": "6a0fc78fd653164a21cf7201"
},
"product": {
"product_id": "6781192295d5d10a6194fe15",
"name": "GetPay (link de pagamento)",
"product_type": "service",
"service_type": "ecommerce_service",
"product_configuration": { "keyword": "ecommerce_payment_link" }
},
"quantity": 1
}
]
}Nota: Los ítems de la segunda oferta asumen numeración secuencial continuando a partir del último ítem de la primera oferta (2, 3, 4…). Elitem_sequence_numberoriginal de cada ítem dentro de la oferta (offering.items[x].item_sequence_number) se descarta — lo que vale es la secuencia global del pedido.
Reglas importantes
1. Secuencial global de ítems
El
item_sequence_number es un contador único e incremental para todo el array items del pedido, independientemente de cuántas ofertas se hayan seleccionado.2. priced_offering_id y smart_offering_id provienen de la raíz de la oferta
Estos dos campos deben cumplimentarse con el valor de
priced_offering_id que está en la raíz del objeto de la oferta devuelta por GET /offerings — y no dentro de items[x]. Ambos (priced_offering_id y smart_offering_id) reciben el mismo valor.3. El objeto product se envía íntegramente
El objeto
product debe copiarse exactamente como se devuelve en offering.items[x].product, incluyendo todos los campos específicos del tipo de producto (terminal_type, modality, delivery_method, product_configuration, etc.). No omitir campos.4. Campos condicionales por tipo de producto
Algunos campos existen en el ítem de la oferta solo para determinados tipos de producto:
settlement_period: presente en productos de tipocomposite(adquirencia). Debe reenviarse en el ítem del pedido.unit_price/total_price: presentes cuando el producto tiene un precio definido (p. ej.: terminal con alquiler mensual). Deben reenviarse en el ítem del pedido. Cuando no hay precio, enviarnull.
5. Una oferta puede tener múltiples ítems
Una única oferta seleccionada puede devolver múltiples productos en su array
items[]. Cada producto se convierte en un ítem separado en el pedido, todos compartiendo el mismo offering.priced_offering_id y offering.smart_offering_id.Cumplimentación del campo merchant_accounts
El campo
merchant_accounts es una lista de domicilios bancarios — es decir, las cuentas bancarias donde el merchant recibirá los recibibles de las transacciones realizadas en las máquinas y servicios de Getnet.Debe crearse un ítem por marca contratada en las ofertas seleccionadas.
Estructura de cada ítem
| Campo | Descripción |
|---|---|
brand | Marca a la que se aplica el domicilio (visa, master, elo, amex, hipercard, pix) |
merchant.merchant_id | El mismo merchant_id del campo raíz merchant del pedido |
bank_account.bank.bank_country | País del banco (p. ej.: "BR") |
bank_account.bank_code | Código de compensación del banco (FEBRABAN) |
bank_account.bank_branch_code | Número de la sucursal |
bank_account.bank_account_number | Número de cuenta + dígito verificador |
bank_account.bank_account_currency | Moneda de la cuenta (p. ej.: "BRL") |
bank_account.account_type | Tipo de la cuenta: cc (corriente), pp (ahorro) |
payment_center | true para activar centralización de pagos |
merchant_account_restriction | Lista de restricciones. Enviar [] cuando no haya restricciones |
Ejemplo
En el ejemplo siguiente, el merchant configura el mismo domicilio bancario para cuatro marcas:
json
{
"merchant_accounts": [
{
"brand": "master",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "visa",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "elo",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "amex",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
}
]
}json
{
"merchant_accounts": [
{
"brand": "master",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "visa",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "elo",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
},
{
"brand": "amex",
"merchant": { "merchant_id": "6a0fc6f29a4f90ca92a8670e" },
"bank_account": {
"bank": { "bank_country": "BR", "bank_code": "033" },
"bank_branch_code": "0001",
"bank_account_number": "123456789",
"bank_account_currency": "BRL",
"account_type": "cc"
},
"payment_center": true,
"merchant_account_restriction": []
}
]
}Tipos de cuenta (account_type)
| Valor | Descripción |
|---|---|
cc | Cuenta Corriente |
pp | Cuenta de Ahorro |
Actualización del Pedido — PUT /orders/{order_id}
Visión general
El endpoint
PUT /orders/{order_id} permite actualizar los datos de un pedido existente, por ejemplo para añadir o corregir información antes del envío.⚠️ Sustitución total del pedido
El
PUT sustituye íntegramente el pedido. Nunca envíe un payload parcial — los campos omitidos serán eliminados. Envíe siempre el objeto completo del pedido.Diferencia respecto al merchant
A diferencia de
PUT /merchants/{merchant_id}, el pedido no sufre enriquecimiento después de la creación: la plataforma no añade ninguna información nueva al objeto. Los datos almacenados en el pedido son exactamente los que el canal envió en POST /orders.Por esta razón, el comportamiento recomendado depende de cómo el canal gestiona el estado del pedido:
| Situación | Qué hacer |
|---|---|
| Canal almacena la estructura del pedido en su dominio | No es necesario llamar a GET /orders/{order_id}. Basta con modificar o incrementar los campos en la estructura local y enviar el PUT con el objeto completo. |
| Canal no almacena la estructura del pedido localmente | Buscar el pedido actual con GET /orders/{order_id} (usando el order_id devuelto por POST /orders), aplicar los cambios y luego enviar el PUT. |
Parámetro de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
order_id | string | ID devuelto en la creación del pedido (POST /orders) |
Recalcular campos de totalización
Tras cualquier cambio en los ítems del pedido, los campos de totalización deben recalcularse antes de enviar el
PUT. La regla es la misma que la de la creación — consulte la sección Cumplimentación de los campos de totalización a continuación.Cumplimentación de los campos de totalización
Los campos de totalización del pedido representan la suma de los valores de los productos de tipo
terminal presentes en el array items, agrupados por el tipo de precificación (pricing_model.pricing_type) de cada producto.Regla general
Para cada ítem del pedido donde
product.product_type = "terminal", sume el valor de total_price del ítem conforme el product.pricing_model.pricing_type, y cumplimente el campo correspondiente en la raíz del pedido:| Campo en el pedido | pricing_model.pricing_type de los terminales sumados |
|---|---|
total_fixed_price | fixed_price |
total_monthly_rent | monthly_rent |
total_affiliation_fee | affiliation_fee |
total_recurrent | recurrent |
total_payment_price | payment_price |
total_license | license |
Los ítems cuyoproduct.product_typeno seaterminal(p. ej.:composite,service) no entran en los cálculos de totalización.
Ejemplo
Supongamos que el pedido tiene los siguientes ítems de tipo
terminal:| Ítem | product_type | pricing_model.pricing_type | total_price |
|---|---|---|---|
| 1 | terminal | monthly_rent | 7990 |
| 2 | terminal | monthly_rent | 4990 |
| 3 | terminal | fixed_price | 19900 |
| 4 | composite | — | — |
La cumplimentación de los campos de totalización sería:
json
{
"total_fixed_price": 19900,
"total_monthly_rent": 12980,
"total_affiliation_fee": 0,
"total_recurrent": 0,
"total_payment_price": 0,
"total_license": 0
}json
{
"total_fixed_price": 19900,
"total_monthly_rent": 12980,
"total_affiliation_fee": 0,
"total_recurrent": 0,
"total_payment_price": 0,
"total_license": 0
}Nota: Los campos sin terminales correspondientes deben enviarse con valor0.
Validación del Pedido — POST /orders/{order_id}/validation
Visión general
Tras crear el pedido con
POST /orders, el canal recibirá el order_id. Antes de enviar el pedido definitivamente, es altamente recomendable llamar a POST /orders/{order_id}/validation.Este endpoint realiza una validación completa de los datos del pedido — aplicando las mismas reglas de negocio del envío — sin cambiar el estado del pedido. Si hay inconsistencias, el canal puede corregirlas antes del envío definitivo.
⚠️ Importante: El endpoint es opcional, pero se recomienda encarecidamente. Tras la llamada aPUT /orders/{order_id}/submit, si el pedido es rechazado, no es posible corregirlo — será rechazado definitivamente.
Parámetro de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
order_id | string | ID devuelto en la creación del pedido (POST /orders) |
Cómo interpretar la respuesta
La respuesta contiene un campo
report con la información de la validación. Para verificar si la validación aprobó o rechazó el pedido:-
Verifique el campo
report.recommended.status:"approved"→ El pedido es correcto y puede enviarse."reproved"→ El pedido contiene errores que deben corregirse antes del envío.
-
Si
report.recommended.status = "reproved", verifique la listareport.details[]. Cada ítem de la lista posee el campodetail_descriptioncon la descripción del motivo del rechazo.
Ejemplo de respuesta con rechazo
json
{
"report": {
"details": [
{
"visible": true,
"detail_type": "missing_mandatory_data",
"detail_attribute": "qualification.order.items",
"detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.",
"detail_code": "QDOBR-0129"
}
],
"recommended": {
"status": "reproved",
"last_status_update_date": "2026-05-22T12:44:41.365199901Z"
}
}
}json
{
"report": {
"details": [
{
"visible": true,
"detail_type": "missing_mandatory_data",
"detail_attribute": "qualification.order.items",
"detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.",
"detail_code": "QDOBR-0129"
}
],
"recommended": {
"status": "reproved",
"last_status_update_date": "2026-05-22T12:44:41.365199901Z"
}
}
}Campos relevantes de la respuesta
| Campo | Descripción |
|---|---|
report.recommended.status | Resultado de la validación: "approved" o "reproved" |
report.details[] | Lista de detalles de los errores encontrados (presente cuando reproved) |
report.details[].detail_description | Descripción legible del motivo del rechazo |
report.details[].detail_type | Tipo del error (p. ej.: missing_mandatory_data) |
report.details[].detail_attribute | Atributo del pedido que causó el error |
report.details[].detail_code | Código interno del error |
Envío del Pedido — PUT /orders/{order_id}/submit
Visión general
El endpoint
PUT /orders/{order_id}/submit representa la confirmación definitiva del pedido por parte del cliente. Al llamarlo, el canal declara que el cliente revisó toda la información del pedido y confirma su conformidad.⚠️ Atención: Tras el envío, si el pedido es rechazado, no es posible corregirlo. Por este motivo, se recomienda encarecidamente utilizarPOST /orders/{order_id}/validationantes del envío.
Parámetro de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
order_id | string | ID devuelto en la creación del pedido (POST /orders) |
Respuesta en caso de rechazo
Si el pedido es rechazado durante el envío, la respuesta contendrá un objeto
error con información del rechazo:- Verifique si existe
error.report.recommendedcon valor"reproved". - El campo
messageaporta un mensaje genérico sobre el rechazo. - Para entender el motivo detallado, verifique
report.details[]y lea el campodetail_descriptionde cada ítem.
Ejemplo de respuesta en caso de rechazo:
json
{
"error": {
"message": "Pedido reprovado.",
"report": {
"recommended": "reproved",
"details": [
{
"visible": true,
"detail_type": "missing_mandatory_data",
"detail_attribute": "qualification.order.items",
"detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.",
"detail_code": "QDOBR-0129"
}
]
}
}
}json
{
"error": {
"message": "Pedido reprovado.",
"report": {
"recommended": "reproved",
"details": [
{
"visible": true,
"detail_type": "missing_mandatory_data",
"detail_attribute": "qualification.order.items",
"detail_description": "Não foi encontrado composite correspondente ao terminal 6932501bc4e00969b33efaf8. Para cada terminal do pedido deve haver um composite com tipo de canal de transação (transaction_channel_type) correspondente.",
"detail_code": "QDOBR-0129"
}
]
}
}
}Respuesta en caso de éxito
Cuando el envío es exitoso, la respuesta contiene:
situation.status = "submitted"→ indica que el pedido fue recibido por Getnet y está en procesamiento.order_number→ número del pedido generado por Getnet, que puede ser usado por el cliente para hacer seguimiento de su pedido.
Ejemplo de respuesta en caso de éxito:
json
{
"order_id": "6a1056da1d16baecee8580ee",
"order_number": "MPGXZEGPEE",
"audit_information": {
"creation_date": "2026-05-22T13:15:06.361Z",
"update_date": "2026-05-22T13:16:22.633Z",
"channel_data": {
"channel": "getnet_ecommerce",
"login": "",
"branch": "",
"enrollment_number": "",
"name": "",
"publisher": "ecommerce"
}
},
"situation": {
"status": "submitted",
"status_name": "Submetido",
"status_update_date": "2026-05-22T13:16:22.633Z"
}
}json
{
"order_id": "6a1056da1d16baecee8580ee",
"order_number": "MPGXZEGPEE",
"audit_information": {
"creation_date": "2026-05-22T13:15:06.361Z",
"update_date": "2026-05-22T13:16:22.633Z",
"channel_data": {
"channel": "getnet_ecommerce",
"login": "",
"branch": "",
"enrollment_number": "",
"name": "",
"publisher": "ecommerce"
}
},
"situation": {
"status": "submitted",
"status_name": "Submetido",
"status_update_date": "2026-05-22T13:16:22.633Z"
}
}Campos relevantes de la respuesta de éxito
| Campo | Descripción |
|---|---|
order_id | Identificador interno del pedido |
order_number | Número del pedido generado por Getnet para seguimiento por parte del cliente |
situation.status | "submitted" — pedido recibido y en análisis por Getnet |
situation.status_name | Nombre legible del estado (p. ej.: "Submetido") |
situation.status_update_date | Fecha y hora de la última actualización del estado |
Flujo resumido
text
1. Canal llama a 600;">GET /merchants/{merchant_id}
│
├─ merchant_id → merchant.merchant_id en el pedido
└─ merchant_id → merchant_accounts[*].merchant.merchant_id
│
▼
2. Canal llama a 600;">GET /offerings
│
▼
3. Canal llama a 600;">GET /offerings/delivery-data (legal_document_number + postal_code)
│
├─ Cliente selecciona tipo de envío (scheduled / normal / express)
├─ delivery_methods[x].delivery_amount → delivery_info.delivery_amount
├─ delivery_methods[x].delivery_time → delivery_info.delivery_time
├─ delivery_methods[x].delivery_time_type → delivery_info.delivery_time_type (normal/express)
├─ delivery_methods[x].period_grid[y] → delivery_info.period_grid (scheduled)
└─ período seleccionado → delivery_info.recommended_delivery_period (scheduled)
│
▼
4. Canal muestra ofertas al cliente
│
▼
5. Cliente selecciona una o más ofertas
│
▼
6. Para cada oferta seleccionada:
└─ Para cada ítem en offering.items[]:
├─ item_sequence_number = siguiente número secuencial global
├─ offering.priced_offering_id = offering.priced_offering_id (raíz de la oferta)
├─ offering.smart_offering_id = offering.priced_offering_id (raíz de la oferta)
├─ product = item.product (copia íntegra)
├─ quantity = item.quantity
├─ settlement_period = item.settlement_period (si está presente)
├─ unit_price = item.unit_price (si está presente)
└─ total_price = item.total_price (si está presente)
│
▼
7. Cliente informa datos bancarios → montar merchant_accounts[]:
└─ Un ítem por marca contratada:
├─ brand = marca (visa / master / elo / amex / ...)
├─ merchant.merchant_id = merchant_id (paso 1)
├─ bank_account.bank.bank_code = código FEBRABAN del banco
├─ bank_account.bank_branch_code = sucursal
├─ bank_account.bank_account_number = cuenta + dígito
├─ bank_account.account_type = cc / pp
├─ payment_center = true/false
└─ merchant_account_restriction = []
│
▼
8. Canal calcula los campos de totalización:
└─ Para cada ítem donde product.product_type = "terminal":
├─ pricing_type = "monthly_rent" → sumar total_price en total_monthly_rent
├─ pricing_type = "fixed_price" → sumar total_price en total_fixed_price
├─ pricing_type = "affiliation_fee" → sumar total_price en total_affiliation_fee
├─ pricing_type = "recurrent" → sumar total_price en total_recurrent
├─ pricing_type = "payment_price" → sumar total_price en total_payment_price
└─ pricing_type = "license" → sumar total_price en total_license
│
▼
9. Canal llama a 600;">POST /orders con merchant, delivery_info, items, merchant_accounts y campos de totalización
│
└─ Recibe el order_id del pedido creado
⚠️ Guardar el order_id — obligatorio en los pasos siguientes
│
▼
9a. (Si es necesario) Canal actualiza el pedido vía 600;">PUT /orders/{order_id}
│
├─ Si el canal almacena el pedido localmente → modificar estructura local y enviar 600;">PUT completo
└─ Si no lo almacena → 600;">GET /orders/{order_id} → aplicar cambios → enviar 600;">PUT completo
(Recalcular campos de totalización si los ítems fueron modificados)
│
▼
10. (Recomendado) Canal llama a 600;">POST /orders/{order_id}/validation
│
├─ report.recommended.status = "approved" → puede proceder al envío
└─ report.recommended.status = "reproved" → verificar report.details[].detail_description
y corregir el pedido antes de enviar
│
▼
11. Canal llama a 600;">PUT /orders/{order_id}/submit (cliente confirmó los datos del pedido)
│
├─ Rechazado → error.report.recommended = "reproved"
│ verificar report.details[].detail_description
│ (el pedido ya no puede corregirse)
│
└─ Aprobado → situation.status = "submitted"
order_number generado para seguimiento del pedido por parte del cliente
text
1. Canal llama a 600;">GET /merchants/{merchant_id}
│
├─ merchant_id → merchant.merchant_id en el pedido
└─ merchant_id → merchant_accounts[*].merchant.merchant_id
│
▼
2. Canal llama a 600;">GET /offerings
│
▼
3. Canal llama a 600;">GET /offerings/delivery-data (legal_document_number + postal_code)
│
├─ Cliente selecciona tipo de envío (scheduled / normal / express)
├─ delivery_methods[x].delivery_amount → delivery_info.delivery_amount
├─ delivery_methods[x].delivery_time → delivery_info.delivery_time
├─ delivery_methods[x].delivery_time_type → delivery_info.delivery_time_type (normal/express)
├─ delivery_methods[x].period_grid[y] → delivery_info.period_grid (scheduled)
└─ período seleccionado → delivery_info.recommended_delivery_period (scheduled)
│
▼
4. Canal muestra ofertas al cliente
│
▼
5. Cliente selecciona una o más ofertas
│
▼
6. Para cada oferta seleccionada:
└─ Para cada ítem en offering.items[]:
├─ item_sequence_number = siguiente número secuencial global
├─ offering.priced_offering_id = offering.priced_offering_id (raíz de la oferta)
├─ offering.smart_offering_id = offering.priced_offering_id (raíz de la oferta)
├─ product = item.product (copia íntegra)
├─ quantity = item.quantity
├─ settlement_period = item.settlement_period (si está presente)
├─ unit_price = item.unit_price (si está presente)
└─ total_price = item.total_price (si está presente)
│
▼
7. Cliente informa datos bancarios → montar merchant_accounts[]:
└─ Un ítem por marca contratada:
├─ brand = marca (visa / master / elo / amex / ...)
├─ merchant.merchant_id = merchant_id (paso 1)
├─ bank_account.bank.bank_code = código FEBRABAN del banco
├─ bank_account.bank_branch_code = sucursal
├─ bank_account.bank_account_number = cuenta + dígito
├─ bank_account.account_type = cc / pp
├─ payment_center = true/false
└─ merchant_account_restriction = []
│
▼
8. Canal calcula los campos de totalización:
└─ Para cada ítem donde product.product_type = "terminal":
├─ pricing_type = "monthly_rent" → sumar total_price en total_monthly_rent
├─ pricing_type = "fixed_price" → sumar total_price en total_fixed_price
├─ pricing_type = "affiliation_fee" → sumar total_price en total_affiliation_fee
├─ pricing_type = "recurrent" → sumar total_price en total_recurrent
├─ pricing_type = "payment_price" → sumar total_price en total_payment_price
└─ pricing_type = "license" → sumar total_price en total_license
│
▼
9. Canal llama a 600;">POST /orders con merchant, delivery_info, items, merchant_accounts y campos de totalización
│
└─ Recibe el order_id del pedido creado
⚠️ Guardar el order_id — obligatorio en los pasos siguientes
│
▼
9a. (Si es necesario) Canal actualiza el pedido vía 600;">PUT /orders/{order_id}
│
├─ Si el canal almacena el pedido localmente → modificar estructura local y enviar 600;">PUT completo
└─ Si no lo almacena → 600;">GET /orders/{order_id} → aplicar cambios → enviar 600;">PUT completo
(Recalcular campos de totalización si los ítems fueron modificados)
│
▼
10. (Recomendado) Canal llama a 600;">POST /orders/{order_id}/validation
│
├─ report.recommended.status = "approved" → puede proceder al envío
└─ report.recommended.status = "reproved" → verificar report.details[].detail_description
y corregir el pedido antes de enviar
│
▼
11. Canal llama a 600;">PUT /orders/{order_id}/submit (cliente confirmó los datos del pedido)
│
├─ Rechazado → error.report.recommended = "reproved"
│ verificar report.details[].detail_description
│ (el pedido ya no puede corregirse)
│
└─ Aprobado → situation.status = "submitted"
order_number generado para seguimiento del pedido por parte del cliente
En esta página
Orders