Examples
Ready-to-run requests, one per subject.
credentials-current
Who am I: confirms the current credential, its environment, and the authentication mode.
- permissions: credentials.read
GET /credentials/current
Authorization: Bearer {{token}}
### response
200
data.object
data.id
data.environment
data.statusenrollments-list
Lists the enrollments in the account. The collection requires at least one
- filter (user_id, product_id, delivery_id, or updated_after). Use
- updated_after to sync everything that changed since your last run.
- Enrollments are created with POST /users/{user_id}/enrollments, using the
- delivery_id of the sales delivery.
- permissions: enrollments.read
GET /enrollments?updated_after=2026-01-01T00:00:00Z&limit=2
Authorization: Bearer {{token}}
### response
200
data
page.limitevents-list
Reads the public events of the account. A page only includes events that
- are at least a few seconds old, events are sorted by ascending ID, and the
- cursor resumes where the previous page ended. Event types: /api/events.
- permissions: events.read
GET /events?limit=10
Authorization: Bearer {{token}}
### response
200
data
page.limitidempotency-replay
Timeout after the write: the response never arrived, but the change may
- have been saved. Repeat the SAME request with the SAME Idempotency-Key. If
- the first attempt was saved, the retry returns the same body with the
- Idempotent-Replayed: true header and does not create a second showcase. If
- it was not saved, the request runs now, exactly once.
- permissions: showcases.create
POST /showcases
Authorization: Bearer {{token}}
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Content-Type: application/json
{"name": "Onboarding", "kind": "showcase"}
### response
201
data.object
data.id
data.namelessons-create
Creates a lesson in a product. The standard format is a regular lesson.
- module_id is the module that receives the lesson and is required for
- products that use modules (only the blog format does not).
- prd_42 and mod_84 are example IDs: replace them with your own IDs
- (GET /products and GET /products/{product_id}/modules).
- With real IDs, the response is 201 with the created lesson.
- The example IDs do not exist, so module_id fails validation and the
- request returns the 422 shown below.
- permissions: lessons.create
POST /products/prd_42/lessons
Authorization: Bearer {{token}}
Idempotency-Key: 2c3d4e5f-6071-4829-93a4-b5c6d7e8f901
Content-Type: application/json
{"name": "Lesson 1", "format": "standard", "module_id": "mod_84", "summary": "What you will learn"}
### response
422
error.code
error.details.0.field
error.request_idmodules-create
Creates a module in a product. kind accepts module (a regular module) or
- group (a group of modules).
- prd_42 is an example ID: replace it with one of your products (GET /products).
- A product that does not exist or is not accessible with the current
- credentials returns the 404 not_found shown below.
- permissions: modules.create
POST /products/prd_42/modules
Authorization: Bearer {{token}}
Idempotency-Key: 1b2c3d4e-5f60-4718-8293-a4b5c6d7e8f9
Content-Type: application/json
{"name": "Module 1", "kind": "module", "position": 1}
### response
404
error.code
error.request_idoperations-batch-publish
Publishes an entire product (the product, its modules, and its lessons) as
- an asynchronous operation. The response is 202 with the operation;
- processing happens later. To track it, see operations-get.http.
- POST /products/{product_id}/publications creates this same operation
- without building a batch. Use a batch to queue several products, one item
- per product, when the operation type accepts more than one item
- (product.publish_all accepts one item per operation).
- Replace product_id with your own: an item that points to a missing product
- fails inside the operation, not when the batch is accepted.
- permissions: operations.manage, products.publish
POST /operations/batches
Authorization: Bearer {{token}}
Idempotency-Key: 5f607182-93a4-4b5c-86d7-e8f901234567
Content-Type: application/json
{"type": "product.publish_all", "items": [{"key": "course-1", "payload": {"product_id": "prd_42"}}]}
### response
202
data.object
data.id
data.type
data.status
data.progress.total
data.items_urloperations-get
Polls the operation created by a batch or a publication. Poll every 2
- seconds at first, then back off. Terminal statuses are succeeded,
- partially_succeeded, failed, and canceled.
- The ID below is an example: replace it with data.id from the 202 response
- (or the Location header). An ID that does not exist returns the
- 404 not_found shown below.
- permissions: operations.read
GET /operations/op_01J8Z3ZQ4H8K2M0T1S9P7YQF5C
Authorization: Bearer {{token}}
### response
404
error.code
error.request_idoperations-partial-failure
Partial failure: the operation finished with some items saved and others
- failed. This filter finds operations in that state. Then GET
- /operations/{operation_id}/items shows which item failed and why.
- Only failed operations can be resumed (see operations-resume.http).
- permissions: operations.read
GET /operations?status=partially_succeeded&limit=10
Authorization: Bearer {{token}}
### response
200
data
page.limitoperations-resume
Resume: creates a new attempt that retries only the recoverable items and
- keeps everything already completed. Only operations with status failed can
- be resumed. Any other status, including partially_succeeded, returns
- 422 operation_not_resumable.
- The ID below is an example: replace it with the ID of your operation.
- An ID that does not exist returns the 404 not_found shown below.
- permissions: operations.manage
POST /operations/op_01J8Z3ZQ4H8K2M0T1S9P7YQF5C/attempts
Authorization: Bearer {{token}}
Idempotency-Key: 60718293-a4b5-4c6d-9e8f-901234567890
Content-Type: application/json
{}
### response
404
error.code
error.request_idproducts-create
Creates a product in a showcase, tagged with the ID from your own system.
- shw_42 is an example ID: replace it with one of your showcases (GET /showcases).
- A showcase that does not exist or is not accessible with the current
- credentials returns the 404 not_found shown below.
- permissions: products.create
POST /products
Authorization: Bearer {{token}}
Idempotency-Key: 9a1c4f52-2c11-4f0e-9b2e-7d8a3b6c5e40
Content-Type: application/json
{"name": "Sales course", "format": "course", "showcase_id": "shw_42", "external_id": "erp-1001"}
### response
404
error.code
error.request_idproducts-list-by-external-id
Finds a product by the ID from your own system. Use the external_id filter
- when you integrate an ERP or a sales platform.
- permissions: products.read
GET /products?external_id=erp-1001&limit=2
Authorization: Bearer {{token}}
### response
200
data
page.limitsandbox-get
Returns the sandbox state as seen by the current credentials. With a
- production credential, status absent means the account has no sandbox yet.
- permissions: sandbox.read
GET /sandbox
Authorization: Bearer {{token}}
### response
200
data.object
data.status
data.environmentshowcases-create
Creates a showcase. New showcases start with status draft.
- permissions: showcases.create
POST /showcases
Authorization: Bearer {{token}}
Idempotency-Key: 5f7d9f0a-3f8f-4a14-8b5c-6f9d2e0c1a77
Content-Type: application/json
{"name": "Sales tracks", "kind": "showcase"}
### response
201
data.object
data.id
data.name
data.statusshowcases-list
Lists the showcases and showcase groups in the account.
- permissions: showcases.read
GET /showcases?limit=2
Authorization: Bearer {{token}}
### response
200
data
data.0.object
page.limitusers-create
Creates a user. The email address identifies the user in the account, and
- external_id stores the ID from your own system.
- permissions: users.create
POST /users
Authorization: Bearer {{token}}
Idempotency-Key: 3d4e5f60-7182-493a-a4b5-c6d7e8f90123
Content-Type: application/json
{"name": "Ana Souza", "email": "ana.souza@example.com", "external_id": "crm-55"}
### response
201
data.object
data.id
data.name
data.statuswebhooks-create
Registers a webhook endpoint. The secret is returned only once, in this
- response: store it, because you need it to verify the signature of every delivery.
- permissions: webhooks.create
POST /webhooks
Authorization: Bearer {{token}}
Idempotency-Key: 4e5f6071-8293-4a4b-b5c6-d7e8f9012345
Content-Type: application/json
{"url": "https://hooks.example.com/cademi", "event_types": ["user.created", "enrollment.created"], "description": "CRM sync"}
### response
201
data.object
data.id
data.url
data.secret
data.status