# 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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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

```http
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
```
