Create a product or service
curl --request POST \
--url https://api.timbrix.mx/organizations/{organizationId}/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001",
"livemode": true
}
'import requests
url = "https://api.timbrix.mx/organizations/{organizationId}/products"
payload = {
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": True,
"taxability": "01",
"taxes": [],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001",
"livemode": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Ukelele',
productKey: 60131324,
price: 345.6,
taxIncluded: true,
taxability: '01',
taxes: [],
localTaxes: [],
unitKey: 'H87',
unitName: 'Elemento',
sku: 'UKL-001',
livemode: true
})
};
fetch('https://api.timbrix.mx/organizations/{organizationId}/products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.timbrix.mx/organizations/{organizationId}/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Ukelele',
'productKey' => 60131324,
'price' => 345.6,
'taxIncluded' => true,
'taxability' => '01',
'taxes' => [
],
'localTaxes' => [
],
'unitKey' => 'H87',
'unitName' => 'Elemento',
'sku' => 'UKL-001',
'livemode' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.timbrix.mx/organizations/{organizationId}/products"
payload := strings.NewReader("{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.timbrix.mx/organizations/{organizationId}/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.timbrix.mx/organizations/{organizationId}/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "590ce6c56d04f840aa8438af",
"organizationId": "org-uuid",
"livemode": false,
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [
{
"type": "IVA",
"rate": 0.16,
"withholding": false,
"factor": "Tasa"
}
],
"localTaxes": [
{
"type": "IVA",
"rate": 0.16,
"withholding": false,
"factor": "Tasa"
}
],
"unitKey": "H87",
"unitName": "Elemento",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"sku": "UKL-001"
}Products
Create Product
POST
/
organizations
/
{organizationId}
/
products
Create a product or service
curl --request POST \
--url https://api.timbrix.mx/organizations/{organizationId}/products \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001",
"livemode": true
}
'import requests
url = "https://api.timbrix.mx/organizations/{organizationId}/products"
payload = {
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": True,
"taxability": "01",
"taxes": [],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001",
"livemode": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
description: 'Ukelele',
productKey: 60131324,
price: 345.6,
taxIncluded: true,
taxability: '01',
taxes: [],
localTaxes: [],
unitKey: 'H87',
unitName: 'Elemento',
sku: 'UKL-001',
livemode: true
})
};
fetch('https://api.timbrix.mx/organizations/{organizationId}/products', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.timbrix.mx/organizations/{organizationId}/products",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Ukelele',
'productKey' => 60131324,
'price' => 345.6,
'taxIncluded' => true,
'taxability' => '01',
'taxes' => [
],
'localTaxes' => [
],
'unitKey' => 'H87',
'unitName' => 'Elemento',
'sku' => 'UKL-001',
'livemode' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.timbrix.mx/organizations/{organizationId}/products"
payload := strings.NewReader("{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.timbrix.mx/organizations/{organizationId}/products")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.timbrix.mx/organizations/{organizationId}/products")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"description\": \"Ukelele\",\n \"productKey\": 60131324,\n \"price\": 345.6,\n \"taxIncluded\": true,\n \"taxability\": \"01\",\n \"taxes\": [],\n \"localTaxes\": [],\n \"unitKey\": \"H87\",\n \"unitName\": \"Elemento\",\n \"sku\": \"UKL-001\",\n \"livemode\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "590ce6c56d04f840aa8438af",
"organizationId": "org-uuid",
"livemode": false,
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [
{
"type": "IVA",
"rate": 0.16,
"withholding": false,
"factor": "Tasa"
}
],
"localTaxes": [
{
"type": "IVA",
"rate": 0.16,
"withholding": false,
"factor": "Tasa"
}
],
"unitKey": "H87",
"unitName": "Elemento",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"sku": "UKL-001"
}Creates a new product or service in the organization’s catalog for CFDI invoicing.
Authentication
Requires a valid Bearer token. The authenticated user must be an owner or admin of the organization.Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
organizationId | string (UUID) | Yes | Organization ID |
Request Body
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
description | string | Yes | — | Product or service description |
productKey | integer | Yes | — | SAT product/service key (clave de producto o servicio) |
price | number | Yes | — | Unit price |
taxIncluded | boolean | No | false | Whether taxes are already included in the price |
taxability | string | No | "01" | SAT taxability code (objeto de impuesto) |
taxes | array | No | [] | List of applicable taxes |
localTaxes | array | No | [] | List of applicable local taxes |
unitKey | string | No | "H87" | SAT unit of measure key (clave de unidad) |
unitName | string | No | "Elemento" | Unit of measure name |
sku | string | No | — | Internal product SKU or identifier |
livemode | boolean | No | true | Whether this is a live mode product |
Tax Object
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Tax type (e.g. "IVA", "IEPS") |
rate | number | Yes | Tax rate as a decimal (e.g. 0.16) |
withholding | boolean | No | Whether it’s a withholding tax |
factor | string | No | Factor type (e.g. "Tasa") |
Example Request
curl -X POST https://api.timbrix.mx/organizations/550e8400-e29b-41d4-a716-446655440000/products \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [{ "type": "IVA", "rate": 0.16 }],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001"
}'
Example Response
{
"id": "590ce6c56d04f840aa8438af",
"organizationId": "550e8400-e29b-41d4-a716-446655440000",
"livemode": true,
"description": "Ukelele",
"productKey": 60131324,
"price": 345.6,
"taxIncluded": true,
"taxability": "01",
"taxes": [{ "type": "IVA", "rate": 0.16 }],
"localTaxes": [],
"unitKey": "H87",
"unitName": "Elemento",
"sku": "UKL-001",
"createdAt": "2025-01-26T10:00:00Z",
"updatedAt": "2025-01-26T10:00:00Z"
}
Common Errors
400 Bad Request
Missing required fields or invalid values.{
"statusCode": 400,
"message": [
"productKey must be a positive integer",
"price must be a positive number"
]
}
409 Conflict
A product with the same SKU already exists in this organization.{
"statusCode": 409,
"message": "A product with SKU \"UKL-001\" already exists in this organization"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
application/json
Product or service description
Example:
"Ukelele"
SAT product/service key (clave de producto o servicio)
Example:
60131324
Unit price
Example:
345.6
Whether taxes are already included in the price
Example:
true
SAT taxability code (objeto de impuesto)
Example:
"01"
Applicable taxes
Show child attributes
Show child attributes
Applicable local taxes
Show child attributes
Show child attributes
SAT unit of measure key (clave de unidad)
Example:
"H87"
Unit of measure name
Example:
"Elemento"
Internal SKU or identifier
Example:
"UKL-001"
Whether this is a live mode product
Example:
true
Response
201 - application/json
Example:
"590ce6c56d04f840aa8438af"
Example:
"org-uuid"
Example:
false
Example:
"Ukelele"
Example:
60131324
Example:
345.6
Example:
true
Example:
"01"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Example:
"H87"
Example:
"Elemento"
Example:
"UKL-001"
⌘I