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
- REST + JSON — pedidos e respostas em JSON (UTF-8)
- Multi-língua — o inventário, as vendas e as reservas aceitam o parâmetro
language(pt,en,es,fr,de,it) - Um token por empresa — cada token dá acesso aos dados de uma empresa TP Software, com as permissões que a empresa lhe atribuiu
- Produção 24/7
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.
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)
- Nos pedidos
POST: campo"tokens"(ou"token") no corpo JSON - Desaconselhado: parâmetro na query
?tokens=SEU_TOKEN(ou?token=). Ainda é aceite, mas um token no URL fica nos registos de acesso dos servidores e proxies pelo caminho. Use o cabeçalhoAuthorization.
Se vierem vários, conta o do cabeçalho.
Como obter o token
- A empresa TP Software entra em my.tp.software → menu Tokens API e cria um token para a integração (ex.: «Loja online»).
- Escolhe as permissões do token: Vendas (inventário e encomendas), Reservas e Reembolsos, e a regra de preço a aplicar neste canal.
- 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) responde403 AUTH_TOKEN_NOT_CLAIMEDa esse token. - A empresa entrega o token ao developer, que o usa no cabeçalho
Authorization.
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ódigo | HTTP | Descrição |
|---|---|---|
VALIDATION_ERROR | 400 | Parâ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_TOKEN | 401 | Token em falta |
AUTH_INVALID_TOKEN | 401 | Token inexistente ou revogado |
AUTH_TOKEN_NOT_CLAIMED | 403 | O token exige ativação por um developer e ainda não foi reivindicado |
PERMISSION_DENIED | 403 | O token não tem a permissão necessária (Vendas, Reservas ou Reembolsos) ou pede dados de outra empresa |
AUTH_ERROR | 401 / 403 | Pedido recusado pela plataforma (ex.: a permissão do token mudou entretanto) |
NOT_FOUND | 404 | Endpoint ou registo inexistente (a mensagem inclui o caminho pedido) |
ORDER_REJECTED | 422 | Encomenda ou reserva recusada: peça indisponível, sem stock, de outra empresa ou dados em falta (a mensagem diz o motivo) |
UPSTREAM_UNAVAILABLE / UPSTREAM_ERROR | 502 / 5xx | Falha temporária da plataforma — tente novamente |
AUTH_UNAVAILABLE | 503 | Não foi possível validar o token neste momento — tente novamente |
UPSTREAM_TIMEOUT | 504 | A 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
- Loja online à medida — sincronizar o catálogo de peças (com imagens e vídeos) e criar encomendas
- Marketplace de peças — um token por empresa parceira; a lista pública
/ecommerce/companiesmostra as empresas abertas a parcerias - ERP externo — acompanhar encomendas, reservas e reembolsos
Listar Empresas Disponíveis para Parcerias
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âmetro | Tipo | Descrição |
|---|---|---|
limit | int | Resultados por página (default 100, máx 100) |
page | int | Pá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
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âmetro | Tipo | Descrição |
|---|---|---|
limit | int | Resultados por página (default 50, máx 100) |
page | int | Página (default 1) |
search | string | Texto no nome da peça, no idioma de language (máx 100 caracteres) |
order_field | string | id (default), created_at ou updated_at |
order_type | string | desc (default) ou asc |
language | string | pt (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
| Campo | Descrição |
|---|---|
id | ID da peça — é o product_id das encomendas, reservas e da verificação de disponibilidade |
part_price | Preço da peça neste canal, já com a regra de preço do token (texto com 2 casas decimais) |
quantity / reserved_quantity | Unidades em stock e unidades já reservadas |
product_name, vehicle_*_name, brand_name | Nomes 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_value | Peça «sob encomenda» (entrega não imediata) e valor de caução, quando existe |
Verificar Disponibilidade
Verifica se uma quantidade de uma peça está livre (stock menos reservas). Útil antes de criar uma encomenda.
Query Parameters
| Parâmetro | Tipo | Descrição |
|---|---|---|
product_id | int | ID da peça (obrigatório) |
qty | int | Quantidade desejada (default 1) |
company_id | int | Opcional — 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
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
| Campo | Descriçã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_products | Nú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_date | Data limite para tratar a venda (AAAA-MM-DD; uma data que não existe, como 2026-02-30, dá 400) |
notes_sale | Notas livres |
seller_takes_care_shipping / provider_takes_care_shipping | 0/1 — quem trata do envio |
seller_invoice_client / seller_invoice_provider | 0/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_label | URL 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
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âmetro | Tipo | Descrição |
|---|---|---|
limit | int | Resultados por página (default 50, máx 100) |
page | int | Página (default 1) |
search | int | Número da encomenda (invoice_number) |
status | int | Estado da encomenda (tabela abaixo) |
language | string | Idioma dos nomes das peças (pt default, en, es, fr, de, it) |
Estados
order_status | order_status_name |
|---|---|
| 1 | In-Progress |
| 2 | Accepted |
| 3 | Delivered |
| 4 | Cancelled |
| 5 | Refund |
| 6 | With Incidence |
| 7 | Incidence 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
| Campo | Descrição |
|---|---|
id | ID da venda — usado em id_sale |
invoice_number | Número da encomenda na empresa (o que POST /sales-order devolve) |
ecommerce_id | ID do token com que a encomenda foi criada |
order_status / order_status_name | Estado (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
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
| Campo | Descrição |
|---|---|
id_sale | ID da venda (id em /sales) — obrigatório |
type_refund | FULL ou PARTIAL — obrigatório |
refund_request_value | Valor a reembolsar (número, não negativo); obrigatório (maior que 0) em PARTIAL e nunca acima de total_value_products |
reason_refund | Motivo (texto livre) — obrigatório |
Respostas
{
"success": true,
"message": "Refund successfully created.",
"meta": {
"generated_at": "2026-10-08T21:30:00+01:00",
"api_version": "v1"
}
}
| HTTP | Quando |
|---|---|
| 200 | Pedido de reembolso criado |
| 400 | Campo em falta/inválido, valor acima do total ou já existe um pedido para esta venda |
| 403 | O token não tem a permissão Reembolsos |
| 404 | Venda inexistente ou de outra empresa, já em reembolso, ou num estado que não permite reembolso |
Criar Reserva
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
| Campo | Descrição |
|---|---|
reservation_name | Nome da reserva — obrigatório (máx. 255 caracteres) |
client | Objeto 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_alert | Fim da reserva (tem de ser no futuro) e hora do alerta (AAAA-MM-DD HH:MM) |
reservation_notes | Notas livres |
send_email / send_whatsapp | 0/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
Reservas criadas com este token (ativas, canceladas e convertidas em venda), com as peças reservadas.
Query Parameters
| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | int | Resultados por página (default 50, máx 100) |
page | int | Página (default 1) |
order_field | string | id (default), created_at ou updated_at |
order_type | string | desc (default) ou asc |
language | string | Idioma 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
Todos os dados de uma reserva criada com este token, com a lista de peças e os totais.
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
uuid (no caminho) | string | UUID da reserva (de /reserve-orders) |
language | string | Idioma 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.