Get Full Product Unit
Returns everything Sodtrack knows about one product unit, located either by its Sodtrack id or by its serial number.
/api/integration/product-unitRequest
curl -X GET "https://dev.integration.cl.sodtrack-shared.sodtrack.com/api/integration/product-unit" \
-H "Authorization: Bearer $SODTRACK_TOKEN"Base URL: https://dev.integration.cl.sodtrack-shared.sodtrack.com · other environments
Responses
{
"id": 83,
"serialNumber": "SN-0001-A",
"status": "in_use",
"type": "product",
"entryDate": "2026-08-09T00:19:48.979Z",
"cost": null,
"product": {
"id": 990001,
"name": "Water heater 80L",
"sku": "WH-80L"
},
"lastMovement": {
"id": 75,
"createdDate": "2026-08-29T00:19:48.984Z",
"fromLocationType": "warehouse",
"fromId": "1",
"fromName": "Central warehouse",
"fromAddress": null,
"toLocationType": "customer",
"toId": "32841",
"toName": "María González",
"toAddress": {
"id": 13,
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"extraInfo": "Floor 3, Apt B"
}
},
"firstWarehouse": {
"id": 1,
"name": "Central warehouse"
},
"acquisitions": [
{
"id": "73521",
"reference": "ACQ-2026-0001",
"acquisitionDate": "2026-08-09T03:00:00.000Z",
"customer": {
"id": 32841,
"reference": "CUST-00123",
"name": "María",
"lastname": "González",
"createdDate": "2026-08-31T20:23:12.693Z"
}
}
],
"warranties": [
{
"id": "60511",
"validityStartDate": "2026-08-09T03:00:00.000Z",
"warranty": {
"id": "990001",
"name": "Base warranty 12 months",
"externalReference": "W-BASE-12",
"type": "BASE",
"durationValue": 12,
"durationMetric": {
"id": 990003,
"name": "Months"
}
}
},
{
"id": "60512",
"validityStartDate": "2027-08-09T03:00:00.000Z",
"warranty": {
"id": "990002",
"name": "Extended warranty 24 months",
"externalReference": "W-EXT-24",
"type": "EXTENDED",
"durationValue": 24,
"durationMetric": {
"id": 990003,
"name": "Months"
}
}
}
],
"movements": [
{
"id": 75,
"createdDate": "2026-08-29T00:19:48.984Z",
"fromLocationType": "warehouse",
"fromId": "1",
"fromName": "Central warehouse",
"fromAddress": null,
"toLocationType": "customer",
"toId": "32841",
"toName": "María González",
"toAddress": {
"id": 13,
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"extraInfo": "Floor 3, Apt B"
}
},
{
"id": 43,
"createdDate": "2026-08-09T03:19:48.000Z",
"fromLocationType": "warehouse",
"fromId": "2",
"fromName": "Regional warehouse",
"fromAddress": null,
"toLocationType": "warehouse",
"toId": "1",
"toName": "Central warehouse",
"toAddress": null
}
],
"bookings": [
{
"id": 13,
"reference": "BK-2026-0456",
"status": "accepted",
"scheduledDate": "2026-08-26T04:22:29.911Z",
"quantity": 1,
"totalDurationMinutes": 60,
"doneDate": null,
"createdDate": "2026-08-26T04:22:29.911Z",
"customer": {
"id": 32841,
"reference": "CUST-00123"
},
"stakeholder": null,
"service": {
"id": 1,
"name": "Water heater installation"
},
"variant": {
"id": 1,
"name": "Standard installation",
"type": "execution",
"skus": []
},
"category": {
"id": 1,
"name": "Installations"
},
"address": {
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"coordinates": null
},
"originAddress": null,
"saleChannel": null,
"project": null,
"lead": null,
"provider": {
"id": 19,
"reference": null,
"name": "Carlos",
"lastname": "Muñoz",
"email": "carlos.munoz@example.com",
"phone": "+56972345678",
"identificationNumber": null,
"assignedTo": null
},
"bookingBundle": null,
"price": 0,
"cost": 0,
"bookingAddOns": [],
"products": [
{
"id": 5,
"name": "Water heater 80L",
"sku": "WH-80L",
"productType": "product",
"quantity": 1,
"serialNumber": "SN-0001-A",
"pricing": {
"price": 39999,
"cost": 25000,
"currency": {
"id": 3,
"name": "MXN",
"symbol": "$"
}
}
}
],
"incidents": [],
"alerts": [],
"notes": [],
"dynamicFormSnapshotFields": []
}
],
"workOrders": [
{
"id": 990005,
"createdDate": "2026-07-08T13:40:30.755Z",
"service": {
"id": 2,
"name": "General inspection"
},
"provider": {
"id": 9,
"reference": "PROV-001",
"name": "Ava",
"lastname": "Provider",
"email": "ava.provider@example.com",
"phone": null,
"identificationNumber": null,
"assignedTo": null
}
}
]
}Error responses for this endpoint follow the shared error reference.
Purpose
Returns everything Sodtrack knows about one product unit, located either by its Sodtrack id or by its serial number.
Send exactly one of the two identifiers. Use id when you hold the Sodtrack id (for example from the customer product units endpoint); use serialNumber when you only know the physical unit.
The response combines, in a single call:
- The unit itself: serial number, status, type, parent product, the warehouse it entered through and the movement that brought it to its current location.
- The acquisitions it belongs to and the customer of each one.
- The warranties in force for the unit, base and extended.
- Its full movement history, including origin and destination names and addresses.
- The bookings (service history) in which the unit took part.
- The work orders associated to the unit.
Authentication
| Header | Required | Description |
|---|---|---|
x-api-key | ✅ | Sodtrack inbound integration API key. |
The endpoint is restricted to Sodtrack's private integration network. Requests from unauthorized origins are rejected.
Endpoint
GET /api/integration/product-unit
Field Definitions
📦 Unit identifier (query parameters)
Exactly one of the two must be sent.
| Field | Type | Required | Description |
|---|---|---|---|
id | number | ✅ when serialNumber is absent | Sodtrack product unit id. Integer, minimum 1. |
serialNumber | string | ✅ when id is absent | Serial number of the unit. Leading and trailing spaces are ignored; otherwise matched exactly, case-sensitive. URL-encode it if it contains reserved characters. |
No other parameter is accepted; any other query parameter is ignored.
Example Request
By Sodtrack id:
GET /api/integration/product-unit?id=83By serial number:
GET /api/integration/product-unit?serialNumber=SN-0001-AResponse Example
{
"id": 83,
"serialNumber": "SN-0001-A",
"status": "in_use",
"type": "product",
"entryDate": "2026-08-09T00:19:48.979Z",
"cost": null,
"product": {
"id": 990001,
"name": "Water heater 80L",
"sku": "WH-80L"
},
"lastMovement": {
"id": 75,
"createdDate": "2026-08-29T00:19:48.984Z",
"fromLocationType": "warehouse",
"fromId": "1",
"fromName": "Central warehouse",
"fromAddress": null,
"toLocationType": "customer",
"toId": "32841",
"toName": "María González",
"toAddress": {
"id": 13,
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"extraInfo": "Floor 3, Apt B"
}
},
"firstWarehouse": {
"id": 1,
"name": "Central warehouse"
},
"acquisitions": [
{
"id": "73521",
"reference": "ACQ-2026-0001",
"acquisitionDate": "2026-08-09T03:00:00.000Z",
"customer": {
"id": 32841,
"reference": "CUST-00123",
"name": "María",
"lastname": "González",
"createdDate": "2026-08-31T20:23:12.693Z"
}
}
],
"warranties": [
{
"id": "60511",
"validityStartDate": "2026-08-09T03:00:00.000Z",
"warranty": {
"id": "990001",
"name": "Base warranty 12 months",
"externalReference": "W-BASE-12",
"type": "BASE",
"durationValue": 12,
"durationMetric": {
"id": 990003,
"name": "Months"
}
}
},
{
"id": "60512",
"validityStartDate": "2027-08-09T03:00:00.000Z",
"warranty": {
"id": "990002",
"name": "Extended warranty 24 months",
"externalReference": "W-EXT-24",
"type": "EXTENDED",
"durationValue": 24,
"durationMetric": {
"id": 990003,
"name": "Months"
}
}
}
],
"movements": [
{
"id": 75,
"createdDate": "2026-08-29T00:19:48.984Z",
"fromLocationType": "warehouse",
"fromId": "1",
"fromName": "Central warehouse",
"fromAddress": null,
"toLocationType": "customer",
"toId": "32841",
"toName": "María González",
"toAddress": {
"id": 13,
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"extraInfo": "Floor 3, Apt B"
}
},
{
"id": 43,
"createdDate": "2026-08-09T03:19:48.000Z",
"fromLocationType": "warehouse",
"fromId": "2",
"fromName": "Regional warehouse",
"fromAddress": null,
"toLocationType": "warehouse",
"toId": "1",
"toName": "Central warehouse",
"toAddress": null
}
],
"bookings": [
{
"id": 13,
"reference": "BK-2026-0456",
"status": "accepted",
"scheduledDate": "2026-08-26T04:22:29.911Z",
"quantity": 1,
"totalDurationMinutes": 60,
"doneDate": null,
"createdDate": "2026-08-26T04:22:29.911Z",
"customer": {
"id": 32841,
"reference": "CUST-00123"
},
"stakeholder": null,
"service": {
"id": 1,
"name": "Water heater installation"
},
"variant": {
"id": 1,
"name": "Standard installation",
"type": "execution",
"skus": []
},
"category": {
"id": 1,
"name": "Installations"
},
"address": {
"formattedAddress": "Av. Corrientes 1234, Buenos Aires",
"coordinates": null
},
"originAddress": null,
"saleChannel": null,
"project": null,
"lead": null,
"provider": {
"id": 19,
"reference": null,
"name": "Carlos",
"lastname": "Muñoz",
"email": "carlos.munoz@example.com",
"phone": "+56972345678",
"identificationNumber": null,
"assignedTo": null
},
"bookingBundle": null,
"price": 0,
"cost": 0,
"bookingAddOns": [],
"products": [
{
"id": 5,
"name": "Water heater 80L",
"sku": "WH-80L",
"productType": "product",
"quantity": 1,
"serialNumber": "SN-0001-A",
"pricing": {
"price": 39999,
"cost": 25000,
"currency": {
"id": 3,
"name": "MXN",
"symbol": "$"
}
}
}
],
"incidents": [],
"alerts": [],
"notes": [],
"dynamicFormSnapshotFields": []
}
],
"workOrders": [
{
"id": 990005,
"createdDate": "2026-07-08T13:40:30.755Z",
"service": {
"id": 2,
"name": "General inspection"
},
"provider": {
"id": 9,
"reference": "PROV-001",
"name": "Ava",
"lastname": "Provider",
"email": "ava.provider@example.com",
"phone": null,
"identificationNumber": null,
"assignedTo": null
}
}
]
}Response Fields
📦 Product unit
| Field | Type | Description |
|---|---|---|
id | number | Sodtrack product unit id. |
serialNumber | `string | null` |
status | string | One of: "available", "not_available", "committed", "in_use", "potential_conflict", "movement_request". |
type | string | "product" or "component". |
entryDate | `string (datetime) | null` |
cost | `number | null` |
product | object | Parent product. |
product.id | number | Sodtrack product id. |
product.name | string | Product name. |
product.sku | string | Product SKU. |
lastMovement | `object | null` |
firstWarehouse | `object | null` |
firstWarehouse.id | number | Sodtrack warehouse id. |
firstWarehouse.name | string | Warehouse name. |
🧾 Acquisitions (acquisitions[])
| Field | Type | Description |
|---|---|---|
acquisitions[].id | string | Sodtrack acquisition id. |
acquisitions[].reference | `string | null` |
acquisitions[].acquisitionDate | string (datetime) | Acquisition date. |
acquisitions[].customer | `object | null` |
acquisitions[].customer.id | number | Sodtrack customer id. |
acquisitions[].customer.reference | `string | null` |
acquisitions[].customer.name | `string | null` |
acquisitions[].customer.lastname | `string | null` |
acquisitions[].customer.createdDate | string (datetime) | When the customer was created in Sodtrack. |
🛡️ Warranties (warranties[])
| Field | Type | Description |
|---|---|---|
warranties[].id | string | Id of the warranty in force for this unit. |
warranties[].validityStartDate | `string (datetime) | null` |
warranties[].warranty | object | The warranty definition. |
warranties[].warranty.id | string | Sodtrack warranty id. |
warranties[].warranty.name | string | Warranty name. |
warranties[].warranty.externalReference | `string | null` |
warranties[].warranty.type | string | "BASE" or "EXTENDED". |
warranties[].warranty.durationValue | `number | null` |
warranties[].warranty.durationMetric | `object | null` |
warranties[].warranty.durationMetric.id | number | Sodtrack metric id. |
warranties[].warranty.durationMetric.name | string | Metric name, for example months or usage hours. |
🚚 Movements (movements[])
| Field | Type | Description |
|---|---|---|
movements[].id | number | Movement id. |
movements[].createdDate | `string (datetime) | null` |
movements[].fromLocationType | `string | null` |
movements[].fromId | `string | null` |
movements[].fromName | `string | null` |
movements[].fromAddress | `object | null` |
movements[].toLocationType | string | Destination type: "warehouse", "customer" or "provider". |
movements[].toId | string | Id of the destination warehouse or customer, according to toLocationType. |
movements[].toName | `string | null` |
movements[].toAddress | `object | null` |
movements[].toAddress.id | number | Sodtrack address id. |
movements[].toAddress.formattedAddress | string | Full formatted address. |
movements[].toAddress.extraInfo | `string | null` |
🧩 Bookings (bookings[])
Each entry is a full Sodtrack booking, in the same shape returned by the booking endpoints of the integration API.
| Field | Type | Description |
|---|---|---|
bookings[].id | number | Sodtrack booking id. |
bookings[].reference | `string | null` |
bookings[].status | string | Booking status. One of: "created", "searching", "accepted", "on_my_way_to_origin", "arrived_to_origin", "on_my_way_to_destination", "arrived_to_destination", "left_destination", "done", "cancelled", "waiting_customer_to_set_date", "waiting_scheduling_mechanism", "waiting_assignment_mechanism", "waiting_provider_to_propose_date", "waiting_customer_to_accept_proposed_date". |
bookings[].scheduledDate | `string (datetime) | null` |
bookings[].quantity | number | Quantity booked. |
bookings[].totalDurationMinutes | `number | null` |
bookings[].doneDate | `string (datetime) | null` |
bookings[].createdDate | string (datetime) | When the booking was created. |
bookings[].customer | `object | null` |
bookings[].stakeholder | `object | null` |
bookings[].service | `object | null` |
bookings[].variant | `object | null` |
bookings[].category | `object | null` |
bookings[].address | `object | null` |
bookings[].originAddress | `object | null` |
bookings[].saleChannel | `object | null` |
bookings[].project | `object | null` |
bookings[].lead | `object | null` |
bookings[].provider | `object | null` |
bookings[].bookingBundle | `object | null` |
bookings[].price | `number | null` |
bookings[].cost | `number | null` |
bookings[].bookingAddOns[] | array | Add-ons: id, name, reference. |
bookings[].products[] | array | Products in the booking: id, name, sku, productType ("product" or "component"), quantity, serialNumber and pricing (price, cost, currency with id, name, symbol). |
bookings[].incidents[] | array | Incidents: id and reference. |
bookings[].alerts[] | array | Alerts: id and reference. |
bookings[].notes[] | array | Notes: id, note, reference. |
bookings[].dynamicFormSnapshotFields[] | array | Dynamic form answers captured during the booking: id, reference, value, secondaryValue, type, snapshotId. |
🛠️ Work orders (workOrders[])
| Field | Type | Description |
|---|---|---|
workOrders[].id | number | Sodtrack work order id. |
workOrders[].createdDate | string (datetime) | When the work order was created. |
workOrders[].service | `object | null` |
workOrders[].provider | `object | null` |
Error Responses
| HTTP Status | Error | Description |
|---|---|---|
400 Bad Request | Provide exactly one of \id` or `serialNumber`` | Neither identifier was sent, or both were. |
400 Bad Request | — | id is not a positive integer, or serialNumber is empty. |
401 Unauthorized | — | Missing or invalid x-api-key, or the request does not come from an authorized origin. |
404 Not Found | PRODUCT_UNIT_NOT_FOUND: {identifier} | No product unit exists with that id or serial number. The message echoes the identifier sent. |
503 Service Unavailable | PRODUCT_MODULE_UNAVAILABLE | Sodtrack's product inventory service could not be reached. Retry later. |
500 Internal Server Error | — | Unexpected server error. Contact Sodtrack support. |
Business Rules & Constraints
One identifier at a time
id and serialNumber are two ways of pointing at the same unit, not filters to combine. Sending both, or none, is rejected with 400 Bad Request before any lookup.
| Request | Behavior |
|---|---|
?id=83 | Returns the unit with id 83. |
?serialNumber=SN-0001-A | Returns the unit whose serial number is exactly SN-0001-A. |
?id=83&serialNumber=SN-0001-A | 400 Bad Request. |
| no parameters | 400 Bad Request. |
Serial number matching
Leading and trailing spaces are removed from serialNumber before matching; internal spaces and letter case must match the value registered in Sodtrack. Serial numbers are expected to be unique; if the same value were registered on more than one unit, the first registered one is returned.
Lists are complete
acquisitions, warranties, movements, bookings and workOrders are returned in full. There is no pagination on this endpoint. An empty array means the unit has no records of that kind.
Ordering of each list
| List | Order |
|---|---|
movements | Newest first. The first entry is always lastMovement. |
bookings | Newest first, by Sodtrack booking id. |
workOrders | By execution date, earliest first; work orders without an execution date come last. Ties by creation date. |
acquisitions | No guaranteed order. |
warranties | No guaranteed order. |
Only active acquisitions are returned
Acquisitions that were voided are not included in acquisitions, even if the unit was part of them.
Location names and addresses are resolved when possible
fromName, toName, fromAddress and toAddress in each movement are resolved from the warehouse or customer referenced by the movement. If that warehouse or customer no longer exists, the name or address comes back as null while the raw fromId / toId is still returned.
First warehouse
firstWarehouse is the destination of the earliest movement of the unit whose destination is a warehouse. A unit registered directly at a customer, with no warehouse in its history, returns null.
Bookings and work orders are matched by the unit
bookings contains the bookings in which this specific unit was part of the products serviced. workOrders contains the work orders explicitly associated to this unit. Bookings or work orders created for the parent product without naming a unit are not included.