List Alternate Purchase Paths
List live alternate purchase paths on a content item. Admin view; no learner visibility filter.
Returns every live (not soft-deleted) alternate purchase path on a content item, in
displayOrder ascending then createdAt ascending. This is the admin view — it does
not apply learner visibility rules. For the storefront CTA, use
Get visible alternate purchase path.
contentId is a course UUID (ti.courses). A learning path UUID is not a valid source;
learning paths are valid only as ti_item targets.
https://example.thoughtindustries.com/v3/admin/content/:contentId/alternate-purchase-pathsThis endpoint is served by the v3 API. Its full path is
https://{instance}.thoughtindustries.com/v3/admin/content/{contentId}/alternate-purchase-paths, not the/incoming/v2base URL used by the rest of this reference. Use the full URL shown in the examples below.
Example request
curl "https://{instance}.thoughtindustries.com/v3/admin/content/3a131ac3-1a74-420d-b4da-ae10b18b2c68/alternate-purchase-paths" \
-H 'Authorization: Bearer YOUR_API_KEY'Parameters
Requires the settings.alternatePurchasePaths permission. A company API key satisfies this.
A manager session needs that permission on the role.
| Name | Type | Required | Location | Description |
|---|---|---|---|---|
contentId | uuid | Yes | path | Source course UUID. |
Example response
Note the data wrapper — v3 endpoints nest their payload under data. List returns an
array, not { items, page }.
{
"data": [
{
"id": "443d8182-d461-4568-a777-918ca729fd85",
"courseId": "3a131ac3-1a74-420d-b4da-ae10b18b2c68",
"displayOrder": 0,
"label": "Subscribe for unlimited access",
"targetType": "ti_item",
"targetId": "7a6b5c4d-3e2f-1a0b-9c8d-7e6f5a4b3c2d",
"targetUrl": null,
"targetUrlTitle": null,
"hidePrimaryCta": false,
"createdAt": "2026-09-15T14:22:01.000Z",
"updatedAt": "2026-09-15T14:22:01.000Z"
}
]
}An unknown or cross-company contentId returns 404 — it does not return 200 with
[]. An empty configured set on a real course returns 200 with "data": [].
Response fields
| Field | Type | Description |
|---|---|---|
data[].id | uuid | Entry ID. |
data[].courseId | uuid | Source course UUID. |
data[].displayOrder | integer | Sort key. Default 0. |
data[].label | string | CTA label. Rich-text HTML sanitized on write. |
data[].targetType | string | ti_item or external_url. |
data[].targetId | uuid | null | Target TI item UUID when targetType is ti_item. |
data[].targetUrl | string | null | Target URL when targetType is external_url. |
data[].targetUrlTitle | string | null | Display title for an external-URL target. |
data[].hidePrimaryCta | boolean | When true, hide the primary purchase CTA. |
data[].createdAt | datetime | Creation timestamp (ISO 8601). |
data[].updatedAt | datetime | Last update timestamp (ISO 8601). |
Errors
An unknown, deleted, or cross-company course returns 404:
{
"code": "RESOURCE_NOT_FOUND",
"message": "Content item with identifier \"3a131ac3-1a74-420d-b4da-ae10b18b2c68\" was not found",
"category": "NOT_FOUND",
"timestamp": "2026-09-15T14:22:01.000Z",
"statusCode": 404,
"metadata": {
"resource": "Content item",
"identifier": "3a131ac3-1a74-420d-b4da-ae10b18b2c68"
}
}A missing or invalid API key returns 401 with code: "UNAUTHENTICATED". A manager session
without settings.alternatePurchasePaths returns 403 with code: "FORBIDDEN" and
message: "Insufficient permissions: settings.alternatePurchasePaths required".
category on those auth errors is CLIENT_ERROR. There is no metadata.
Rate limit
This endpoint has no per-endpoint rate limiter.