API TP Software — Visão Geral

A API TP Software permite a integração entre o seu sistema (loja online, ERP, CRM, marketplace) e a plataforma TP Software. É gratuita e ilimitada em todos os planos de subscrição — não há taxas por chamada, por encomenda processada ou por volume de dados.

Características

Base URL

https://hub.tp.software/api/v1

Todos os caminhos desta documentação são relativos à Base URL. Por exemplo, GET /ecommerce/product-inventory é GET https://hub.tp.software/api/v1/ecommerce/product-inventory.

Precisa de ajuda? Para integrações à medida ou suporte técnico, abra um pedido de suporte. A nossa equipa responde em 24h úteis.

Primeira chamada

1. Estado da API (sem token)

curl https://hub.tp.software/api/v1/health
{
  "success": true,
  "status": "healthy",
  "checks": {
    "db_tpsoft": "connected",
    "db_sync": "connected",
    "api_services": "connected"
  },
  "timestamp": "2026-10-08 21:30:00",
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

2. Inventário da empresa (com token)

curl -H "Authorization: Bearer SEU_TOKEN" \
  "https://hub.tp.software/api/v1/ecommerce/product-inventory?limit=10&page=1&language=pt"

3. Criar uma encomenda

curl -X POST https://hub.tp.software/api/v1/ecommerce/sales-order \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"products":[{"product_id":309,"price_without_vat":81.30,"tax_vat":18.70}],"num_products":1,"total_value_products":81.30,"tax_vat_products":18.70}'

Autenticação

Todos os endpoints e-commerce exigem um token, exceto /health e /ecommerce/companies, que são públicos.

Cabeçalho Authorization (recomendado)

Authorization: Bearer SEU_TOKEN
Content-Type: application/json

Alternativas (compatibilidade com a API anterior)

Se vierem vários, conta o do cabeçalho.

Como obter o token

  1. A empresa TP Software entra em my.tp.software → menu Tokens API e cria um token para a integração (ex.: «Loja online»).
  2. Escolhe as permissões do token: Vendas (inventário e encomendas), Reservas e Reembolsos, e a regra de preço a aplicar neste canal.
  3. Se marcar «Exigir ativação por developer», o painel mostra um código XXXX-XXXX-XXXX: o developer cria conta em hub.tp.software/devs e introduz o código em Tokens. Até lá, esta API (hub.tp.software/api/v1) responde 403 AUTH_TOKEN_NOT_CLAIMED a esse token.
  4. A empresa entrega o token ao developer, que o usa no cabeçalho Authorization.
Atenção: Trate o token como uma password. Não o partilhe nem o publique em código que corre no browser. Se suspeitar de comprometimento, revogue-o no painel e gere um novo.

Formato de Resposta

Listas (paginadas)

{
  "success": true,
  "message": "success",
  "data": [
    "…"
  ],
  "total": 541,
  "pagination": {
    "current_page": 1,
    "per_page": 50,
    "total": 541,
    "total_pages": 11,
    "has_more": true
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Operações (criar encomenda, reserva, reembolso)

{
  "success": true,
  "message": "Order has been generated successfully!",
  "invoice_number": 12,
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Erro

{
  "success": false,
  "error": "Token inválido ou revogado",
  "code": "AUTH_INVALID_TOKEN"
}

O código HTTP acompanha sempre o erro (ver tabela abaixo). A mensagem em error é para pessoas; para decidir no código use code.

Códigos de Erro

CódigoHTTPDescrição
VALIDATION_ERROR400Parâmetros ou corpo inválidos ou em falta (a mensagem indica o campo): IDs inteiros de 1 a 2147483647, datas AAAA-MM-DD ou AAAA-MM-DD HH:MM (ISO 8601 também), campos 0/1, valores até 99999999.99, textos acima do tamanho máximo. Corrija o pedido — repetir igual não resolve
AUTH_NO_TOKEN401Token em falta
AUTH_INVALID_TOKEN401Token inexistente ou revogado
AUTH_TOKEN_NOT_CLAIMED403O token exige ativação por um developer e ainda não foi reivindicado
PERMISSION_DENIED403O token não tem a permissão necessária (Vendas, Reservas ou Reembolsos) ou pede dados de outra empresa
AUTH_ERROR401 / 403Pedido recusado pela plataforma (ex.: a permissão do token mudou entretanto)
NOT_FOUND404Endpoint ou registo inexistente (a mensagem inclui o caminho pedido)
ORDER_REJECTED422Encomenda ou reserva recusada: peça indisponível, sem stock, de outra empresa ou dados em falta (a mensagem diz o motivo)
UPSTREAM_UNAVAILABLE / UPSTREAM_ERROR502 / 5xxFalha temporária da plataforma — tente novamente
AUTH_UNAVAILABLE503Não foi possível validar o token neste momento — tente novamente
UPSTREAM_TIMEOUT504A operação demorou demasiado. Numa criação (encomenda/reserva), confirme na listagem se ficou registada antes de repetir
🛒

Módulo E-commerce

Endpoints para integração com lojas online, marketplaces e parceiros tecnológicos. Permite consultar inventário, criar encomendas, gerir reservas e pedir reembolsos.

Visão Geral

O módulo E-commerce expõe os dados que a sua loja online precisa: peças disponíveis, encomendas, reservas e reembolsos. Todos os endpoints respeitam o isolamento de dados — o token está associado a uma empresa e só vê os dados dessa empresa. As listas de encomendas e reservas mostram as que foram criadas com o próprio token.

Casos de uso típicos

Está a usar WooCommerce? Disponibilizamos um plugin oficial TP Software para WooCommerce que faz toda a sincronização automaticamente — não precisa de programar a integração. Consulte os planos do plugin ou contacte-nos para mais informação.

Listar Empresas Disponíveis para Parcerias

GET /api/v1/ecommerce/companies Público — sem token

Endpoint público. Devolve as empresas TP Software com o módulo API e-commerce ativo, abertas a parcerias e integrações comerciais. Use-o para descobrir potenciais fornecedores antes de receber um token.

Query Parameters

ParâmetroTipoDescrição
limitintResultados por página (default 100, máx 100)
pageintPágina (default 1)

Exemplo

curl https://hub.tp.software/api/v1/ecommerce/companies
{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 1,
      "name": "Auto Peças, Lda",
      "address": "Rua das Peças, 123",
      "zipcode": "4700-000",
      "company_registration_number": "500000000",
      "reg_number_dismantler": "DM/2026/001",
      "phone_number": "+351 253 000 000",
      "country": "Portugal",
      "email": "contacto@autopecas.pt"
    }
  ],
  "total": 10,
  "pagination": {
    "current_page": 1,
    "per_page": 100,
    "total": 10,
    "total_pages": 1,
    "has_more": false
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Inventário de Produtos

GET /api/v1/ecommerce/product-inventory Token · permissão Vendas

Peças disponíveis da empresa do token (em stock, com quantidade livre e não em rascunho), com paginação, pesquisa e ordenação. Cada peça inclui imagens, vídeos, unidades por localização, viaturas compatíveis, referências, danos, atributos e categorias.

Query Parameters

ParâmetroTipoDescrição
limitintResultados por página (default 50, máx 100)
pageintPágina (default 1)
searchstringTexto no nome da peça, no idioma de language (máx 100 caracteres)
order_fieldstringid (default), created_at ou updated_at
order_typestringdesc (default) ou asc
languagestringpt (default), en, es, fr, de, it

Exemplo

curl -H "Authorization: Bearer SEU_TOKEN" \
  "https://hub.tp.software/api/v1/ecommerce/product-inventory?limit=50&page=1&order_field=updated_at&order_type=desc&language=pt"

Resposta (uma peça)

{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 309,
      "part_catelog": "1520",
      "company_id": "179",
      "vehicle_id": "96",
      "part_code": "ACB-4821-X",
      "quantity": 2,
      "reserved_quantity": 0,
      "part_description": "Farol esquerdo completo",
      "is_custom_size": 0,
      "parts_weight": 4.5,
      "parts_length": 60,
      "parts_width": 25,
      "parts_height": 20,
      "vat_included": 1,
      "cc": "1998",
      "cv": "150",
      "kw": "110",
      "parts_internal_id": "FH-789654",
      "reg_number_dismantler": "DM/2026/001",
      "state_id": "1",
      "condition_id": "1",
      "product_name": "Farol Esquerdo",
      "vehicle_model_name": "Focus",
      "vehicle_make_name": "Ford",
      "vehicle_variant_name": "2.0 EcoBoost ST",
      "brand_name": "Valeo",
      "motor_code": "R9DA",
      "inventory_status": "In Stock",
      "created_at": "2026-09-20T10:15:00.000Z",
      "updated_at": "2026-10-07T16:02:11.000Z",
      "vehicle_year": "2018",
      "bar_code_parts": "1234567890123",
      "is_master_part": null,
      "master_part_id": null,
      "master_part_inventory_id": null,
      "part_rating": 5,
      "green_part_rating": 4,
      "on_order": false,
      "deposit_value": null,
      "vehicle_type_name": "Ligeiro",
      "fuel_type_name": "Gasolina",
      "state_name": "Used",
      "condition_name": "OEM",
      "sync_id": 60,
      "part_price": "95.00",
      "image_list": [
        {
          "image_url": "https://images.tp.software/uploads/vehicle/parts/1742277347163-12.jpg",
          "part_name": "Farol",
          "image_uuid": "adae8407-cb7f-4614-b270-2d5b2b6683fc",
          "part_id": 309,
          "uuid": "a83884fc-86f8-4fab-a041-3be250b14eab",
          "part_code": "ACB-4821-X",
          "quantity": 2,
          "inventory_status": 1,
          "part_description": "Farol esquerdo completo",
          "id": 202,
          "damage_list": []
        }
      ],
      "video_list": [],
      "part_qty_list": [
        {
          "parts_id": "309",
          "uuid": "c970a0c2-8fbf-4a68-9d2a-3a35fdeafe85",
          "id": 264,
          "qty": 1,
          "location_ids": "12.40",
          "part_rating": 5,
          "location_name": "Armazém 1.Estante A1"
        }
      ],
      "parts_associate": [
        {
          "id": 31,
          "make_name": "Ford",
          "model_name": "Focus",
          "vehicle_year": "2018",
          "variant_name": "2.0 EcoBoost ST",
          "vehicle_type_name": "Ligeiro"
        }
      ],
      "parts_reference": [
        {
          "id": 17,
          "parts_id": "309",
          "is_main": 1,
          "condition_id": "1",
          "type_id": "2",
          "reference_code": "90012345",
          "brand": "Valeo",
          "manufacter": null,
          "type_name": "Written on the label",
          "condition_name": "OEM"
        }
      ],
      "parts_damage": [],
      "part_attribute": [],
      "parts_checklist": [],
      "category_hierarchies": []
    }
  ],
  "total": 541,
  "pagination": {
    "current_page": 1,
    "per_page": 50,
    "total": 541,
    "total_pages": 11,
    "has_more": true
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Campos principais

CampoDescrição
idID da peça — é o product_id das encomendas, reservas e da verificação de disponibilidade
part_pricePreço da peça neste canal, já com a regra de preço do token (texto com 2 casas decimais)
quantity / reserved_quantityUnidades em stock e unidades já reservadas
product_name, vehicle_*_name, brand_nameNomes no idioma de language
part_qty_list[]Unidades concretas e localização no armazém (o id é o part_qty_id das encomendas)
image_list[] / video_list[]Fotos e vídeos da peça (id pode ser enviado em products[].images de uma encomenda)
parts_associate[] / parts_reference[]Viaturas compatíveis e referências (OEM, etiqueta…)
on_order / deposit_valuePeça «sob encomenda» (entrega não imediata) e valor de caução, quando existe

Verificar Disponibilidade

GET /api/v1/ecommerce/product-inventory/check Token

Verifica se uma quantidade de uma peça está livre (stock menos reservas). Útil antes de criar uma encomenda.

Query Parameters

ParâmetroTipoDescrição
product_idintID da peça (obrigatório)
qtyintQuantidade desejada (default 1)
company_idintOpcional — se vier, tem de ser a empresa do token (senão 403)

Exemplo

curl -H "Authorization: Bearer SEU_TOKEN" \
  "https://hub.tp.software/api/v1/ecommerce/product-inventory/check?product_id=309&qty=1"
{
  "success": true,
  "data": {
    "available": true,
    "company_id": 179,
    "product_id": 309,
    "qty": 1,
    "message": "Quantidade disponível"
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Sem quantidade livre a resposta é igualmente 200, com "available": false.

Criar Encomenda

POST /api/v1/ecommerce/sales-order Token · permissão Vendas

Cria uma encomenda na empresa do token e reserva as peças. A encomenda só entra se todas as peças forem da empresa e tiverem unidade livre — caso contrário nada é gravado (422 ORDER_REJECTED).

Body (JSON)

{
  "num_products": 2,
  "total_value_products": 225,
  "total_value_shipping": 15,
  "total_value_packaging": 4.5,
  "total_value_other_parcel": 0,
  "tax_vat_products": 51.75,
  "tax_vat_shipping": 3.45000000000000017763568394002504646778106689453125,
  "tax_vat_packaging": 1.04000000000000003552713678800500929355621337890625,
  "tax_vat_other_parcel": 0,
  "exemption_vat_products": 0,
  "exemption_vat_shipping": 0,
  "exemption_vat_packaging": 0,
  "exemption_vat_other_parcel": 0,
  "maximum_sale_alert_date": "2026-10-15",
  "notes_sale": "Frágil. Entregar entre as 9h e as 12h.",
  "seller_takes_care_shipping": 1,
  "provider_takes_care_shipping": 0,
  "seller_invoice_provider": 0,
  "seller_invoice_client": 1,
  "shipping_label": "https://example.com/etiquetas/12345.pdf",
  "client": [
    {
      "name": "Miguel Santos",
      "country_code": "PT",
      "shipping_address": "Rua do Sol, 789",
      "postal_code": "4700-123",
      "city": "Braga",
      "invoice_address": "Rua do Sol, 789",
      "vat_number": "123456789",
      "country_code_vat_number": "PT",
      "phone": "+351910000000",
      "email": "miguel.santos@example.com",
      "whatsapp": "+351910000000"
    }
  ],
  "products": [
    {
      "product_id": 309,
      "part_qty_id": 264,
      "price_without_vat": 95,
      "tax_vat": 21.85000000000000142108547152020037174224853515625,
      "exemption_vat": 0,
      "images": [
        202
      ]
    },
    {
      "product_id": 395,
      "price_without_vat": 130,
      "tax_vat": 29.89999999999999857891452847979962825775146484375,
      "exemption_vat": 0
    }
  ]
}

Descrição dos Campos

CampoDescrição
products[]Obrigatório. Uma linha por unidade: product_id (ID inteiro da peça, de /product-inventory); opcionais part_qty_id (ID inteiro da unidade concreta, de part_qty_list[].id), price_without_vat, tax_vat, exemption_vat (0/1) e images (IDs ou URLs de image_list). Para 2 unidades da mesma peça, repita a linha.
num_productsNúmero de linhas de produto (inteiro)
total_value_*Totais sem IVA: produtos, envio, embalagem, outras parcelas (números, até 99999999.99)
tax_vat_*Valor de IVA de cada total (números)
exemption_vat_*0/1 — total isento de IVA (true/false também são aceites)
maximum_sale_alert_dateData limite para tratar a venda (AAAA-MM-DD; uma data que não existe, como 2026-02-30, dá 400)
notes_saleNotas livres
seller_takes_care_shipping / provider_takes_care_shipping0/1 — quem trata do envio
seller_invoice_client / seller_invoice_provider0/1 — com 1, client[] / provider[] passam a ser obrigatórios, cada um com name, country_code, shipping_address, postal_code, city, invoice_address e email
client[] / provider[]Lista com os dados do comprador / do fornecedor (aceita-se também um objeto único). Campos opcionais: vat_number, country_code_vat_number, phone, whatsapp
shipping_labelURL da etiqueta de envio

Resposta

{
  "success": true,
  "message": "Order has been generated successfully!",
  "invoice_number": 12,
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

invoice_number é o número da encomenda na empresa. Para obter o id (necessário num reembolso) use GET /ecommerce/sales?search=12.

Erros mais comuns: 400 VALIDATION_ERROR (campo em falta ou inválido), 403 PERMISSION_DENIED (o token não tem a permissão Vendas), 422 ORDER_REJECTED (peça inexistente, de outra empresa ou sem unidade livre).

Listar Vendas

GET /api/v1/ecommerce/sales Token

Encomendas criadas com este token, da mais recente para a mais antiga. Cada uma inclui as linhas de produto, o cliente, o fornecedor e o estado de faturação/reembolso.

Query Parameters

ParâmetroTipoDescrição
limitintResultados por página (default 50, máx 100)
pageintPágina (default 1)
searchintNúmero da encomenda (invoice_number)
statusintEstado da encomenda (tabela abaixo)
languagestringIdioma dos nomes das peças (pt default, en, es, fr, de, it)

Estados

order_statusorder_status_name
1In-Progress
2Accepted
3Delivered
4Cancelled
5Refund
6With Incidence
7Incidence treated

Resposta (uma venda)

{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 1024,
      "ecommerce_id": "60",
      "order_status": 3,
      "num_products": 1,
      "total_value_products": "95.00",
      "total_value_shipping": "15.00",
      "total_value_packaging": "0.00",
      "total_value_other_parcel": "0.00",
      "tax_vat_products": "21.85",
      "tax_vat_shipping": "3.45",
      "tax_vat_packaging": "0.00",
      "tax_vat_other_parcel": "0.00",
      "exemption_vat_products": false,
      "exemption_vat_shipping": false,
      "exemption_vat_packaging": false,
      "exemption_vat_other_parcel": false,
      "maximum_sale_alert_date": "2026-10-14T23:00:00.000Z",
      "notes_sale": "Frágil.",
      "seller_takes_care_shipping": true,
      "provider_takes_care_shipping": false,
      "seller_invoice_provider": false,
      "seller_invoice_client": true,
      "shipping_label": "https://example.com/etiquetas/12345.pdf",
      "shipping_company": "CTT",
      "shipping_tracking_code": "RR123456789PT",
      "reason_failed_sale": null,
      "created_at": "2026-10-08T10:45:32.714Z",
      "updated_at": "2026-10-09T12:01:10.512Z",
      "invoice_number": "12",
      "order_status_name": "Delivered",
      "product_list": [
        {
          "id": 341,
          "product_id": "309",
          "quantity": 1,
          "price_without_vat": 95,
          "tax_vat": 21.85000000000000142108547152020037174224853515625,
          "exemption_vat": false,
          "product_name": "Farol Esquerdo",
          "image_list": [
            {
              "image_id": 202,
              "image_url": "https://images.tp.software/uploads/vehicle/parts/1742277347163-12.jpg",
              "product_id": 309
            }
          ]
        }
      ],
      "client_list": [
        {
          "name": "Miguel Santos",
          "shipping_address": "Rua do Sol, 789",
          "country_code": "PT",
          "postal_code": "4700-123",
          "city": "Braga",
          "vat_number": "123456789",
          "country_code_vat_number": "PT",
          "phone": "+351910000000",
          "email": "miguel.santos@example.com",
          "whatsapp": "+351910000000"
        }
      ],
      "provider_list": [],
      "bill_list": [
        {
          "proposal_seller_refund_value": null,
          "refund_reason": null,
          "proposal_provider_refund_value": null,
          "proposal_seller_type_refund": null,
          "proposal_provider_type_refund": null,
          "refund_state_provider": null,
          "refund_accept_full": false,
          "refund_accept_partial": false,
          "refund_accept_value": null,
          "arrived_to_warehouse": null,
          "billing_document": "",
          "id_billing_document": 1024,
          "billing_credit_note": null,
          "id_billing_credit_note": null,
          "billing_other_document": null,
          "id_other_document": null,
          "type_other_document": null,
          "refund_status_name": ""
        }
      ]
    }
  ],
  "total": 1,
  "pagination": {
    "current_page": 1,
    "per_page": 50,
    "total": 1,
    "total_pages": 1,
    "has_more": false
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Descrição dos Campos

CampoDescrição
idID da venda — usado em id_sale
invoice_numberNúmero da encomenda na empresa (o que POST /sales-order devolve)
ecommerce_idID do token com que a encomenda foi criada
order_status / order_status_nameEstado (tabela acima)
product_list[]Linhas da encomenda, com nome da peça e imagens
client_list[] / provider_list[]Comprador e fornecedor
bill_list[]Faturação e estado do reembolso

Pedir Reembolso

POST /api/v1/ecommerce/refund-notification Token · permissão Reembolsos

Pede o reembolso total (FULL) ou parcial (PARTIAL) de uma venda entregue (estado 3 — Delivered). Cada venda aceita um pedido de reembolso; a empresa aprova-o ou recusa-o no TP Software.

Body (JSON)

{
  "id_sale": 1024,
  "type_refund": "PARTIAL",
  "refund_request_value": 50,
  "reason_refund": "Peça com um suporte partido"
}

Descrição dos Campos

CampoDescrição
id_saleID da venda (id em /sales) — obrigatório
type_refundFULL ou PARTIAL — obrigatório
refund_request_valueValor a reembolsar (número, não negativo); obrigatório (maior que 0) em PARTIAL e nunca acima de total_value_products
reason_refundMotivo (texto livre) — obrigatório

Respostas

{
  "success": true,
  "message": "Refund successfully created.",
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}
HTTPQuando
200Pedido de reembolso criado
400Campo em falta/inválido, valor acima do total ou já existe um pedido para esta venda
403O token não tem a permissão Reembolsos
404Venda inexistente ou de outra empresa, já em reembolso, ou num estado que não permite reembolso

Criar Reserva

POST /api/v1/ecommerce/reserve-orders Token · permissão Reservas

Reserva peças para um cliente, com data de fim, notificações (email/WhatsApp) e alerta antes de expirar.

Body (JSON)

{
  "reservation_name": "Reserva João Silva",
  "reservation_end_date": "2026-10-30 18:00",
  "reservation_end_alert": "2026-10-29 09:00",
  "reservation_notes": "Cliente vai levantar",
  "send_email": 1,
  "send_whatsapp": 0,
  "client": {
    "name": "João Silva",
    "country_code": 1,
    "district": 1,
    "city": 1,
    "bill_address": "Rua das Flores, 10",
    "postal_code": "4700-321",
    "shipping_address": [
      "Rua das Flores, 10"
    ],
    "vat_number": "123456789",
    "vat_country_code": "PT",
    "vat_percentage": 23,
    "is_vat_exempt": 0,
    "phone_number": "+351910000001",
    "email": "joao.silva@example.com",
    "whatsapp_number": "+351910000001"
  },
  "products": [
    {
      "product_id": 309,
      "qty": 1,
      "price": "95.00",
      "reservation_order_notes": "Guardar com a embalagem"
    }
  ]
}

Descrição dos Campos

CampoDescrição
reservation_nameNome da reserva — obrigatório (máx. 255 caracteres)
clientObjeto com os dados do cliente — obrigatório (country_code, district e city são IDs de localização; textos até 255 caracteres; shipping_address é uma lista de moradas — um texto sozinho também é aceite; is_vat_exempt 0/1)
products[]product_id e qty (inteiro de 1 a 100000) obrigatórios; price e reservation_order_notes opcionais. Máximo 100 linhas
reservation_end_date / reservation_end_alertFim da reserva (tem de ser no futuro) e hora do alerta (AAAA-MM-DD HH:MM)
reservation_notesNotas livres
send_email / send_whatsapp0/1 — notificar o cliente (true/false também são aceites)

Resposta

{
  "success": true,
  "message": "Order has been generated successfully!",
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

A reserva (com o uuid) aparece de seguida em GET /ecommerce/reserve-orders.

Antes de reservar, a API confirma cada peça com a mesma regra de /product-inventory/check (stock menos reservas, na empresa do token; a mesma peça em várias linhas soma as quantidades). Se uma peça não tiver a quantidade livre, não existir ou não estiver disponível, nada é reservado: 422 ORDER_REJECTED com o motivo. Também 422 se faltar um dado obrigatório (ex.: data de fim no passado).

Listar Reservas

GET /api/v1/ecommerce/reserve-orders Token

Reservas criadas com este token (ativas, canceladas e convertidas em venda), com as peças reservadas.

Query Parameters

ParâmetroTipoDescrição
limitintResultados por página (default 50, máx 100)
pageintPágina (default 1)
order_fieldstringid (default), created_at ou updated_at
order_typestringdesc (default) ou asc
languagestringIdioma dos nomes das peças (pt default)

Exemplo de Resposta (uma reserva)

{
  "success": true,
  "message": "success",
  "data": [
    {
      "id": 16,
      "uuid": "9dd973a7-2a18-47d1-bd36-00df54b5cc32",
      "company_id": "179",
      "client_id": null,
      "reservation_name": "Reserva João Silva",
      "reservation_end_date": "2026-10-30T18:00:00.000Z",
      "reservation_end_alert": "2026-10-29T09:00:00.000Z",
      "reservation_notes": "Cliente vai levantar",
      "send_email": 1,
      "send_whatsapp": 0,
      "reservation_status": 1,
      "status_name": "Active",
      "client_name": "João Silva",
      "client_email": "joao.silva@example.com",
      "client_phone_number": "+351910000001",
      "market_place_regervation": 1,
      "rev_sync_id": "60",
      "sync_id": 60,
      "created_at": "2026-10-08T11:38:11.000Z",
      "updated_at": "2026-10-08T11:38:11.384Z",
      "part_list": [
        {
          "id": 160,
          "uuid": "cb128000-deaf-4890-985a-7d1b5eee617e",
          "reservation_id": "16",
          "parts_id": "309",
          "part_qty_label_id": "264",
          "reserve_price": "95.00",
          "reserve_vat_price": "0.00",
          "reservation_order_notes": "Guardar com a embalagem",
          "part_code": "ACB-4821-X",
          "part_name": "Farol",
          "namePartPT": "Farol Esquerdo",
          "warehouse_name": null
        }
      ]
    }
  ],
  "total": 1,
  "pagination": {
    "current_page": 1,
    "per_page": 50,
    "total": 1,
    "total_pages": 1,
    "has_more": false
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

reservation_status: 1 Active · 2 Cancelled · 3 Converted into Sales. O nome da peça em namePartPT segue o idioma de language.

Detalhe da Reserva

GET /api/v1/ecommerce/reserve-orders/{uuid} Token

Todos os dados de uma reserva criada com este token, com a lista de peças e os totais.

Parâmetros

ParâmetroTipoDescrição
uuid (no caminho)stringUUID da reserva (de /reserve-orders)
languagestringIdioma dos nomes das peças (pt default)

Exemplo

curl -H "Authorization: Bearer SEU_TOKEN" \
  https://hub.tp.software/api/v1/ecommerce/reserve-orders/9dd973a7-2a18-47d1-bd36-00df54b5cc32
{
  "success": true,
  "message": "success",
  "data": {
    "id": 16,
    "uuid": "9dd973a7-2a18-47d1-bd36-00df54b5cc32",
    "company_id": "179",
    "reservation_name": "Reserva João Silva",
    "reservation_end_date": "2026-10-30T18:00:00.000Z",
    "reservation_status": 1,
    "status_name": "Active",
    "client_name": "João Silva",
    "sync_id": 60,
    "part_list": [
      {
        "id": 160,
        "parts_id": "309",
        "reserve_price": "95.00",
        "reserve_vat_price": "0.00",
        "part_code": "ACB-4821-X",
        "namePartPT": "Farol Esquerdo",
        "warehouse_name": null
      }
    ],
    "total_qty": 1,
    "total_price": 95,
    "total_vat_price": 0
  },
  "meta": {
    "generated_at": "2026-10-08T21:30:00+01:00",
    "api_version": "v1"
  }
}

Reserva inexistente, ou de outro token: 404 NOT_FOUND. UUID mal formado: 400.

Precisa de mais endpoints ou de uma integração à medida?
Abra um pedido de suporte e a nossa equipa contacta-o em 24h úteis.