Create a product for a company
Scopeproducts:writeCreates a new product or service in the catalog of this company (NIF).
Keys are prefixed beel_sk_, and each one carries the scopes it was created with: a key
short of the scope an operation needs is answered 403. The scope an operation requires
is shown next to its title, and the full catalogue lives in the Scopes reference.
Keys are created from the BeeL dashboard. They are secret credentials: do not share them or commit them to source control.
In: header
Path Parameters
NIF (company) the operation acts on. It is the only source of context: the account that owns it is derived from it, and the BeeL-Active-Company header plays no part. A NIF you do not reach answers 403, and so does a NIF that does not exist, so the existence of a NIF in another account is never disclosed.
uuidHeader Parameters
Idempotency key to prevent duplicates in sensitive operations.
- Any unique client-generated string (e.g. an order id). A UUID also works but is not required
- Allowed characters: letters, digits,
_and-(max 255 chars) - If the same key is sent twice, the result of the first operation is returned
- Keys expire 24 hours after processing
The key is scoped per user and environment, and bound to the request body, so retrying after a network timeout replays the stored response instead of repeating the operation.
| Status | Code | When |
|---|---|---|
400 | INVALID_IDEMPOTENCY_KEY | The key breaks the format rules above. |
409 | IDEMPOTENCY_KEY_PROCESSING | The first request is still in flight. Wait and retry with the same key. |
409 | IDEMPOTENCY_KEY_MISMATCH | The key was already used with a different body. Use a new key. |
^[a-zA-Z0-9_-]+$length <= 255Unique alphanumeric product code (optional)
^[a-zA-Z0-9_-]*$length <= 50Product/service name
length <= 255Detailed description (optional)
Product/service category:
- PRODUCT - Physical, tangible products
- SERVICE - General services
- CONSULTING - Consulting and advisory services
- SOFTWARE - Development, licenses, SaaS
- TRAINING - Courses, workshops, training
- OTHER - Other unclassified types
"PRODUCT" | "SERVICE" | "CONSULTING" | "SOFTWARE" | "TRAINING" | "OTHER"Suggested default price (optional)
0.00010 <= valueUnit of measure (optional)
length <= 50Complete tax information with cross-validations:
- IVA: real rates 4, 5, 10, 21 (see below for 0)
- IGIC: 0, 3, 5, 7, 9.5, 15, 20 — here 0 is the real "Tipo Cero"
- IPSI: real rates 0.5, 1, 2, 4, 8, 10 (see below for 0)
- OTHER: any percentage between 0 and 100
0 % under IVA and IPSI is not a rate, it is the exemption sentinel. It is accepted
on a line, but only together with an exemption_reason (exempt or non-subject
operation); on its own it says nothing and the line is rejected. That is why
GET /v1/tax-types publishes 4, 5, 10 and 21 for IVA and not 0: the legitimate way
to a 0 % IVA line is through an exemption reason, which the same response also
publishes. IGIC is different — its 0 % is a real legal rate (basic necessities) and
needs no reason.
IVA 5 % (RD-ley 11/2022 and its extensions, on electricity, gas and basic foodstuffs) is no longer in force for new operations, but it stays valid: corrective invoices and late-filed invoices for the periods when it applied must be able to carry it. Its equivalence surcharge pair is 0.625.
Exception: when regime_key = "17" (OSS/IOSS) the invoice applies the destination country VAT instead of the Spanish one, so any percentage in the EU range [0, 27] is accepted regardless of the tax type set — including 0 without an exemption reason.
Equivalence surcharge percentage (optional).
Must be coherent with main_tax.regime_key: a surcharge > 0 is
only valid under regime 18. When regime_key is omitted it is
derived automatically (18 with a surcharge > 0, 01 otherwise).
An explicit regime_key that does not admit a surcharge combined
with a surcharge > 0 is rejected with a 422
(SURCHARGE_REQUIRES_REGIME), and an explicit regime 18 without
a surcharge > 0 is rejected with a 422
(REGIME_REQUIRES_SURCHARGE).
0.010 <= value <= 100IRPF withholding percentage (optional)
0.010 <= value <= 100Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://app.beel.es/api/v1/companies/497f6eca-6276-4993-bfeb-53cbbbba6f08/products" \ -H "Content-Type: application/json" \ -d '{ "code": "PROD-LAPTOP-001", "name": "Ordenador portátil HP ProBook 450 G10", "description": "Incluye garantía de 2 años", "category": "PRODUCT", "default_price": 850, "unit": "unidad", "main_tax": { "type": "IVA", "percentage": 21, "regime_key": "01" } }'Product created successfully in catalog with default tax configuration
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"code": "SRV-001",
"name": "Consultoría estratégica",
"description": "Servicios de consultoría estratégica por hora",
"category": "CONSULTING",
"default_price": 125,
"unit": "hora",
"main_tax": {
"type": "IVA",
"percentage": 21,
"regime_key": "01"
},
"active": true,
"created_at": "2025-02-09T10:00:00Z",
"updated_at": "2025-02-09T10:00:00Z"
},
"meta": {
"timestamp": "2025-02-09T10:00:00Z",
"request_id": "req_producto_001"
}
}{
"success": false,
"error": {
"code": "BAD_REQUEST",
"message": "Invalid request"
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required to access this resource"
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "The provided data is not valid",
"details": {
"field": "specific error message"
}
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
},
"type": "https://docs.beel.es/errors/INVOICE_NO_LINES",
"title": "INVOICE_NO_LINES",
"detail": "La factura debe tener al menos una línea",
"instance": "/v1/invoices/abc-123"
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "The provided data is not valid",
"details": {
"field": "specific error message"
}
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
},
"type": "https://docs.beel.es/errors/INVOICE_NO_LINES",
"title": "INVOICE_NO_LINES",
"detail": "La factura debe tener al menos una línea",
"instance": "/v1/invoices/abc-123"
}{
"success": false,
"error": {
"code": "UNPROCESSABLE_ENTITY",
"message": "Data cannot be processed",
"details": {
"field": "Specific error description"
}
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}{
"success": false,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again in 60 seconds."
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error"
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}{
"success": false,
"error": {
"code": "UNSUPPORTED_MEDIA_TYPE",
"message": "Unsupported media type: text/plain. Supported: application/json"
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}List the products of a company GET
Returns a paginated list of the products/services of this company (NIF), with optional filters. - **`q`:** searching is done on this collection, there is no separate search path. `q` matches the name, the code and the description, so it returns at least everything the withdrawn `GET /v1/products/search` returned, in the paginated envelope of this list.
Get a product of a company GET
Retrieves the details of a product of this company (NIF).