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.status

enrollments-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.limit

events-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.limit

idempotency-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.name

lessons-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_id

modules-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_id

operations-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_url

operations-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_id

operations-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.limit

operations-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_id

products-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_id

products-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.limit

sandbox-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.environment

showcases-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.status

showcases-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.limit

users-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.status

webhooks-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

On this page