Product API
The Product API is the implementation-layer service that exposes TPx product
data from Salesforce (CPQ / Steelbrick) through a single, consistent HTTP endpoint. It retrieves
a Salesforce Product2 record and returns it at a selectable depth,
always including the four-level product hierarchy.
This service is intended to be composed into larger product-integration processes (bulk migration, catalog sync, ServiceNow/TMF alignment). Today it exposes the product-lookup endpoint plus a runtime diagnostics endpoint.
Base URL
All endpoints are relative to the following base URL:
https://product.tpxapps.com
The service runs on CloudHub 2.0. Requests and responses use
application/json.
Authentication
This is an internal implementation-layer API. It is reached through the TPx integration platform rather than directly by external clients, and does not require a per-request bearer token at this layer. Network access is restricted to trusted callers.
Endpoints and record IDs are environment-specific. IDs shown in examples are from the DEV org and are illustrative only.
Detail levels
The detail query parameter selects how much of the product graph is
returned. Each level is a superset of the previous one. An omitted or invalid value falls back to
basic.
| Level | Includes |
|---|---|
| basic | Core Product2 fields (id, name, productCode, description, isActive) plus the four-level hierarchy. One Salesforce call. |
| full | Everything in basic, plus related features and options (each option carries its optional-SKU id + name). |
| extended | Everything in full, plus the fuller Product2 definition of each option's product (productCode, description, isActive, family). |
Related features/options and option products are fetched best-effort — a failed related query contributes an empty array rather than failing the whole request.
Response format
The format query parameter selects the response shape. An omitted or
invalid value falls back to default.
| Value | Shape |
|---|---|
| default | A JSON shape that directly reflects the Salesforce object model (documented below). |
| spec | Aligned to the ServiceNow / TMF product specification (productCharacteristic, productSpecification). |
The spec (TMF) shape is on the roadmap and not yet emitted — no Salesforce source for the TMF characteristics has been finalized. Requests currently return the default shape regardless of format.
Product hierarchy
Every response includes a hierarchy object carrying
Levels 1–4 — Company, Category, Group, Family. Each level has a numeric
level, a label (the Salesforce picklist
text), and an id.
| Level | Name | Source | ID |
|---|---|---|---|
| 1 | Company | Company__c | label only |
| 2 | Category | Category__c | label only |
| 3 | Group | Group__c | label only |
| 4 | Family | Family__c | registry id |
Only Family resolves to a registry id
(Assigned_Family__c → Product_Hierarchy__c);
Company/Category/Group carry "id": null because no such link exists in
the data.
Get Product by ID
Retrieves a single Salesforce Product2 at the requested detail level, including the four-level product hierarchy.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id required | string | The Salesforce Product2 record ID (15- or 18-char), e.g. 01tO100000Ghdg5IAB. |
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| detail optional | basic · full · extended | Depth of the returned graph. Default basic; invalid/omitted → basic. |
| format optional | default · spec | Response shape. Default default. spec is planned (see above). |
Example Request
curl "https://product.tpxapps.com/product/01tO100000Ghdg5IAB?detail=basic"
{
"id": "01tO100000Ghdg5IAB",
"name": "Managed Microsoft 365 - Commercial",
"productCode": "SSN1-TECH-O365-COM",
"description": "Managed Microsoft 365 subscription with TPx onboarding and support.",
"isActive": true,
"hierarchy": {
"company": { "level": 1, "label": "TPx", "id": null },
"category": { "level": 2, "label": "Collaboration", "id": null },
"group": { "level": 3, "label": "Cloud Services", "id": null },
"family": { "level": 4, "label": "Microsoft 365", "id": "a2NO1000001s6W5MAI" }
}
}
{
"id": "01tO100000Ghdg5IAB",
"name": "Managed Microsoft 365 - Commercial",
"productCode": "SSN1-TECH-O365-COM",
"description": "Managed Microsoft 365 subscription with TPx onboarding and support.",
"isActive": true,
"hierarchy": { /* … as above … */ },
"features": [
{
"id": "a1AO100000ABcd1EAF",
"name": "Base License",
"number": 1,
"minOptionCount": 1,
"maxOptionCount": 1
}
],
"options": [
{
"id": "a1BO100000XYz01EAF",
"name": "Microsoft 365 Business Standard",
"number": 1,
"required": true,
"quantity": 1,
"type": "Component",
"featureId": "a1AO100000ABcd1EAF",
"product": {
"id": "01tO100000Haaa1IAB",
"name": "Microsoft 365 Business Standard"
}
}
]
}
"product": {
"id": "01tO100000Haaa1IAB",
"name": "Microsoft 365 Business Standard",
"productCode": "M365-BUS-STD",
"description": "Microsoft 365 Business Standard seat.",
"isActive": true,
"family": "Microsoft 365"
}
Error responses have an empty body; the HTTP status carries the outcome.
JVM Diagnostics
Runtime diagnostic that reports the container JVM identity and the count of live com.tpxapps.* instances on the heap — used to verify the runtime does not retain the old application graph across a redeploy.
Example Request
curl "https://product.tpxapps.com/utils/jvm"
{
"jvm": {
"pid": "12@productapi-v3jj0c",
"startTime": "2026-07-08T21:09:44.512Z",
"uptimeMillis": 384210,
"classLoaderId": 1834501723,
"classLoader": "MuleArtifactClassLoader[productapi]"
},
"com.tpxapps.instances": {
"com.tpxapps.api.Api": 1,
"com.tpxapps.api.salesforce.SalesforceConnectorPool": 1
}
}
Response models
Product
- idstring
- Salesforce Product2 ID (18-char).
- namestring
- Product name.
- productCodestring
- SKU / product code.
- descriptionstring · nullable
- Long description.
- isActiveboolean
- Whether the product is active.
- hierarchyobject
- Levels 1–4 (see below). Always present.
- featuresarray
- full · extended Related feature groupings.
- optionsarray
- full · extended Bundle options, each with a nested
product.
Hierarchy level
- levelnumber
- 1 = Company, 2 = Category, 3 = Group, 4 = Family.
- labelstring · nullable
- Picklist text for the level.
- idstring · nullable
- Registry ID — populated for Family only;
nullotherwise.
Feature
- idstring
- SBQQ__ProductFeature__c ID.
- namestring
- Feature name.
- numbernumber · nullable
- Display order.
- minOptionCountnumber · nullable
- Minimum options selectable.
- maxOptionCountnumber · nullable
- Maximum options selectable.
Option
- idstring
- SBQQ__ProductOption__c ID.
- namestring
- Option name.
- numbernumber · nullable
- Display order.
- requiredboolean · nullable
- Whether the option is required.
- quantitynumber · nullable
- Default quantity.
- typestring · nullable
- Option type (e.g. Component).
- featureIdstring · nullable
- Owning feature ID.
- productobject
- The option's Product2 —
id+name; enriched with productCode/description/isActive/family under extended.
Error codes
The API uses standard HTTP status codes to indicate success or failure.
| Code | Meaning | When |
|---|---|---|
| 200 | OK | Product found and returned. |
| 404 | Not Found | No product with that ID, or a malformed Salesforce ID. |
| 502 | Bad Gateway | Salesforce returned an unexpected (non-200) response or an unparseable body. |
| 503 | Service Unavailable | Salesforce could not be reached (auth failure, transport error, or connector borrow timeout). |
Error responses carry no body — the status code is the signal.