Product API

Implementation-layer documentation

Base URL: https://product.tpxapps.com

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:

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.

Internal use

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.

LevelIncludes
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).
Best-effort related data

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.

ValueShape
defaultA JSON shape that directly reflects the Salesforce object model (documented below).
specAligned to the ServiceNow / TMF product specification (productCharacteristic, productSpecification).
Planned

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.

LevelNameSourceID
1CompanyCompany__clabel only
2CategoryCategory__clabel only
3GroupGroup__clabel only
4FamilyFamily__cregistry id

Only Family resolves to a registry id (Assigned_Family__cProduct_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.

GET /product/{id}

Path Parameters

ParameterTypeDescription
id required string The Salesforce Product2 record ID (15- or 18-char), e.g. 01tO100000Ghdg5IAB.

Query Parameters

ParameterTypeDescription
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
curl "https://product.tpxapps.com/product/01tO100000Ghdg5IAB?detail=basic"
200 OKdetail=basic
Response
{
  "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" }
  }
}
200 OKdetail=full — adds features + options (truncated)
Response
{
  "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"
      }
    }
  ]
}
200 OKdetail=extended — option products enriched
Response (options[].product)
"product": {
  "id": "01tO100000Haaa1IAB",
  "name": "Microsoft 365 Business Standard",
  "productCode": "M365-BUS-STD",
  "description": "Microsoft 365 Business Standard seat.",
  "isActive": true,
  "family": "Microsoft 365"
}
404 Not Foundunknown or malformed product ID
503 Service UnavailableSalesforce unavailable (auth / transport / borrow timeout)
502 Bad Gatewayunexpected Salesforce response

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.

GET /utils/jvm

Example Request

cURL
curl "https://product.tpxapps.com/utils/jvm"
200 OK
Response
{
  "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; null otherwise.

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.

CodeMeaningWhen
200OKProduct found and returned.
404Not FoundNo product with that ID, or a malformed Salesforce ID.
502Bad GatewaySalesforce returned an unexpected (non-200) response or an unparseable body.
503Service UnavailableSalesforce could not be reached (auth failure, transport error, or connector borrow timeout).

Error responses carry no body — the status code is the signal.