Referência da API
Todos os endpoints da v1, gerados do mesmo catálogo que alimenta a API e o documento OpenAPI 3.1.
- URL base
- https://api.tfshop.cloud/v1
- Autenticação
- Authorization: Bearer …
Loja
1 endpointsName, domains, legal entity (CNPJ/CPF), plan limits, NF-e issuer, payment methods and shipping origin of the store the token belongs to. The tenant always comes from the token: there is no store id parameter.
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Store id (st_…). The token belongs to exactly one store. |
| nameObrigatório | string | Store name shown to shoppers. |
| slugObrigatório | string | Store slug ({slug}.tfshop.cloud and /s/{slug}). |
| urlObrigatório | string (uri) | Public storefront URL (primary domain). |
| statusObrigatório | string | draft (not public yet), published or paused. Valores: draftpublishedpaused |
| domainsObrigatório | object[] | Domains of the storefront. |
| hostnameObrigatório | string | Hostname. |
| typeObrigatório | string | subdomain (free) or custom. Valores: subdomaincustom |
| statusObrigatório | string | DNS / certificate status. Valores: pending_dnsverifyingactiveerror |
| primaryObrigatório | boolean | The canonical storefront address. |
| legalObrigatório | object | |
| nameObrigatório | string | Legal name (razão social). |
| documentObrigatório | string | CNPJ (14 characters) or CPF (11 digits) of the seller, without punctuation. NF-e issuer (emit) when the store issues through TF Fiscal. |
| document_typeObrigatório | string | cnpj or cpf. Valores: cnpjcpf |
| state_registrationObrigatório | string | null | Inscrição estadual (IE), digits only, or null. |
| addressObrigatório | object | Seller address (shown in the storefront footer, Decreto 7.962/2013). |
| zipObrigatório | string | CEP, 8 digits.^\d{8}$ |
| streetObrigatório | string | Logradouro. |
| numberObrigatório | string | Número. |
| complementObrigatório | string | null | Complemento. |
| districtObrigatório | string | Bairro. |
| cityObrigatório | string | Município. |
| stateObrigatório | string | UF.^[A-Z]{2}$ |
| countryObrigatório | string | ISO 3166-1 alpha-2. Valores: BR |
| ibge_codeObrigatório | string | null | 7-digit IBGE municipality code, or null when unknown. |
| emailObrigatório | string | Customer-service e-mail. |
| phoneObrigatório | string | Phone in E.164 (+55…), or empty. |
| currencyObrigatório | string | Always BRL. Valores: BRL |
| timezoneObrigatório | string | Always America/Sao_Paulo. Valores: America/Sao_Paulo |
| localeObrigatório | string | Always pt-BR. Valores: pt-BR |
| invoice_issuerObrigatório | string | Who issues the NF-e: tf_fiscal (the store) or erp (apps post it with POST /orders/{order_id}/invoices). Valores: tf_fiscalerp |
| sales_mode | string | How the storefront sells: online (checkout paid through C6), orcamento (orders may be sent with the payment arranged with the store — payment.method offline) or catalogo (prices only, no storefront orders). Valores: onlineorcamentocatalogo |
| planObrigatório | object | |
| idObrigatório | string | Plan id. Valores: startbusinessadvancedenterprise |
| nameObrigatório | string | Plan name. |
| limitsObrigatório | object | |
| productsObrigatório | integer | null | Max products; null = unlimited. |
| staffObrigatório | integer | null | Max staff users; null = unlimited. |
| storesObrigatório | integer | Stores included. |
| orders_per_monthObrigatório | integer | null | Max orders per month; null = unlimited. |
| storage_gbObrigatório | integer | Media storage in GB. |
| payment_methodsObrigatório | object | Methods the store's C6 account accepts at checkout. |
| pixObrigatório | boolean | Pix enabled. |
| credit_cardObrigatório | boolean | Credit card enabled. |
| boletoObrigatório | boolean | Boleto enabled. |
| shipping_origin_cepObrigatório | string | null | CEP the parcels ship from (8 digits), or null when not configured. |
| created_atObrigatório | string (date-time) | Creation time. |
| published_atObrigatório | string | null (date-time) | When the store went live, or null. |
Exemplo
{
"id": "st_volt",
"name": "VoltShop",
"slug": "voltshop",
"url": "https://www.voltshop.com.br",
"status": "published",
"domains": [
{
"hostname": "voltshop.tfshop.cloud",
"type": "subdomain",
"status": "active",
"primary": false
},
{
"hostname": "www.voltshop.com.br",
"type": "custom",
"status": "active",
"primary": true
}
],
"legal": {
"name": "Volt Comércio de Eletrônicos Ltda",
"document": "11222333000181",
"document_type": "cnpj",
"state_registration": "123456789110",
"address": {
"zip": "03016000",
"street": "Rua Oriente",
"number": "320",
"complement": "Loja 4",
"district": "Brás",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"ibge_code": "3550308"
},
"email": "atendimento@voltshop.com.br",
"phone": "+551133112200"
},
"currency": "BRL",
"timezone": "America/Sao_Paulo",
"locale": "pt-BR",
"invoice_issuer": "tf_fiscal",
"plan": {
"id": "business",
"name": "Business",
"limits": {
"products": null,
"staff": 5,
"stores": 1,
"orders_per_month": null,
"storage_gb": 20
}
},
"payment_methods": {
"pix": true,
"credit_card": true,
"boleto": true
},
"shipping_origin_cep": "03016000",
"created_at": "2026-09-13T15:00:00.000Z",
"published_at": "2026-09-20T12:00:00.000Z"
}curl "https://api.tfshop.cloud/v1/store" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Pedidos
4 endpointsIncremental sync: pass updated_since and follow next_cursor (sorted by updated_at, then id). export_status=pending returns paid orders this app has not acknowledged yet. Test orders are left out unless include_test=true; sandbox tokens (tfs_test_) only see test orders.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| updated_sinceconsulta | string (date-time) | Only objects changed at or after this instant (ISO 8601). |
| statusconsulta | string | Order status (comma-separated for several). |
| export_statusconsulta | string | pending | acknowledged (per app).pendingacknowledged |
| include_testconsulta | boolean | Include test orders (default false). |
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Order[] | Page of Order objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "o_1011",
"number": 1011,
"created_at": "2026-10-26T12:00:00.000Z",
"updated_at": "2026-10-26T12:00:00.000Z",
"status": "paid",
"payment_status": "confirmed",
"fulfillment_status": "unfulfilled",
"invoice_status": "pending",
"test": false,
"channel": "online_store",
"sale_type": "varejo",
"currency": "BRL",
"subtotal": 19990,
"discount": 0,
"shipping_total": 0,
"total": 19990,
"refunded": 0,
"buyer": {
"type": "PF",
"name": "Juliana Martins",
"document": "12345678909",
"document_type": "cpf",
"email": "juliana@exemplo.com.br",
"phone": "+5519981234567",
"state_registration": null,
"ie_indicator": 9,
"masked": false
},
"shipping_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"billing_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"lines": [
{
"line_id": "o_1011:1",
"product_id": "p_pb_20k",
"variant_id": "p_pb_20k_v1",
"sku": "VLT-PB20K",
"title": "Power Bank 20.000 mAh 22,5W",
"variant_title": "Padrão",
"quantity": 1,
"unit_price": 19990,
"list_price": 19990,
"price_type": "varejo",
"packaging": null,
"discount_allocated": 0,
"freight_allocated": 0,
"total": 19990,
"ncm": "85076000",
"cest": null,
"origin": 2,
"gtin": "7891000079190"
}
],
"shipping": {
"carrier": "Correios",
"service": "SEDEX",
"price": 0,
"business_days": 2,
"tracking_code": null,
"tracking_url": null
},
"payment": {
"method": "credit_card",
"status": "confirmed",
"paid_at": "2026-10-26T12:00:00.000Z",
"installments": 2,
"nfe_payment_code": "03",
"card_brand": "visa",
"nfe_card_brand": "01",
"card_last4": "8407",
"acquirer_cnpj": "31872495000172",
"authorization_code": "482913",
"pix_end_to_end_id": null,
"provider": "c6",
"provider_payment_id": "c6_card_1011"
},
"fiscal_hints": {
"ind_pres": 2,
"ind_intermed": 0,
"ind_final": 1
},
"invoice": null,
"export": {
"acknowledged_at": "2026-10-26T12:05:00.000Z",
"external_id": "11011"
}
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/orders?export_status=pending&limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Buyer personal data requires orders.pii:read; without it, name, document, e-mail, phone and address are masked.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Order id (immutable). Use it as the unique key in your system. |
| numberObrigatório | integer | Order number shown to the buyer and the merchant (#1011). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change (latest timeline entry). Use with updated_since. |
| statusObrigatório | string | Order status. Valores: pending_paymentpaidfulfillingfulfilledcancelledexpiredreturn_requestedrefundedpartially_refunded |
| payment_statusObrigatório | string | Payment status (see Payment.status). |
| fulfillment_statusObrigatório | string | Fulfillment status. Valores: unfulfilledlabel_purchasedshippeddeliveredreturned |
| invoice_statusObrigatório | string | NF-e status. Valores: not_requiredpendingauthorizederrorcancelled |
| testObrigatório | boolean | Test order placed by the merchant: never issue an NF-e for it. |
| channelObrigatório | string | Sales channel. Valores: online_storewhatsappmanualvendedormercado_livreshopeetiktok_shop |
| sale_typeObrigatório | string | varejo (retail) or atacado (wholesale: the buyer had wholesale prices and the cart met the store's wholesale rules). Valores: varejoatacado |
| currencyObrigatório | string | Always BRL. Valores: BRL |
| subtotalObrigatório | integer | Sum of the lines (unit_price × quantity). In centavos. ≥ 0 |
| discountObrigatório | integer | Coupon + Pix discount. In centavos. ≥ 0 |
| shipping_totalObrigatório | integer | Freight charged (same as shipping.price). In centavos. ≥ 0 |
| totalObrigatório | integer | subtotal − discount + shipping_total. In centavos. ≥ 0 |
| refundedObrigatório | integer | Refunded so far. In centavos. ≥ 0 |
| buyerObrigatório | → Buyer | NF-e recipient (dest). |
| shipping_addressObrigatório | → Address | Brazilian address. Without orders.pii:read, street, number, complement and district are masked and the CEP keeps only its first 5 digits. |
| billing_addressObrigatório | → Address | Same as the shipping address in v1 (the checkout has a single address). |
| linesObrigatório | → OrderLine[] | Order lines. |
| shippingObrigatório | → OrderShipping | |
| paymentObrigatório | → Payment | Money goes straight to the merchant's own C6 account; refunds are made by the store. |
| fiscal_hintsObrigatório | → FiscalHints | |
| invoiceObrigatório | → Invoice | null | Current NF-e, or null. |
| exportObrigatório | → OrderExportStatus | null | This app's acknowledgement, or null when not yet imported. |
Exemplo
{
"id": "o_1011",
"number": 1011,
"created_at": "2026-10-26T12:00:00.000Z",
"updated_at": "2026-10-26T12:00:00.000Z",
"status": "paid",
"payment_status": "confirmed",
"fulfillment_status": "unfulfilled",
"invoice_status": "pending",
"test": false,
"channel": "online_store",
"sale_type": "varejo",
"currency": "BRL",
"subtotal": 19990,
"discount": 0,
"shipping_total": 0,
"total": 19990,
"refunded": 0,
"buyer": {
"type": "PF",
"name": "Juliana Martins",
"document": "12345678909",
"document_type": "cpf",
"email": "juliana@exemplo.com.br",
"phone": "+5519981234567",
"state_registration": null,
"ie_indicator": 9,
"masked": false
},
"shipping_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"billing_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"lines": [
{
"line_id": "o_1011:1",
"product_id": "p_pb_20k",
"variant_id": "p_pb_20k_v1",
"sku": "VLT-PB20K",
"title": "Power Bank 20.000 mAh 22,5W",
"variant_title": "Padrão",
"quantity": 1,
"unit_price": 19990,
"list_price": 19990,
"price_type": "varejo",
"packaging": null,
"discount_allocated": 0,
"freight_allocated": 0,
"total": 19990,
"ncm": "85076000",
"cest": null,
"origin": 2,
"gtin": "7891000079190"
}
],
"shipping": {
"carrier": "Correios",
"service": "SEDEX",
"price": 0,
"business_days": 2,
"tracking_code": null,
"tracking_url": null
},
"payment": {
"method": "credit_card",
"status": "confirmed",
"paid_at": "2026-10-26T12:00:00.000Z",
"installments": 2,
"nfe_payment_code": "03",
"card_brand": "visa",
"nfe_card_brand": "01",
"card_last4": "8407",
"acquirer_cnpj": "31872495000172",
"authorization_code": "482913",
"pix_end_to_end_id": null,
"provider": "c6",
"provider_payment_id": "c6_card_1011"
},
"fiscal_hints": {
"ind_pres": 2,
"ind_intermed": 0,
"ind_final": 1
},
"invoice": null,
"export": {
"acknowledged_at": "2026-10-26T12:05:00.000Z",
"external_id": "11011"
}
}curl "https://api.tfshop.cloud/v1/orders/o_1011" \
-H "Authorization: Bearer $TFSHOP_TOKEN"/ orders/ {order_id}/ acknowledgeMark the order as imported by this app
Idempotent per app: acknowledging again returns the first acknowledgement (and updates external_id when sent). Optionally stores the order id in your system for support.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| external_id | string | Order id in your system ("Bling pedido 10293"). máx. 64 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| order_idObrigatório | string | Order id. |
| acknowledged_atObrigatório | string (date-time) | First acknowledgement. |
| external_idObrigatório | string | null | Id in your system. |
Exemplo
{
"order_id": "string",
"acknowledged_at": "2026-10-29T13:05:12.000Z",
"external_id": "string"
}Erros:idempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/acknowledge" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"external_id": "10293"
}'/ orders/ {order_id}/ cancelCancel an unpaid order, or request cancellation of a paid one
An unpaid order is cancelled at once (200, status cancelled). A paid order gets a cancellation request the merchant decides (202, status cancellation_requested): refunds always happen in the store (C6).
Pode publicarorder.cancelledorder.updated
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| reason | string | Why (out of stock, fraud review…). máx. 200 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| order_idObrigatório | string | Order id. |
| statusObrigatório | string | cancelled or cancellation_requested. Valores: cancelledcancellation_requested |
Exemplo
{
"order_id": "string",
"status": "cancelled"
}Erros:invalid_state
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/cancel" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "Sem estoque no depósito"
}'NF-e
2 endpoints/ orders/ {order_id}/ invoicesPost the NF-e issued by the ERP
Validates the 44-digit access key (check digit, model 55, issuer = store's CNPJ). Idempotent by access key. Rejected with 409 when the store issues its own NF-e (TF Fiscal) or the order is a test order. The order must be paid and not shipped yet.
Pode publicarinvoice.authorized
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| access_keyObrigatório | string | 44-digit access key.^\d{6}[0-9A-Z]{14}\d{24}$ |
| number | integer | nNF (checked against the key when sent). |
| series | integer | Series (checked against the key when sent). |
| issued_at | string (date-time) | Issue date (ISO 8601). |
| xml_url | string (uri) | HTTPS URL of the authorised XML. |
| danfe_url | string (uri) | HTTPS URL of the DANFE. |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| order_idObrigatório | string | Order id. |
| numberObrigatório | integer | NF-e number (nNF). |
| seriesObrigatório | integer | NF-e series. |
| access_keyObrigatório | string | 44-digit access key (chave de acesso).^\d{6}[0-9A-Z]{14}\d{24}$ |
| issued_atObrigatório | string (date-time) | Issue date. |
| sourceObrigatório | string | tf_fiscal (issued by the store) or erp (posted by an app). Valores: tf_fiscalerp |
| statusObrigatório | string | authorized or cancelled. Valores: authorizedcancelled |
| xml_urlObrigatório | string | null | Authorised XML. |
| danfe_urlObrigatório | string | null | DANFE PDF. |
Exemplo
{
"order_id": "o_2005",
"number": 1501,
"series": 1,
"access_key": "35261011222333000181550010000150011000150019",
"issued_at": "2026-10-28T14:10:00.000Z",
"source": "erp",
"status": "authorized",
"xml_url": "https://erp.exemplo.com.br/nfe/35261011222333000181550010000150011000150019.xml",
"danfe_url": null
}Erros:invoice_issuer_mismatchtest_orderinvalid_stateidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/invoices" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"access_key": "35261011222333000181550010000150011000150019",
"issued_at": "2026-10-28T14:10:00.000Z",
"xml_url": "https://erp.exemplo.com.br/nfe/35261011222333000181550010000150011000150019.xml"
}'/ orders/ {order_id}/ invoices/ {access_key}/ cancelReport that the NF-e was cancelled at SEFAZ
Pode publicarinvoice.cancelled
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
| access_keycaminhoObrigatório | string | 44-digit access key. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| reason | string | Justificativa sent to SEFAZ. máx. 255 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| order_idObrigatório | string | Order id. |
| numberObrigatório | integer | NF-e number (nNF). |
| seriesObrigatório | integer | NF-e series. |
| access_keyObrigatório | string | 44-digit access key (chave de acesso).^\d{6}[0-9A-Z]{14}\d{24}$ |
| issued_atObrigatório | string (date-time) | Issue date. |
| sourceObrigatório | string | tf_fiscal (issued by the store) or erp (posted by an app). Valores: tf_fiscalerp |
| statusObrigatório | string | authorized or cancelled. Valores: authorizedcancelled |
| xml_urlObrigatório | string | null | Authorised XML. |
| danfe_urlObrigatório | string | null | DANFE PDF. |
Exemplo
{
"order_id": "o_2005",
"number": 1501,
"series": 1,
"access_key": "35261011222333000181550010000150011000150019",
"issued_at": "2026-10-28T14:10:00.000Z",
"source": "erp",
"status": "authorized",
"xml_url": "https://erp.exemplo.com.br/nfe/35261011222333000181550010000150011000150019.xml",
"danfe_url": null
}Erros:invoice_issuer_mismatch
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/invoices/35261011222333000181550010000010421304812756/cancel" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "string"
}'Envios
2 endpoints/ orders/ {order_id}/ fulfillmentsMark the order as shipped with carrier and tracking code
Requires an authorised NF-e or DC-e (the parcel cannot travel without a fiscal document). Correios codes are checked in S10 format with the check digit. Idempotent by tracking code; the buyer gets the shipped e-mail with the tracking link.
Pode publicarfulfillment.shipped
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| carrierObrigatório | string | Carrier name (Correios, Jadlog, Loggi, J&T Express, Total Express or another). |
| service | string | Service (PAC, SEDEX…). |
| tracking_codeObrigatório | string | Tracking code. máx. 30 |
| tracking_url | string (uri) | Carrier tracking URL, if any. |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Fulfillment id ({order_id}:f1). |
| order_idObrigatório | string | Order id. |
| statusObrigatório | string | shipped or delivered. Valores: shippeddelivered |
| carrierObrigatório | string | Carrier. |
| serviceObrigatório | string | Service. |
| tracking_codeObrigatório | string | Tracking code (Correios: S10 with a valid check digit). |
| tracking_urlObrigatório | string | null | Public tracking page. |
| shipped_atObrigatório | string | null (date-time) | When the order was marked as shipped. |
| delivered_atObrigatório | string | null (date-time) | When it was delivered. |
Exemplo
{
"id": "o_1011:f1",
"order_id": "o_1011",
"status": "shipped",
"carrier": "Correios",
"service": "SEDEX",
"tracking_code": "SS123456785BR",
"tracking_url": "https://www.voltshop.com.br/rastreio/SS123456785BR",
"shipped_at": "2026-10-28T16:00:00.000Z",
"delivered_at": null
}Erros:fiscal_document_requiredinvalid_stateidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/fulfillments" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"carrier": "Correios",
"service": "SEDEX",
"tracking_code": "SS123456785BR"
}'/ orders/ {order_id}/ fulfillments/ deliveredMark the order as delivered
Pode publicarfulfillment.delivered
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| order_idcaminhoObrigatório | string | Order id (o_…). |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| delivered_at | string (date-time) | When it was delivered (ISO 8601); default now. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Fulfillment id ({order_id}:f1). |
| order_idObrigatório | string | Order id. |
| statusObrigatório | string | shipped or delivered. Valores: shippeddelivered |
| carrierObrigatório | string | Carrier. |
| serviceObrigatório | string | Service. |
| tracking_codeObrigatório | string | Tracking code (Correios: S10 with a valid check digit). |
| tracking_urlObrigatório | string | null | Public tracking page. |
| shipped_atObrigatório | string | null (date-time) | When the order was marked as shipped. |
| delivered_atObrigatório | string | null (date-time) | When it was delivered. |
Exemplo
{
"id": "o_1011:f1",
"order_id": "o_1011",
"status": "shipped",
"carrier": "Correios",
"service": "SEDEX",
"tracking_code": "SS123456785BR",
"tracking_url": "https://www.voltshop.com.br/rastreio/SS123456785BR",
"shipped_at": "2026-10-28T16:00:00.000Z",
"delivered_at": null
}Erros:invalid_state
curl -X POST "https://api.tfshop.cloud/v1/orders/o_1011/fulfillments/delivered" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"delivered_at": "2026-10-29T13:05:12.000Z"
}'Produtos
8 endpoints- GET/
categories - GET/
products - GET/
products/ {product_id} - POST/
products - PATCH/
products/ {product_id} - DELETE/
products/ {product_id} - GET/
variants - POST/
prices/ batch
Sorted by path (parents first). Use the id as category_id when creating or updating a product; the admin manages the tree.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Category[] | Page of Category objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "cat_chargers",
"parent_id": "cat_v_charging",
"name": "Carregadores",
"path": [
"Celulares e acessórios",
"Carregadores e cabos",
"Carregadores"
],
"slug": "carregadores",
"position": 0,
"visible": true,
"default_ncm": "85044010"
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/categories?limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Sorted by updated_at, then id. Archived products are included (filter with status).
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| updated_sinceconsulta | string (date-time) | Only objects changed at or after this instant (ISO 8601). |
| statusconsulta | string | active | draft | archivedactivedraftarchived |
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Product[] | Page of Product objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/products?limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| product_idcaminhoObrigatório | string | Product id. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Product id. |
| titleObrigatório | string | Title. |
| handleObrigatório | string | URL slug (set on creation, never changes). |
| statusObrigatório | string | active (on sale), draft or archived. Valores: activedraftarchived |
| descriptionObrigatório | string | Plain-text description (line breaks kept; HTML is not rendered). |
| category_idObrigatório | string | null | Primary category id. |
| brandObrigatório | string | null | Brand. |
| tagsObrigatório | string[] | Tags. |
| fiscalObrigatório | object | |
| ncmObrigatório | string | null | NCM, 8 digits, or null when not informed (optional; required only when the store issues the NF-e itself).^\d{8}$ |
| cestObrigatório | string | null | CEST, 7 digits. |
| originObrigatório | integer | Origem da mercadoria (0–8). 0 a 8 |
| weight_gramsObrigatório | integer | Shipping weight in grams. ≥ 0 |
| dimensions_cmObrigatório | object | Package dimensions in cm. |
| lengthObrigatório | number | |
| widthObrigatório | number | |
| heightObrigatório | number | |
| imagesObrigatório | object[] | Gallery, first = main image. Images sent by apps are copied into the store's media library shortly after the write, so the URLs change to the store's own. |
| urlObrigatório | string | Absolute image URL. |
| altObrigatório | string | null | Alt text. |
| wholesaleObrigatório | → Wholesale | null | Wholesale pricing, or null when the product has none. |
| packagingsObrigatório | → Packaging[] | Sales packages (up to 4); empty when sold by the piece only. |
| packaging_onlyObrigatório | boolean | True when the product is sold only in packages (no loose pieces). |
| variantsObrigatório | → Variant[] | Variants (at least one). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change of product data (not stock). |
Exemplo
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}curl "https://api.tfshop.cloud/v1/products/p_gan_65w" \
-H "Authorization: Bearer $TFSHOP_TOKEN"SKUs must be unique in the store. NCM is optional, but must have 8 digits when sent. Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Pode publicarproduct.createdinventory.updated
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| titleObrigatório | string | Title. máx. 150 |
| description | string | Plain-text description (line breaks kept; HTML tags are stripped). máx. 10000 |
| status | string | Default draft. Valores: activedraftarchived |
| category_id | string | null | Category id of the store. |
| brand | string | null | Brand. |
| tags | string[] | Tags. |
| fiscal | object | |
| ncm | string | null | NCM, 8 digits (optional).^\d{8}$ |
| cest | string | null | CEST, 7 digits. |
| origin | integer | Origem (0–8). 0 a 8 |
| weight_grams | integer | Weight in grams. ≥ 0 |
| dimensions_cm | object | |
| length | number | |
| width | number | |
| height | number | |
| images | object[] | Gallery. |
| urlObrigatório | string (uri) | HTTPS image URL. |
| alt | string | null | Alt text. |
| wholesale | object | null | Replaces the whole wholesale configuration when sent; null removes it. |
| enabled | boolean | Default true when tiers are sent. |
| tiers | object[] | Up to 5 tiers: min_qty ascending, unit_price descending. máx. 5 |
| min_qtyObrigatório | integer | Pieces (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price in centavos (> 0). ≥ 1 |
| min_qty | integer | null | MOQ in pieces, or null. ≥ 1 |
| multiple | integer | null | Sold in multiples of this many pieces, or null. ≥ 2 |
| packs | object[] | Fixed size packs; omit to keep the current ones. |
| id | string | Keep an existing pack by sending its id. |
| name | string | Name. |
| axisObrigatório | string | Option name of the product ("Tamanho"). |
| compositionObrigatório | map<integer> | Pieces per option value. |
| packagings | object[] | Replaces the whole package list when sent (up to 4); [] removes every package. Packages the app does not send are removed, so send the current ones (with their ids) along with new ones. máx. 4 |
| id | string | Keep an existing package by sending its id (order lines reference it); omit for a new one. |
| unitObrigatório | string | Kind of package. Valores: duziameia_duziacaixapacotefardodisplaykitoutro |
| label | string | null | Own name; required for unit "outro". máx. 60 |
| piecesObrigatório | integer | Pieces per package (dúzia = 12, meia dúzia = 6). 2 a 10000 |
| unit_price | integer | null | Per-piece price in centavos, or null for the product's usual price. ≥ 1 |
| tiers | object[] | Up to 3 tiers (need unit_price): min_packages ascending, unit_price descending. máx. 3 |
| min_packagesObrigatório | integer | Packages (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price in centavos. ≥ 1 |
| fill | string | single (default), mix or assorted. Valores: singlemixassorted |
| axis | string | null | mix / assorted: option name whose values are mixed; null = all variants. |
| wholesale_only | boolean | Only for buyers with wholesale prices (default false). |
| packaging_only | boolean | Sell only in packages (needs at least one package). |
| variantsObrigatório | object[] | Variants (1–100). máx. 100 |
| skuObrigatório | string | SKU, unique in the store. máx. 60 |
| title | string | Variant title; defaults to the option values joined by " / ". |
| options | map<string> | Option values ({"Cor": "Preto"}). |
| priceObrigatório | integer | Retail price in centavos (> 0). ≥ 1 |
| compare_at_price | integer | null | "De" price in centavos, above price. ≥ 1 |
| gtin | string | null | GTIN/EAN (8, 12, 13 or 14 digits). |
| image_url | string | null (uri) | Photo of this variant: public HTTPS URL (added to the gallery when missing). |
| on_hand | integer | Initial stock (on update: sets the stock when sent, otherwise kept). ≥ 0 |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Product id. |
| titleObrigatório | string | Title. |
| handleObrigatório | string | URL slug (set on creation, never changes). |
| statusObrigatório | string | active (on sale), draft or archived. Valores: activedraftarchived |
| descriptionObrigatório | string | Plain-text description (line breaks kept; HTML is not rendered). |
| category_idObrigatório | string | null | Primary category id. |
| brandObrigatório | string | null | Brand. |
| tagsObrigatório | string[] | Tags. |
| fiscalObrigatório | object | |
| ncmObrigatório | string | null | NCM, 8 digits, or null when not informed (optional; required only when the store issues the NF-e itself).^\d{8}$ |
| cestObrigatório | string | null | CEST, 7 digits. |
| originObrigatório | integer | Origem da mercadoria (0–8). 0 a 8 |
| weight_gramsObrigatório | integer | Shipping weight in grams. ≥ 0 |
| dimensions_cmObrigatório | object | Package dimensions in cm. |
| lengthObrigatório | number | |
| widthObrigatório | number | |
| heightObrigatório | number | |
| imagesObrigatório | object[] | Gallery, first = main image. Images sent by apps are copied into the store's media library shortly after the write, so the URLs change to the store's own. |
| urlObrigatório | string | Absolute image URL. |
| altObrigatório | string | null | Alt text. |
| wholesaleObrigatório | → Wholesale | null | Wholesale pricing, or null when the product has none. |
| packagingsObrigatório | → Packaging[] | Sales packages (up to 4); empty when sold by the piece only. |
| packaging_onlyObrigatório | boolean | True when the product is sold only in packages (no loose pieces). |
| variantsObrigatório | → Variant[] | Variants (at least one). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change of product data (not stock). |
Exemplo
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/products" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"title": "Cabo USB-C 240W 2 m",
"description": "Cabo de nylon trançado, 240 W, 40 Gbps.",
"status": "draft",
"brand": "Volt",
"fiscal": {
"ncm": "85444200",
"origin": 2
},
"weight_grams": 60,
"dimensions_cm": {
"length": 12,
"width": 8,
"height": 2
},
"variants": [
{
"sku": "VLT-C240-2M",
"price": 8990,
"gtin": "7891000123457",
"on_hand": 30
}
]
}'/ products/ {product_id}Update a product (fields, images and, when sent, the variant set)
Variants are matched by SKU: existing ones keep their id and reserved units; new SKUs are created; SKUs left out of a sent variants array are removed. on_hand changes stock only when sent.
Pode publicarproduct.updatedinventory.updated
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| product_idcaminhoObrigatório | string | Product id. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| title | string | Title. máx. 150 |
| description | string | Plain-text description (line breaks kept; HTML tags are stripped). máx. 10000 |
| status | string | Default draft. Valores: activedraftarchived |
| category_id | string | null | Category id of the store. |
| brand | string | null | Brand. |
| tags | string[] | Tags. |
| fiscal | object | |
| ncm | string | null | NCM, 8 digits (optional).^\d{8}$ |
| cest | string | null | CEST, 7 digits. |
| origin | integer | Origem (0–8). 0 a 8 |
| weight_grams | integer | Weight in grams. ≥ 0 |
| dimensions_cm | object | |
| length | number | |
| width | number | |
| height | number | |
| images | object[] | Gallery. |
| urlObrigatório | string (uri) | HTTPS image URL. |
| alt | string | null | Alt text. |
| wholesale | object | null | Replaces the whole wholesale configuration when sent; null removes it. |
| enabled | boolean | Default true when tiers are sent. |
| tiers | object[] | Up to 5 tiers: min_qty ascending, unit_price descending. máx. 5 |
| min_qtyObrigatório | integer | Pieces (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price in centavos (> 0). ≥ 1 |
| min_qty | integer | null | MOQ in pieces, or null. ≥ 1 |
| multiple | integer | null | Sold in multiples of this many pieces, or null. ≥ 2 |
| packs | object[] | Fixed size packs; omit to keep the current ones. |
| id | string | Keep an existing pack by sending its id. |
| name | string | Name. |
| axisObrigatório | string | Option name of the product ("Tamanho"). |
| compositionObrigatório | map<integer> | Pieces per option value. |
| packagings | object[] | Replaces the whole package list when sent (up to 4); [] removes every package. Packages the app does not send are removed, so send the current ones (with their ids) along with new ones. máx. 4 |
| id | string | Keep an existing package by sending its id (order lines reference it); omit for a new one. |
| unitObrigatório | string | Kind of package. Valores: duziameia_duziacaixapacotefardodisplaykitoutro |
| label | string | null | Own name; required for unit "outro". máx. 60 |
| piecesObrigatório | integer | Pieces per package (dúzia = 12, meia dúzia = 6). 2 a 10000 |
| unit_price | integer | null | Per-piece price in centavos, or null for the product's usual price. ≥ 1 |
| tiers | object[] | Up to 3 tiers (need unit_price): min_packages ascending, unit_price descending. máx. 3 |
| min_packagesObrigatório | integer | Packages (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price in centavos. ≥ 1 |
| fill | string | single (default), mix or assorted. Valores: singlemixassorted |
| axis | string | null | mix / assorted: option name whose values are mixed; null = all variants. |
| wholesale_only | boolean | Only for buyers with wholesale prices (default false). |
| packaging_only | boolean | Sell only in packages (needs at least one package). |
| variants | object[] | When sent, the full variant set: matched by SKU, existing variants keep their id and reserved units, new SKUs are added, SKUs left out are removed. máx. 100 |
| skuObrigatório | string | SKU, unique in the store. máx. 60 |
| title | string | Variant title; defaults to the option values joined by " / ". |
| options | map<string> | Option values ({"Cor": "Preto"}). |
| priceObrigatório | integer | Retail price in centavos (> 0). ≥ 1 |
| compare_at_price | integer | null | "De" price in centavos, above price. ≥ 1 |
| gtin | string | null | GTIN/EAN (8, 12, 13 or 14 digits). |
| image_url | string | null (uri) | Photo of this variant: public HTTPS URL (added to the gallery when missing). |
| on_hand | integer | Initial stock (on update: sets the stock when sent, otherwise kept). ≥ 0 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Product id. |
| titleObrigatório | string | Title. |
| handleObrigatório | string | URL slug (set on creation, never changes). |
| statusObrigatório | string | active (on sale), draft or archived. Valores: activedraftarchived |
| descriptionObrigatório | string | Plain-text description (line breaks kept; HTML is not rendered). |
| category_idObrigatório | string | null | Primary category id. |
| brandObrigatório | string | null | Brand. |
| tagsObrigatório | string[] | Tags. |
| fiscalObrigatório | object | |
| ncmObrigatório | string | null | NCM, 8 digits, or null when not informed (optional; required only when the store issues the NF-e itself).^\d{8}$ |
| cestObrigatório | string | null | CEST, 7 digits. |
| originObrigatório | integer | Origem da mercadoria (0–8). 0 a 8 |
| weight_gramsObrigatório | integer | Shipping weight in grams. ≥ 0 |
| dimensions_cmObrigatório | object | Package dimensions in cm. |
| lengthObrigatório | number | |
| widthObrigatório | number | |
| heightObrigatório | number | |
| imagesObrigatório | object[] | Gallery, first = main image. Images sent by apps are copied into the store's media library shortly after the write, so the URLs change to the store's own. |
| urlObrigatório | string | Absolute image URL. |
| altObrigatório | string | null | Alt text. |
| wholesaleObrigatório | → Wholesale | null | Wholesale pricing, or null when the product has none. |
| packagingsObrigatório | → Packaging[] | Sales packages (up to 4); empty when sold by the piece only. |
| packaging_onlyObrigatório | boolean | True when the product is sold only in packages (no loose pieces). |
| variantsObrigatório | → Variant[] | Variants (at least one). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change of product data (not stock). |
Exemplo
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}Erros:sandbox_read_only
curl -X PATCH "https://api.tfshop.cloud/v1/products/p_gan_65w" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"fiscal": {
"ncm": "85044010",
"cest": "2106400"
},
"weight_grams": 150,
"variants": [
{
"sku": "VLT-C240-2M",
"price": 8490,
"compare_at_price": 9990,
"options": {
"Cor": "Preto"
}
}
]
}'Products are archived, never erased: past orders keep pointing at them.
Pode publicarproduct.deleted
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| product_idcaminhoObrigatório | string | Product id. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Product id. |
| titleObrigatório | string | Title. |
| handleObrigatório | string | URL slug (set on creation, never changes). |
| statusObrigatório | string | active (on sale), draft or archived. Valores: activedraftarchived |
| descriptionObrigatório | string | Plain-text description (line breaks kept; HTML is not rendered). |
| category_idObrigatório | string | null | Primary category id. |
| brandObrigatório | string | null | Brand. |
| tagsObrigatório | string[] | Tags. |
| fiscalObrigatório | object | |
| ncmObrigatório | string | null | NCM, 8 digits, or null when not informed (optional; required only when the store issues the NF-e itself).^\d{8}$ |
| cestObrigatório | string | null | CEST, 7 digits. |
| originObrigatório | integer | Origem da mercadoria (0–8). 0 a 8 |
| weight_gramsObrigatório | integer | Shipping weight in grams. ≥ 0 |
| dimensions_cmObrigatório | object | Package dimensions in cm. |
| lengthObrigatório | number | |
| widthObrigatório | number | |
| heightObrigatório | number | |
| imagesObrigatório | object[] | Gallery, first = main image. Images sent by apps are copied into the store's media library shortly after the write, so the URLs change to the store's own. |
| urlObrigatório | string | Absolute image URL. |
| altObrigatório | string | null | Alt text. |
| wholesaleObrigatório | → Wholesale | null | Wholesale pricing, or null when the product has none. |
| packagingsObrigatório | → Packaging[] | Sales packages (up to 4); empty when sold by the piece only. |
| packaging_onlyObrigatório | boolean | True when the product is sold only in packages (no loose pieces). |
| variantsObrigatório | → Variant[] | Variants (at least one). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change of product data (not stock). |
Exemplo
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}Erros:sandbox_read_only
curl -X DELETE "https://api.tfshop.cloud/v1/products/p_gan_65w" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| skuconsulta | string | One or more SKUs, comma-separated (max 100). |
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Variant[] | Page of Variant objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "string",
"product_id": "string",
"sku": "string",
"title": "string",
"options": {},
"price": 0,
"compare_at_price": 0,
"gtin": "string",
"image_url": "string",
"inventory": {
"on_hand": 0,
"reserved": 0,
"available": 0
}
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/variants?sku=VLT-GAN65W,VLT-CHARGER20&limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"/ prices/ batchSet retail and compare-at prices by SKU (up to 100)
Coupons, Pix discount and promotions stay in the store. Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Pode publicarproduct.updated
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| itemsObrigatório | object[] | Up to 100 SKUs. The batch is applied all or nothing. máx. 100 |
| skuObrigatório | string | SKU. |
| priceObrigatório | integer | Retail price in centavos (> 0). ≥ 1 |
| compare_at_price | integer | null | "De" price, or null to remove it. ≥ 1 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Variant[] | Updated Variant objects, in request order. |
Exemplo
{
"data": [
{
"id": "string",
"product_id": "string",
"sku": "string",
"title": "string",
"options": {},
"price": 0,
"compare_at_price": 0,
"gtin": "string",
"image_url": "string",
"inventory": {
"on_hand": 0,
"reserved": 0,
"available": 0
}
}
]
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/prices/batch" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"items": [
{
"sku": "VLT-GAN65W",
"price": 16990,
"compare_at_price": 21990
},
{
"sku": "VLT-CHARGER20",
"price": 6490
}
]
}'Estoque
3 endpoints/ inventory_levelsList stock levels (on hand, reserved, available) by SKU
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| skuconsulta | string | SKUs, comma-separated (max 100). |
| updated_sinceconsulta | string (date-time) | Only objects changed at or after this instant (ISO 8601). |
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → InventoryLevel[] | Page of InventoryLevel objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"sku": "VLT-GAN65W",
"variant_id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"on_hand": 42,
"reserved": 1,
"available": 41,
"updated_at": "2026-10-28T13:05:12.000Z"
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/inventory_levels?sku=VLT-GAN65W,VLT-CHARGER20&limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"/ inventory_levels/ setSet absolute on-hand quantities by SKU (up to 100, e.g. after a stock count)
Units reserved by unpaid orders are kept: available = on_hand − reserved. Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Pode publicarinventory.updated
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| itemsObrigatório | object[] | Up to 100 SKUs, all or nothing. máx. 100 |
| skuObrigatório | string | SKU. |
| on_handObrigatório | integer | Absolute units in stock. ≥ 0 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → InventoryLevel[] | Updated InventoryLevel objects, in request order. |
Exemplo
{
"data": [
{
"sku": "VLT-GAN65W",
"variant_id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"on_hand": 42,
"reserved": 1,
"available": 41,
"updated_at": "2026-10-28T13:05:12.000Z"
}
]
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/inventory_levels/set" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"items": [
{
"sku": "VLT-GAN65W",
"on_hand": 40
}
]
}'/ inventory_levels/ adjustAdd or remove units by SKU with a reason (up to 100)
Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Pode publicarinventory.updated
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| itemsObrigatório | object[] | Up to 100 SKUs, all or nothing. máx. 100 |
| skuObrigatório | string | SKU. |
| deltaObrigatório | integer | Units to add (positive) or remove (negative); on_hand never goes below 0. |
| reasonObrigatório | string | Why ("recebimento NF 1234", "avaria", "inventário"). máx. 120 |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → InventoryLevel[] | Updated InventoryLevel objects, in request order. |
Exemplo
{
"data": [
{
"sku": "VLT-GAN65W",
"variant_id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"on_hand": 42,
"reserved": 1,
"available": 41,
"updated_at": "2026-10-28T13:05:12.000Z"
}
]
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/inventory_levels/adjust" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"items": [
{
"sku": "VLT-GAN65W",
"delta": 24,
"reason": "Recebimento NF 88213"
}
]
}'Webhooks
3 endpointsResposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → WebhookEndpoint[] | Page of WebhookEndpoint objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "string",
"url": "https://erp.exemplo.com.br/recurso",
"description": "string",
"events": [
"order.created"
],
"status": "enabled",
"created_at": "2026-10-29T13:05:12.000Z",
"secret": "string"
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/webhook_endpoints" \
-H "Authorization: Bearer $TFSHOP_TOKEN"/ webhook_endpointsSubscribe a URL to events (returns the signing secret once)
Each event type needs the read scope of its object (orders:read, products:read, inventory:read). Deliveries are signed with Standard Webhooks headers and retried for about a day (5 s, 5 min, 30 min, 2 h, 5 h, 10 h, 10 h).
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| urlObrigatório | string (uri) | HTTPS URL. |
| eventsObrigatório | string[] | Event types. |
| description | string | Free text. máx. 120 |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Endpoint id (we_…). |
| urlObrigatório | string (uri) | HTTPS URL that receives the events. |
| descriptionObrigatório | string | null | Free text. |
| eventsObrigatório | string[] | Subscribed event types. |
| statusObrigatório | string | enabled or disabled. Valores: enableddisabled |
| created_atObrigatório | string (date-time) | Creation time. |
| secret | string | Signing secret (whsec_…). Returned only by the create call: store it. |
Exemplo
{
"id": "string",
"url": "https://erp.exemplo.com.br/recurso",
"description": "string",
"events": [
"order.created"
],
"status": "enabled",
"created_at": "2026-10-29T13:05:12.000Z",
"secret": "string"
}Erros:idempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/webhook_endpoints" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"url": "https://erp.exemplo.com.br/webhooks/tfshop",
"events": [
"order.paid",
"order.cancelled"
],
"description": "ERP produção"
}'Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| endpoint_idcaminhoObrigatório | string | we_… |
Resposta 204
204 No Content
curl -X DELETE "https://api.tfshop.cloud/v1/webhook_endpoints/we_3Jx8Lq2Vn5Rk0p" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Eventos
1 endpointsOldest first. Only event types your scopes can read are listed.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| typeconsulta | string | Event type filter (comma-separated). |
| created_sinceconsulta | string (date-time) | ISO 8601. |
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Event[] | Page of Event objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "evt_8bQ2kT9mWx1Lp4",
"type": "order.paid",
"timestamp": "2026-10-28T13:05:12.000Z",
"api_version": "v1",
"store_id": "st_volt",
"actor": {
"type": "system",
"app_id": null
},
"data": {
"object": "order",
"id": "o_1017",
"reference": "1017",
"status": "paid",
"test": false
}
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/events?type=order.paid&limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Design da loja
12 endpoints- GET/
theme - PATCH/
theme - POST/
theme/ sections - PATCH/
theme/ sections/ {section_id} - DELETE/
theme/ sections/ {section_id} - GET/
theme/ versions - POST/
theme/ versions/ {version_id}/ restore - GET/
menus - PUT/
menus - GET/
pages - POST/
pages - PATCH/
pages/ {page_id}
Preset, tokens, home page sections in display order, header / footer / product options, the storefront URL and how many versions can be restored.
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}curl "https://api.tfshop.cloud/v1/theme" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Partial: only the sent fields change. preset_id replaces every token with the preset's and keeps the sections. The previous theme is kept as a version.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| preset_id | string | Apply a preset: replaces every token with the preset's and keeps the sections. Valores: voltcleanmodaatacadocasabeleza |
| tokens | object | Only the sent tokens change. |
| primary | string | Hex colour. |
| primary_text | string | Hex colour. |
| accent | string | Hex colour. |
| background | string | Hex colour. |
| surface | string | Hex colour. |
| text | string | Hex colour. |
| muted_text | string | Hex colour. |
| header_background | string | Hex colour. |
| header_text | string | Hex colour. |
| radius | string | Corner radius. Valores: nonesmmdlg |
| heading_font | string | Heading font. Valores: interjakartagrotesk |
| body_font | string | Body font. Valores: interjakartagrotesk |
| header | object | |
| show_search | boolean | Search box in the header. |
| menu_category_ids | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footer | object | |
| about_text | string | Short text about the store (≤ 400 characters). |
| show_payment_icons | boolean | Pix / card / boleto icons. |
| product | object | |
| show_pix_price | boolean | Pix price with discount. |
| show_installments | boolean | Instalment line. |
| show_shipping_calculator | boolean | CEP shipping calculator. |
| show_whatsapp_button | boolean | WhatsApp button. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}Erros:sandbox_read_only
curl -X PATCH "https://api.tfshop.cloud/v1/theme" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tokens": {
"primary": "#0f766e",
"accent": "#f59e0b"
},
"footer": {
"about_text": "Loja oficial da marca — nota fiscal em todos os pedidos e envio para todo o Brasil."
}
}'Types: announcement (one at most, always first), hero, benefits, category_grid, product_grid, promo_banner, testimonials, faq, newsletter, rich_text. Categories and collections referenced by the settings must exist. Returns the theme plus section_id. Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| typeObrigatório | string | Section type. Valores: announcementherobenefitscategory_gridproduct_gridpromo_bannertestimonialsfaqnewsletterrich_text |
| settings | object | Settings of the section type, snake_case. The design guide (tfshop://design-guide on MCP, /developers/mcp) lists each type's fields: announcement{text,link}; hero{eyebrow,title,subtitle,cta_label,cta_href,layout,art,image}; benefits{items[{icon,title,text}]}; category_grid{title,category_ids,layout}; product_grid{title,source,category_id,collection_id,limit,layout}; promo_banner{title,text,cta_label,cta_href,tone,image}; testimonials{title,items[{name,city,text,rating}]}; faq{title,items[{question,answer}]}; newsletter{title,text}; rich_text{title,body,style}. Omitted fields take the Brazilian Portuguese defaults; lists (items, category_ids) are sent whole. |
| enabled | boolean | Default true. |
| after_section_id | string | null | Insert after this section; null = first page section. Omitted = at the end. The announcement bar is always first. |
| index | integer | Position among the page sections (0 = first after the announcement bar); ignored when after_section_id is sent. |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/theme/sections" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"type": "faq",
"settings": {
"title": "Dúvidas frequentes",
"items": [
{
"question": "Qual o prazo de entrega?",
"answer": "Até 5 dias úteis para capitais; informe o CEP no carrinho para ver o prazo exato."
}
]
}
}'Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| section_idcaminhoObrigatório | string | Section id (sec_…) from the theme. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| settings | object | Fields to change: they merge into the current settings; lists (items, category_ids) replace whole. |
| enabled | boolean | Show or hide the section. |
| after_section_id | string | null | Move after this section; null = first page section. |
| index | integer | Move to this position among the page sections. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}Erros:sandbox_read_only
curl -X PATCH "https://api.tfshop.cloud/v1/theme/sections/{section_id}" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"settings": {
"title": "Perguntas frequentes"
},
"index": 0
}'The previous theme stays restorable as a version.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| section_idcaminhoObrigatório | string | Section id (sec_…) from the theme. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}Erros:sandbox_read_only
curl -X DELETE "https://api.tfshop.cloud/v1/theme/sections/{section_id}" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → ThemeVersion[] | Up to 10 versions, newest first. |
Exemplo
{
"data": [
{
"id": "string",
"saved_at": "2026-10-29T13:05:12.000Z",
"saved_by": "string",
"source": "admin",
"preset_id": "string",
"section_count": 0,
"sections": [
{
"id": null,
"type": null,
"enabled": null,
"summary": null
}
]
}
]
}curl "https://api.tfshop.cloud/v1/theme/versions" \
-H "Authorization: Bearer $TFSHOP_TOKEN"/ theme/ versions/ {version_id}/ restoreRestore a previous theme version
The current theme is kept as a new version first.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| version_idcaminhoObrigatório | string | Theme version id (thv_…). |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
Exemplo
{
"preset_id": "volt",
"tokens": {
"primary": "string",
"primary_text": "string",
"accent": "string",
"background": "string",
"surface": "string",
"text": "string",
"muted_text": "string",
"header_background": "string",
"header_text": "string",
"radius": "none",
"heading_font": "inter",
"body_font": "inter"
},
"sections": [
{
"id": "string",
"type": "announcement",
"enabled": false,
"settings": {}
}
],
"header": {
"show_search": false,
"menu_category_ids": null
},
"footer": {
"about_text": "string",
"show_payment_icons": false
},
"product": {
"show_pix_price": false,
"show_installments": false,
"show_shipping_calculator": false,
"show_whatsapp_button": false
},
"identity": {
"logo_max_height": 0
},
"storefront_url": "string",
"versions": 0
}Erros:sandbox_read_only
curl -X POST "https://api.tfshop.cloud/v1/theme/versions/{version_id}/restore" \
-H "Authorization: Bearer $TFSHOP_TOKEN"automatic = true while the store has no custom menus: they then derive from categories, collections, pages and policies.
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| headerObrigatório | → MenuItem[] | Header menu (up to 12 items with up to 20 children each). |
| footerObrigatório | → MenuItem[] | Footer columns (up to 5 headings with up to 12 links each). |
| automaticObrigatório | boolean | true while the store has no custom menus: header and footer are derived from categories, collections, pages and policies. |
Exemplo
{
"header": [
{
"id": "string",
"label": "string",
"target": null,
"children": []
}
],
"footer": [
{
"id": "string",
"label": "string",
"target": null,
"children": []
}
],
"automatic": false
}curl "https://api.tfshop.cloud/v1/menus" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Targets must exist in the store (category, collection and page ids; policy slugs). A part left out keeps the current menu.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| header | object[] | Header menu (≤ 12 items). Omitted = unchanged. |
| id | string | Keep an existing item's id to preserve it; omitted = new id. |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget | |
| children | object[] | Sub-items (header) or the links of a footer column. |
| id | string | Existing id or omitted. |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget | |
| footer | object[] | Footer columns (≤ 5). Omitted = unchanged. |
| id | string | Keep an existing item's id to preserve it; omitted = new id. |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget | |
| children | object[] | Sub-items (header) or the links of a footer column. |
| id | string | Existing id or omitted. |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| headerObrigatório | → MenuItem[] | Header menu (up to 12 items with up to 20 children each). |
| footerObrigatório | → MenuItem[] | Footer columns (up to 5 headings with up to 12 links each). |
| automaticObrigatório | boolean | true while the store has no custom menus: header and footer are derived from categories, collections, pages and policies. |
Exemplo
{
"header": [
{
"id": "string",
"label": "string",
"target": null,
"children": []
}
],
"footer": [
{
"id": "string",
"label": "string",
"target": null,
"children": []
}
],
"automatic": false
}Erros:sandbox_read_only
curl -X PUT "https://api.tfshop.cloud/v1/menus" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"header": [
{
"label": "Início",
"target": {
"type": "home"
}
},
{
"label": "Fones",
"target": {
"type": "category",
"id": "cat_audio"
}
},
{
"label": "Atacado",
"target": {
"type": "wholesale"
}
}
]
}'Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| limitconsulta | integer | Page size, 1–100 (default 50). |
| cursorconsulta | string | Opaque cursor from next_cursor. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| dataObrigatório | → Page[] | Page of Page objects. |
| next_cursorObrigatório | string | null | Cursor of the next page; null on the last page. |
Exemplo
{
"data": [
{
"id": "string",
"slug": "string",
"title": "string",
"body": "string",
"published": false,
"url": "string",
"first_published_at": "2026-10-29T13:05:12.000Z",
"updated_at": "2026-10-29T13:05:12.000Z"
}
],
"next_cursor": "string"
}curl "https://api.tfshop.cloud/v1/pages?limit=50" \
-H "Authorization: Bearer $TFSHOP_TOKEN"Unpublished unless published is true. Send an Idempotency-Key header to retry safely (only 2xx responses are stored; after fixing an error, retry with the same key).
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| titleObrigatório | string | Title (≤ 80 characters). |
| bodyObrigatório | string | Rich text (≤ 20 000 characters): blank-line paragraphs, '## ' headings, '- ' lists, bold, text. |
| published | boolean | Default false. |
| slug | string | Optional; generated from the title when omitted.^[a-z0-9]+(?:-[a-z0-9]+)*$ |
Resposta 201
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Page id. |
| slugObrigatório | string | URL slug, frozen after the first publish. |
| titleObrigatório | string | Title (≤ 80 characters). |
| bodyObrigatório | string | Rich text: blank-line paragraphs, '## ' headings, '- ' lists, bold, text. No HTML. |
| publishedObrigatório | boolean | Visible in the storefront. |
| urlObrigatório | string | Public URL (/pagina/{slug}). |
| first_published_atObrigatório | string | null (date-time) | First publish; null while never published. |
| updated_atObrigatório | string (date-time) | Last change. |
Exemplo
{
"id": "string",
"slug": "string",
"title": "string",
"body": "string",
"published": false,
"url": "string",
"first_published_at": "2026-10-29T13:05:12.000Z",
"updated_at": "2026-10-29T13:05:12.000Z"
}Erros:sandbox_read_onlyidempotency_key_reuse
curl -X POST "https://api.tfshop.cloud/v1/pages" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f0b7c1e-8d2a-4c55-9a7e-1b2c3d4e5f60" \
-d '{
"title": "Sobre nós",
"body": "## Quem somos\n\nSomos uma loja de Campinas, SP, com entrega para todo o Brasil.",
"published": true
}'The slug is frozen after the first publish. Pages are not deleted through the API: unpublish them.
Parâmetros
| Campo | Tipo | Descrição |
|---|---|---|
| page_idcaminhoObrigatório | string | Page id. |
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| title | string | Title (≤ 80 characters). |
| body | string | Rich text (≤ 20 000 characters). |
| published | boolean | Publish or unpublish. |
| slug | string | Only while the page was never published. |
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Page id. |
| slugObrigatório | string | URL slug, frozen after the first publish. |
| titleObrigatório | string | Title (≤ 80 characters). |
| bodyObrigatório | string | Rich text: blank-line paragraphs, '## ' headings, '- ' lists, bold, text. No HTML. |
| publishedObrigatório | boolean | Visible in the storefront. |
| urlObrigatório | string | Public URL (/pagina/{slug}). |
| first_published_atObrigatório | string | null (date-time) | First publish; null while never published. |
| updated_atObrigatório | string (date-time) | Last change. |
Exemplo
{
"id": "string",
"slug": "string",
"title": "string",
"body": "string",
"published": false,
"url": "string",
"first_published_at": "2026-10-29T13:05:12.000Z",
"updated_at": "2026-10-29T13:05:12.000Z"
}Erros:sandbox_read_only
curl -X PATCH "https://api.tfshop.cloud/v1/pages/{page_id}" \
-H "Authorization: Bearer $TFSHOP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "string",
"body": "string",
"published": false,
"slug": "string"
}'Esquemas compartilhados
Objetos usados em várias respostas. Os campos marcados com → apontam para outro esquema.
ThemeTokens
| Campo | Tipo | Descrição |
|---|---|---|
| primaryObrigatório | string | Brand colour, hex (#3b5bfd). |
| primary_textObrigatório | string | Text on the brand colour, hex. |
| accentObrigatório | string | Accent colour, hex. |
| backgroundObrigatório | string | Page background, hex. |
| surfaceObrigatório | string | Card background, hex. |
| textObrigatório | string | Body text, hex. |
| muted_textObrigatório | string | Secondary text, hex. |
| header_backgroundObrigatório | string | Header background, hex. |
| header_textObrigatório | string | Header text, hex. |
| radiusObrigatório | string | Corner radius. Valores: nonesmmdlg |
| heading_fontObrigatório | string | Heading font. Valores: interjakartagrotesk |
| body_fontObrigatório | string | Body font. Valores: interjakartagrotesk |
ThemeSection
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Section id (sec_…). |
| typeObrigatório | string | Section type. Valores: announcementherobenefitscategory_gridproduct_gridpromo_bannertestimonialsfaqnewsletterrich_text |
| enabledObrigatório | boolean | Rendered when true; false hides the section without losing it. |
| settingsObrigatório | object | Settings of the section type, snake_case. The design guide (tfshop://design-guide on MCP, /developers/mcp) lists each type's fields: announcement{text,link}; hero{eyebrow,title,subtitle,cta_label,cta_href,layout,art,image}; benefits{items[{icon,title,text}]}; category_grid{title,category_ids,layout}; product_grid{title,source,category_id,collection_id,limit,layout}; promo_banner{title,text,cta_label,cta_href,tone,image}; testimonials{title,items[{name,city,text,rating}]}; faq{title,items[{question,answer}]}; newsletter{title,text}; rich_text{title,body,style}. |
Theme
| Campo | Tipo | Descrição |
|---|---|---|
| preset_idObrigatório | string | Base preset. Valores: voltcleanmodaatacadocasabeleza |
| tokensObrigatório | → ThemeTokens | |
| sectionsObrigatório | → ThemeSection[] | Home page sections in display order. The announcement bar (one at most) renders in the header and always comes first. |
| headerObrigatório | object | |
| show_searchObrigatório | boolean | Search box in the header. |
| menu_category_idsObrigatório | any | "all", or category ids: the automatic header menu while the store has no custom menus. |
| footerObrigatório | object | |
| about_textObrigatório | string | Short text about the store in the footer. |
| show_payment_iconsObrigatório | boolean | Pix / card / boleto icons in the footer. |
| productObrigatório | object | |
| show_pix_priceObrigatório | boolean | Pix price with discount on product pages. |
| show_installmentsObrigatório | boolean | Instalment line on product pages. |
| show_shipping_calculatorObrigatório | boolean | CEP shipping calculator on product pages. |
| show_whatsapp_buttonObrigatório | boolean | WhatsApp button on product pages. |
| identity | object | |
| logo_max_height | integer | Max logo height in the header, px (24–96). |
| storefront_urlObrigatório | string | Public URL of the storefront — open it to see the result. |
| versionsObrigatório | integer | Previous versions available to restore (up to 10). |
ThemeVersion
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Version id (thv_…). |
| saved_atObrigatório | string (date-time) | When this version was replaced. |
| saved_byObrigatório | string | Who replaced it: a merchant user, or "<app> (API)". |
| sourceObrigatório | string | Where the change came from. Valores: adminapi |
| preset_idObrigatório | string | Preset of that version. |
| section_countObrigatório | integer | Sections in that version. |
| sectionsObrigatório | object[] | Sections of that version, in order. |
| idObrigatório | string | Section id. |
| typeObrigatório | string | Section type. |
| enabledObrigatório | boolean | Enabled. |
| summaryObrigatório | string | One-line summary (title / text). |
MenuTarget
| Campo | Tipo | Descrição |
|---|---|---|
| typeObrigatório | string | Target kind. Valores: homesearchcategorycollectionpagepolicywholesaleurl |
| id | string | Category / collection / page id (for those types). |
| slug | string | Policy slug: trocas | entrega | privacidade | termos. |
| href | string | URL target: https://…, a store path (/categoria/…), # or empty for a heading without a link. |
MenuSubItem
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Item id (mi_…). |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget |
MenuItem
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Item id (mi_…). |
| labelObrigatório | string | Label (≤ 40 characters). |
| targetObrigatório | → MenuTarget | |
| children | → MenuSubItem[] | Sub-items (header drop-down) or the links of a footer column. |
Menus
| Campo | Tipo | Descrição |
|---|---|---|
| headerObrigatório | → MenuItem[] | Header menu (up to 12 items with up to 20 children each). |
| footerObrigatório | → MenuItem[] | Footer columns (up to 5 headings with up to 12 links each). |
| automaticObrigatório | boolean | true while the store has no custom menus: header and footer are derived from categories, collections, pages and policies. |
Page
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Page id. |
| slugObrigatório | string | URL slug, frozen after the first publish. |
| titleObrigatório | string | Title (≤ 80 characters). |
| bodyObrigatório | string | Rich text: blank-line paragraphs, '## ' headings, '- ' lists, bold, text. No HTML. |
| publishedObrigatório | boolean | Visible in the storefront. |
| urlObrigatório | string | Public URL (/pagina/{slug}). |
| first_published_atObrigatório | string | null (date-time) | First publish; null while never published. |
| updated_atObrigatório | string (date-time) | Last change. |
Store
The store a token belongs to. Read it first: the NF-e issuer and the legal entity decide which operations apply.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Store id (st_…). The token belongs to exactly one store. |
| nameObrigatório | string | Store name shown to shoppers. |
| slugObrigatório | string | Store slug ({slug}.tfshop.cloud and /s/{slug}). |
| urlObrigatório | string (uri) | Public storefront URL (primary domain). |
| statusObrigatório | string | draft (not public yet), published or paused. Valores: draftpublishedpaused |
| domainsObrigatório | object[] | Domains of the storefront. |
| hostnameObrigatório | string | Hostname. |
| typeObrigatório | string | subdomain (free) or custom. Valores: subdomaincustom |
| statusObrigatório | string | DNS / certificate status. Valores: pending_dnsverifyingactiveerror |
| primaryObrigatório | boolean | The canonical storefront address. |
| legalObrigatório | object | |
| nameObrigatório | string | Legal name (razão social). |
| documentObrigatório | string | CNPJ (14 characters) or CPF (11 digits) of the seller, without punctuation. NF-e issuer (emit) when the store issues through TF Fiscal. |
| document_typeObrigatório | string | cnpj or cpf. Valores: cnpjcpf |
| state_registrationObrigatório | string | null | Inscrição estadual (IE), digits only, or null. |
| addressObrigatório | object | Seller address (shown in the storefront footer, Decreto 7.962/2013). |
| zipObrigatório | string | CEP, 8 digits.^\d{8}$ |
| streetObrigatório | string | Logradouro. |
| numberObrigatório | string | Número. |
| complementObrigatório | string | null | Complemento. |
| districtObrigatório | string | Bairro. |
| cityObrigatório | string | Município. |
| stateObrigatório | string | UF.^[A-Z]{2}$ |
| countryObrigatório | string | ISO 3166-1 alpha-2. Valores: BR |
| ibge_codeObrigatório | string | null | 7-digit IBGE municipality code, or null when unknown. |
| emailObrigatório | string | Customer-service e-mail. |
| phoneObrigatório | string | Phone in E.164 (+55…), or empty. |
| currencyObrigatório | string | Always BRL. Valores: BRL |
| timezoneObrigatório | string | Always America/Sao_Paulo. Valores: America/Sao_Paulo |
| localeObrigatório | string | Always pt-BR. Valores: pt-BR |
| invoice_issuerObrigatório | string | Who issues the NF-e: tf_fiscal (the store) or erp (apps post it with POST /orders/{order_id}/invoices). Valores: tf_fiscalerp |
| sales_mode | string | How the storefront sells: online (checkout paid through C6), orcamento (orders may be sent with the payment arranged with the store — payment.method offline) or catalogo (prices only, no storefront orders). Valores: onlineorcamentocatalogo |
| planObrigatório | object | |
| idObrigatório | string | Plan id. Valores: startbusinessadvancedenterprise |
| nameObrigatório | string | Plan name. |
| limitsObrigatório | object | |
| productsObrigatório | integer | null | Max products; null = unlimited. |
| staffObrigatório | integer | null | Max staff users; null = unlimited. |
| storesObrigatório | integer | Stores included. |
| orders_per_monthObrigatório | integer | null | Max orders per month; null = unlimited. |
| storage_gbObrigatório | integer | Media storage in GB. |
| payment_methodsObrigatório | object | Methods the store's C6 account accepts at checkout. |
| pixObrigatório | boolean | Pix enabled. |
| credit_cardObrigatório | boolean | Credit card enabled. |
| boletoObrigatório | boolean | Boleto enabled. |
| shipping_origin_cepObrigatório | string | null | CEP the parcels ship from (8 digits), or null when not configured. |
| created_atObrigatório | string (date-time) | Creation time. |
| published_atObrigatório | string | null (date-time) | When the store went live, or null. |
Exemplo
{
"id": "st_volt",
"name": "VoltShop",
"slug": "voltshop",
"url": "https://www.voltshop.com.br",
"status": "published",
"domains": [
{
"hostname": "voltshop.tfshop.cloud",
"type": "subdomain",
"status": "active",
"primary": false
},
{
"hostname": "www.voltshop.com.br",
"type": "custom",
"status": "active",
"primary": true
}
],
"legal": {
"name": "Volt Comércio de Eletrônicos Ltda",
"document": "11222333000181",
"document_type": "cnpj",
"state_registration": "123456789110",
"address": {
"zip": "03016000",
"street": "Rua Oriente",
"number": "320",
"complement": "Loja 4",
"district": "Brás",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"ibge_code": "3550308"
},
"email": "atendimento@voltshop.com.br",
"phone": "+551133112200"
},
"currency": "BRL",
"timezone": "America/Sao_Paulo",
"locale": "pt-BR",
"invoice_issuer": "tf_fiscal",
"plan": {
"id": "business",
"name": "Business",
"limits": {
"products": null,
"staff": 5,
"stores": 1,
"orders_per_month": null,
"storage_gb": 20
}
},
"payment_methods": {
"pix": true,
"credit_card": true,
"boleto": true
},
"shipping_origin_cep": "03016000",
"created_at": "2026-09-13T15:00:00.000Z",
"published_at": "2026-09-20T12:00:00.000Z"
}Problem
RFC 9457 problem details, served as application/problem+json.
| Campo | Tipo | Descrição |
|---|---|---|
| typeObrigatório | string (uri) | URL of the problem type (https://developers.tfshop.cloud/errors/<slug>). |
| titleObrigatório | string | Short summary of the problem type. |
| statusObrigatório | integer | HTTP status. |
| detail | string | What went wrong with this request. |
| instance | string | Request id (req_…), also in the X-Request-Id header. |
| errors | object[] | Field errors (validation_failed). |
| fieldObrigatório | string | JSON path of the field (items[2].sku). |
| messageObrigatório | string | Why it is invalid. |
Exemplo
{
"type": "https://developers.tfshop.cloud/errors/insufficient_scope",
"title": "The token lacks the scope this operation requires",
"status": 403,
"detail": "This operation requires the invoices:write scope.",
"instance": "req_Xk2mP9qL0aZt3w"
}Address
Brazilian address. Without orders.pii:read, street, number, complement and district are masked and the CEP keeps only its first 5 digits.
| Campo | Tipo | Descrição |
|---|---|---|
| zipObrigatório | string | CEP, 8 digits.^\d{8}$ |
| streetObrigatório | string | Logradouro. |
| numberObrigatório | string | Número (may be "S/N"). |
| complement | string | null | Complemento. |
| districtObrigatório | string | Bairro. |
| cityObrigatório | string | Município. |
| stateObrigatório | string | UF.^[A-Z]{2}$ |
| countryObrigatório | string | ISO 3166-1 alpha-2. Valores: BR |
| ibge_code | string | null | 7-digit IBGE municipality code (NF-e cMun); null when unknown.^\d{7}$ |
Buyer
NF-e recipient (dest).
| Campo | Tipo | Descrição |
|---|---|---|
| typeObrigatório | string | PF (person) or PJ (company). Valores: PFPJ |
| nameObrigatório | string | Name or company name. |
| documentObrigatório | string | CPF (11 digits) or CNPJ (14 characters, may be alphanumeric), without punctuation. |
| document_typeObrigatório | string | cpf or cnpj. Valores: cpfcnpj |
| emailObrigatório | string | E-mail. |
| phoneObrigatório | string | Phone in E.164 (+55…). |
| state_registrationObrigatório | string | null | Inscrição estadual (IE), when informed. |
| ie_indicatorObrigatório | integer | NF-e indIEDest: 1 contribuinte, 2 isento, 9 não contribuinte (always 9 for PF). Valores: 129 |
| maskedObrigatório | boolean | True when the token lacks orders.pii:read: name, document, e-mail and phone are masked. |
OrderLine
| Campo | Tipo | Descrição |
|---|---|---|
| line_idObrigatório | string | Stable line id ({order_id}:{n}), referenced by partial invoices, fulfillments and refunds. |
| product_idObrigatório | string | Product id. |
| variant_idObrigatório | string | Variant id. |
| skuObrigatório | string | SKU (the mapping key between the store and the ERP). |
| titleObrigatório | string | Product title at the time of the order. |
| variant_titleObrigatório | string | Variant title ("Preto / 2 m"). |
| quantityObrigatório | integer | Quantity. ≥ 1 |
| unit_priceObrigatório | integer | Unit price charged (wholesale / member price when applicable). In centavos. ≥ 0 |
| list_priceObrigatório | integer | Retail unit price before wholesale / member pricing. In centavos. ≥ 0 |
| discount_allocatedObrigatório | integer | Order discount allocated to the line (coupon + Pix), pro rata; the lines add up to the order discount. NF-e vDesc. In centavos. ≥ 0 |
| freight_allocatedObrigatório | integer | Order freight allocated to the line, pro rata; the lines add up to the order freight. NF-e vFrete. In centavos. ≥ 0 |
| totalObrigatório | integer | unit_price × quantity − discount_allocated + freight_allocated. In centavos. ≥ 0 |
| price_typeObrigatório | string | Which price unit_price is: varejo (retail), membro (customer group list) or atacado (wholesale tier / package price). Valores: varejomembroatacado |
| packagingObrigatório | object | null | The sales package this line was bought in (quantity stays in pieces), or null for loose pieces. |
| idObrigatório | string | Package id (Product.packagings). |
| unitObrigatório | string | Kind of package. Valores: duziameia_duziacaixapacotefardodisplaykitoutro |
| labelObrigatório | string | null | Own name, when the package has one. |
| nameObrigatório | string | Display name at the time of the order ("Dúzia", "Caixa c/ 12"). |
| piecesObrigatório | integer | Pieces per package. ≥ 2 |
| packagesObrigatório | integer | Packages bought on this line (quantity ÷ pieces). |
| fillObrigatório | string | single / mix / assorted. Valores: singlemixassorted |
| axisObrigatório | string | null | Mixed option ("Cor"), or null. |
| ncmObrigatório | string | null | NCM from the store's product data, as a hint (8 digits). Optional: the ERP's fiscal data prevails.^\d{8}$ |
| cestObrigatório | string | null | CEST hint (7 digits). |
| originObrigatório | integer | Origem da mercadoria (0–8) hint. 0 a 8 |
| gtinObrigatório | string | null | GTIN/EAN of the variant. |
OrderShipping
| Campo | Tipo | Descrição |
|---|---|---|
| carrierObrigatório | string | Carrier (Correios, Jadlog, Loggi…). |
| serviceObrigatório | string | Service (PAC, SEDEX, .Package…). |
| priceObrigatório | integer | Freight charged to the buyer. In centavos. ≥ 0 |
| business_daysObrigatório | integer | Quoted transit time in business days. |
| tracking_codeObrigatório | string | null | Tracking code once a label exists. |
| tracking_urlObrigatório | string | null | Public tracking page. |
Payment
Money goes straight to the merchant's own C6 account; refunds are made by the store.
| Campo | Tipo | Descrição |
|---|---|---|
| methodObrigatório | string | Payment method. offline = arranged with the store outside the checkout (orçamento sales mode); confirmed by the merchant. Valores: pixcredit_cardboletooffline |
| statusObrigatório | string | Payment status. Valores: createdpendingconfirmedfailedexpiredcancelledrefund_pendingrefundedpartially_refunded |
| paid_atObrigatório | string | null (date-time) | When the payment was confirmed. |
| installmentsObrigatório | integer | Number of installments (1 for Pix and boleto). ≥ 1 |
| nfe_payment_codeObrigatório | string | NF-e tPag: 17 Pix dinâmico, 03 cartão de crédito, 15 boleto. Valores: 170315 |
| card_brand | string | null | Card brand (visa, mastercard, elo, amex, hipercard). |
| nfe_card_brand | string | null | NF-e tBand (01 Visa, 02 Mastercard, 03 Amex, 06 Elo, 07 Hipercard, 99 other). |
| card_last4 | string | null | Last 4 digits of the card. |
| acquirer_cnpj | string | null | CNPJ of the payment institution (NF-e card group CNPJ). Card and Pix only. |
| authorization_code | string | null | Card authorisation code (NF-e cAut). |
| pix_end_to_end_id | string | null | Pix end-to-end id (E + ISPB + timestamp + sequence). |
| providerObrigatório | string | Payment provider: c6, or manual when the merchant marked it as paid. Valores: c6manual |
| provider_payment_id | string | null | Payment id at the provider. |
FiscalHints
| Campo | Tipo | Descrição |
|---|---|---|
| ind_presObrigatório | integer | NF-e indPres: 2 = internet. Valores: 2 |
| ind_intermedObrigatório | integer | NF-e indIntermed: 0 = own website (no marketplace intermediary). Valores: 01 |
| ind_finalObrigatório | integer | NF-e indFinal: 1 consumidor final, 0 resale (wholesale buyer buying to resell). Valores: 01 |
Invoice
| Campo | Tipo | Descrição |
|---|---|---|
| order_idObrigatório | string | Order id. |
| numberObrigatório | integer | NF-e number (nNF). |
| seriesObrigatório | integer | NF-e series. |
| access_keyObrigatório | string | 44-digit access key (chave de acesso).^\d{6}[0-9A-Z]{14}\d{24}$ |
| issued_atObrigatório | string (date-time) | Issue date. |
| sourceObrigatório | string | tf_fiscal (issued by the store) or erp (posted by an app). Valores: tf_fiscalerp |
| statusObrigatório | string | authorized or cancelled. Valores: authorizedcancelled |
| xml_urlObrigatório | string | null | Authorised XML. |
| danfe_urlObrigatório | string | null | DANFE PDF. |
Exemplo
{
"order_id": "o_2005",
"number": 1501,
"series": 1,
"access_key": "35261011222333000181550010000150011000150019",
"issued_at": "2026-10-28T14:10:00.000Z",
"source": "erp",
"status": "authorized",
"xml_url": "https://erp.exemplo.com.br/nfe/35261011222333000181550010000150011000150019.xml",
"danfe_url": null
}OrderExportStatus
This app's export acknowledgement (each app has its own).
| Campo | Tipo | Descrição |
|---|---|---|
| acknowledged_atObrigatório | string (date-time) | When this app acknowledged the order. |
| external_idObrigatório | string | null | Order id in the app's system. |
Order
NF-e-ready order payload.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Order id (immutable). Use it as the unique key in your system. |
| numberObrigatório | integer | Order number shown to the buyer and the merchant (#1011). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change (latest timeline entry). Use with updated_since. |
| statusObrigatório | string | Order status. Valores: pending_paymentpaidfulfillingfulfilledcancelledexpiredreturn_requestedrefundedpartially_refunded |
| payment_statusObrigatório | string | Payment status (see Payment.status). |
| fulfillment_statusObrigatório | string | Fulfillment status. Valores: unfulfilledlabel_purchasedshippeddeliveredreturned |
| invoice_statusObrigatório | string | NF-e status. Valores: not_requiredpendingauthorizederrorcancelled |
| testObrigatório | boolean | Test order placed by the merchant: never issue an NF-e for it. |
| channelObrigatório | string | Sales channel. Valores: online_storewhatsappmanualvendedormercado_livreshopeetiktok_shop |
| sale_typeObrigatório | string | varejo (retail) or atacado (wholesale: the buyer had wholesale prices and the cart met the store's wholesale rules). Valores: varejoatacado |
| currencyObrigatório | string | Always BRL. Valores: BRL |
| subtotalObrigatório | integer | Sum of the lines (unit_price × quantity). In centavos. ≥ 0 |
| discountObrigatório | integer | Coupon + Pix discount. In centavos. ≥ 0 |
| shipping_totalObrigatório | integer | Freight charged (same as shipping.price). In centavos. ≥ 0 |
| totalObrigatório | integer | subtotal − discount + shipping_total. In centavos. ≥ 0 |
| refundedObrigatório | integer | Refunded so far. In centavos. ≥ 0 |
| buyerObrigatório | → Buyer | NF-e recipient (dest). |
| shipping_addressObrigatório | → Address | Brazilian address. Without orders.pii:read, street, number, complement and district are masked and the CEP keeps only its first 5 digits. |
| billing_addressObrigatório | → Address | Same as the shipping address in v1 (the checkout has a single address). |
| linesObrigatório | → OrderLine[] | Order lines. |
| shippingObrigatório | → OrderShipping | |
| paymentObrigatório | → Payment | Money goes straight to the merchant's own C6 account; refunds are made by the store. |
| fiscal_hintsObrigatório | → FiscalHints | |
| invoiceObrigatório | → Invoice | null | Current NF-e, or null. |
| exportObrigatório | → OrderExportStatus | null | This app's acknowledgement, or null when not yet imported. |
Exemplo
{
"id": "o_1011",
"number": 1011,
"created_at": "2026-10-26T12:00:00.000Z",
"updated_at": "2026-10-26T12:00:00.000Z",
"status": "paid",
"payment_status": "confirmed",
"fulfillment_status": "unfulfilled",
"invoice_status": "pending",
"test": false,
"channel": "online_store",
"sale_type": "varejo",
"currency": "BRL",
"subtotal": 19990,
"discount": 0,
"shipping_total": 0,
"total": 19990,
"refunded": 0,
"buyer": {
"type": "PF",
"name": "Juliana Martins",
"document": "12345678909",
"document_type": "cpf",
"email": "juliana@exemplo.com.br",
"phone": "+5519981234567",
"state_registration": null,
"ie_indicator": 9,
"masked": false
},
"shipping_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"billing_address": {
"zip": "13010111",
"street": "Rua Barão de Jaguara",
"number": "100",
"complement": null,
"district": "Centro",
"city": "Campinas",
"state": "SP",
"country": "BR",
"ibge_code": "3509502"
},
"lines": [
{
"line_id": "o_1011:1",
"product_id": "p_pb_20k",
"variant_id": "p_pb_20k_v1",
"sku": "VLT-PB20K",
"title": "Power Bank 20.000 mAh 22,5W",
"variant_title": "Padrão",
"quantity": 1,
"unit_price": 19990,
"list_price": 19990,
"price_type": "varejo",
"packaging": null,
"discount_allocated": 0,
"freight_allocated": 0,
"total": 19990,
"ncm": "85076000",
"cest": null,
"origin": 2,
"gtin": "7891000079190"
}
],
"shipping": {
"carrier": "Correios",
"service": "SEDEX",
"price": 0,
"business_days": 2,
"tracking_code": null,
"tracking_url": null
},
"payment": {
"method": "credit_card",
"status": "confirmed",
"paid_at": "2026-10-26T12:00:00.000Z",
"installments": 2,
"nfe_payment_code": "03",
"card_brand": "visa",
"nfe_card_brand": "01",
"card_last4": "8407",
"acquirer_cnpj": "31872495000172",
"authorization_code": "482913",
"pix_end_to_end_id": null,
"provider": "c6",
"provider_payment_id": "c6_card_1011"
},
"fiscal_hints": {
"ind_pres": 2,
"ind_intermed": 0,
"ind_final": 1
},
"invoice": null,
"export": {
"acknowledged_at": "2026-10-26T12:05:00.000Z",
"external_id": "11011"
}
}InventoryLevel
| Campo | Tipo | Descrição |
|---|---|---|
| skuObrigatório | string | SKU. |
| variant_idObrigatório | string | Variant id. |
| product_idObrigatório | string | Product id. |
| on_handObrigatório | integer | Units in stock. ≥ 0 |
| reservedObrigatório | integer | Units held by unpaid Pix / boleto orders. ≥ 0 |
| availableObrigatório | integer | on_hand − reserved (never below 0): what the storefront sells. ≥ 0 |
| updated_atObrigatório | string (date-time) | Last stock change. |
Exemplo
{
"sku": "VLT-GAN65W",
"variant_id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"on_hand": 42,
"reserved": 1,
"available": 41,
"updated_at": "2026-10-28T13:05:12.000Z"
}WholesaleTier
| Campo | Tipo | Descrição |
|---|---|---|
| min_qtyObrigatório | integer | From this many pieces on (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price of the tier. In centavos. ≥ 0 |
WholesalePack
"Grade fechada": a fixed size mix sold per colour.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Pack id (set by the store when created without one). |
| nameObrigatório | string | Name shown to buyers ("Grade P-M-G-GG (1-2-2-1)"). |
| axisObrigatório | string | Option the composition refers to ("Tamanho"). |
| compositionObrigatório | map<integer> | Pieces per option value ({"P": 1, "M": 2, "G": 2, "GG": 1}). |
Wholesale
Wholesale (atacado) pricing of the product. Who gets wholesale prices and how quantities are counted are store settings (not in the API).
| Campo | Tipo | Descrição |
|---|---|---|
| enabledObrigatório | boolean | Wholesale prices offered for this product (tiers, MOQ and multiples are kept when false). |
| tiersObrigatório | → WholesaleTier[] | Quantity tiers (up to 5): min_qty ascending, unit_price descending. máx. 5 |
| min_qtyObrigatório | integer | null | Minimum pieces of this product to get any wholesale price, or null. ≥ 1 |
| multipleObrigatório | integer | null | Sold in multiples of this many pieces ("caixa com 10"), or null. ≥ 2 |
| packsObrigatório | → WholesalePack[] | Fixed size packs ("grade fechada"). |
PackagingTier
| Campo | Tipo | Descrição |
|---|---|---|
| min_packagesObrigatório | integer | From this many packages of this kind on (2 or more). ≥ 2 |
| unit_priceObrigatório | integer | Per-piece price from that quantity on. In centavos. ≥ 0 |
Packaging
A sales package (dúzia, caixa, fardo…). Order lines bought in a package carry it in packaging; quantities are always pieces.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Package id (pkg_…), set by the store when created without one. Order lines reference it. |
| unitObrigatório | string | Kind of package. dúzia = 12 pieces, meia dúzia = 6; the others take pieces.Valores: duziameia_duziacaixapacotefardodisplaykitoutro |
| labelObrigatório | string | null | Own name ("Caixa master"); required for unit "outro". |
| nameObrigatório | string | Display name ("Dúzia", "Caixa c/ 24", own label). |
| piecesObrigatório | integer | Pieces per package (2–10000). 2 a 10000 |
| unit_priceObrigatório | integer | null | Per-piece price inside the package, or null = the product's usual price (retail, group list, wholesale tiers). Buyers always get the lower one. ≥ 1 |
| tiersObrigatório | → PackagingTier[] | Lower per-piece prices from N packages on (needs unit_price; up to 3). máx. 3 |
| fillObrigatório | string | single = one variant per package; mix = the buyer fills it with the values of axis; assorted = the store fills it ("cores sortidas").Valores: singlemixassorted |
| axisObrigatório | string | null | mix / assorted: the option whose values are mixed ("Cor"); null = all variants mix. |
| wholesale_onlyObrigatório | boolean | Only buyers with wholesale prices see and buy it. |
Variant
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Variant id. |
| product_idObrigatório | string | Product id. |
| skuObrigatório | string | SKU, unique in the store. |
| titleObrigatório | string | "Preto / 2 m" ("Padrão" for products without options). |
| optionsObrigatório | map<string> | Option values by option name ({"Cor": "Preto"}). |
| priceObrigatório | integer | Retail price. In centavos. ≥ 0 |
| compare_at_priceObrigatório | integer | null | "De" price shown struck through (centavos), or null. ≥ 0 |
| gtinObrigatório | string | null | GTIN/EAN. |
| image_urlObrigatório | string | null | Photo of this variant (absolute URL), or null. |
| inventoryObrigatório | object | |
| on_handObrigatório | integer | Units in stock. |
| reservedObrigatório | integer | Units held by unpaid orders. |
| availableObrigatório | integer | on_hand − reserved. |
Category
Store categories (up to 3 levels). Products reference the id in category_id.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Category id. |
| parent_idObrigatório | string | null | Parent category id; null at the top level. |
| nameObrigatório | string | Name. |
| pathObrigatório | string[] | Names from the top level down to this category. |
| slugObrigatório | string | URL slug, unique in the store. |
| positionObrigatório | integer | Order among siblings. |
| visibleObrigatório | boolean | Hidden categories stay in the admin but not in the storefront. |
| default_ncmObrigatório | string | null | NCM suggested for new products in this branch, or null. |
Exemplo
{
"id": "cat_chargers",
"parent_id": "cat_v_charging",
"name": "Carregadores",
"path": [
"Celulares e acessórios",
"Carregadores e cabos",
"Carregadores"
],
"slug": "carregadores",
"position": 0,
"visible": true,
"default_ncm": "85044010"
}Product
The store is the source of truth for products, prices and stock.
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Product id. |
| titleObrigatório | string | Title. |
| handleObrigatório | string | URL slug (set on creation, never changes). |
| statusObrigatório | string | active (on sale), draft or archived. Valores: activedraftarchived |
| descriptionObrigatório | string | Plain-text description (line breaks kept; HTML is not rendered). |
| category_idObrigatório | string | null | Primary category id. |
| brandObrigatório | string | null | Brand. |
| tagsObrigatório | string[] | Tags. |
| fiscalObrigatório | object | |
| ncmObrigatório | string | null | NCM, 8 digits, or null when not informed (optional; required only when the store issues the NF-e itself).^\d{8}$ |
| cestObrigatório | string | null | CEST, 7 digits. |
| originObrigatório | integer | Origem da mercadoria (0–8). 0 a 8 |
| weight_gramsObrigatório | integer | Shipping weight in grams. ≥ 0 |
| dimensions_cmObrigatório | object | Package dimensions in cm. |
| lengthObrigatório | number | |
| widthObrigatório | number | |
| heightObrigatório | number | |
| imagesObrigatório | object[] | Gallery, first = main image. Images sent by apps are copied into the store's media library shortly after the write, so the URLs change to the store's own. |
| urlObrigatório | string | Absolute image URL. |
| altObrigatório | string | null | Alt text. |
| wholesaleObrigatório | → Wholesale | null | Wholesale pricing, or null when the product has none. |
| packagingsObrigatório | → Packaging[] | Sales packages (up to 4); empty when sold by the piece only. |
| packaging_onlyObrigatório | boolean | True when the product is sold only in packages (no loose pieces). |
| variantsObrigatório | → Variant[] | Variants (at least one). |
| created_atObrigatório | string (date-time) | Creation time. |
| updated_atObrigatório | string (date-time) | Last change of product data (not stock). |
Exemplo
{
"id": "p_gan_65w",
"title": "Carregador GaN 65W 3 Portas",
"handle": "carregador-gan-65w-3-portas",
"status": "active",
"description": "Tecnologia GaN, 2 portas USB-C + 1 USB-A.",
"category_id": "cat_chargers",
"brand": "Volt",
"tags": [
"gan",
"notebook",
"anatel"
],
"fiscal": {
"ncm": "85044010",
"cest": null,
"origin": 2
},
"weight_grams": 140,
"dimensions_cm": {
"length": 9,
"width": 6,
"height": 4
},
"images": [],
"variants": [
{
"id": "p_gan_65w_v1",
"product_id": "p_gan_65w",
"sku": "VLT-GAN65W",
"title": "Padrão",
"options": {},
"price": 17990,
"compare_at_price": 21990,
"gtin": "7891035631000",
"inventory": {
"on_hand": 42,
"reserved": 1,
"available": 41
}
}
],
"wholesale": {
"enabled": true,
"tiers": [
{
"min_qty": 12,
"unit_price": 15990
},
{
"min_qty": 48,
"unit_price": 14990
}
],
"min_qty": null,
"multiple": null,
"packs": []
},
"packagings": [
{
"id": "pkg_caixa12",
"unit": "caixa",
"label": null,
"name": "Caixa c/ 12",
"pieces": 12,
"unit_price": 15490,
"tiers": [],
"fill": "single",
"axis": null,
"wholesale_only": false
}
],
"packaging_only": false,
"created_at": "2026-09-13T15:00:00.000Z",
"updated_at": "2026-10-18T15:00:00.000Z"
}Fulfillment
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Fulfillment id ({order_id}:f1). |
| order_idObrigatório | string | Order id. |
| statusObrigatório | string | shipped or delivered. Valores: shippeddelivered |
| carrierObrigatório | string | Carrier. |
| serviceObrigatório | string | Service. |
| tracking_codeObrigatório | string | Tracking code (Correios: S10 with a valid check digit). |
| tracking_urlObrigatório | string | null | Public tracking page. |
| shipped_atObrigatório | string | null (date-time) | When the order was marked as shipped. |
| delivered_atObrigatório | string | null (date-time) | When it was delivered. |
Exemplo
{
"id": "o_1011:f1",
"order_id": "o_1011",
"status": "shipped",
"carrier": "Correios",
"service": "SEDEX",
"tracking_code": "SS123456785BR",
"tracking_url": "https://www.voltshop.com.br/rastreio/SS123456785BR",
"shipped_at": "2026-10-28T16:00:00.000Z",
"delivered_at": null
}WebhookEndpoint
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Endpoint id (we_…). |
| urlObrigatório | string (uri) | HTTPS URL that receives the events. |
| descriptionObrigatório | string | null | Free text. |
| eventsObrigatório | string[] | Subscribed event types. |
| statusObrigatório | string | enabled or disabled. Valores: enableddisabled |
| created_atObrigatório | string (date-time) | Creation time. |
| secret | string | Signing secret (whsec_…). Returned only by the create call: store it. |
Event
Thin payload: fetch the object with GET to read its current state (access checked against your scopes).
| Campo | Tipo | Descrição |
|---|---|---|
| idObrigatório | string | Event id (evt_…), also the webhook-id header: deduplicate with it. |
| typeObrigatório | string | Event type. Valores: order.createdorder.paidorder.updatedorder.cancelledrefund.completedinvoice.authorizedinvoice.cancelledfulfillment.shippedfulfillment.deliveredproduct.createdproduct.updatedproduct.deletedinventory.updatedapp.uninstalled |
| timestampObrigatório | string (date-time) | When the change happened. |
| api_versionObrigatório | string | API version of the payload. Valores: v1 |
| store_idObrigatório | string | Store id. |
| actorObrigatório | object | |
| typeObrigatório | string | Who caused the change. Valores: storebuyerappsystem |
| app_idObrigatório | string | null | App that caused it: ignore your own echoes. |
| dataObrigatório | object | |
| objectObrigatório | string | Object type. Valores: orderproductinventory_levelinvoicefulfillmentapp |
| idObrigatório | string | Object id (order id, product id, variant id, NF-e access key, fulfillment id, installation id). |
| reference | string | null | Human reference: order number, SKU, product handle or tracking code. Never personal data. |
| status | string | null | Object status after the change. |
| test | boolean | Test order: skip it unless you are testing. |
| order_id | string | null | Parent order of invoice and fulfillment events. |
Exemplo
{
"id": "evt_8bQ2kT9mWx1Lp4",
"type": "order.paid",
"timestamp": "2026-10-28T13:05:12.000Z",
"api_version": "v1",
"store_id": "st_volt",
"actor": {
"type": "system",
"app_id": null
},
"data": {
"object": "order",
"id": "o_1017",
"reference": "1017",
"status": "paid",
"test": false
}
}