# DICE API

> Every DICE endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/dice

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

15 endpoints for DICE. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/dice`
- Connects with: Your own DICE partner (MIO) account, with email and password
- Integration page: https://cotlet.dev/integrations/dice-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_events` | read | Your events in MIO with state, dates, venue and total allocation. |
| `get_event` | read | Full event: description, artists, venue, announce and on-sale dates, ticket types and price tiers. |
| `get_sales_summary` | read | Tickets sold and face value, split by ticket type and sales channel. |
| `list_orders` | read | Orders with time, quantity, sales channel, totals and promo code used. |
| `list_ticket_holders` | read | Who holds a ticket now: name, ticket type and whether it was claimed. |
| `list_returns` | read | Tickets returned by fans, with date, reason and the original order. |
| `list_transfers` | read | Tickets passed from one fan to another, with date and orders. |
| `create_event` | write | New event as a draft in MIO. Fans see nothing until you submit it and DICE approves it. |
| `add_ticket_type` | write | Add a ticket type to an event, with price, allocation and optional door price. |
| `add_price_tier` | write | Add a release to a ticket type that moves on after an allocation sells out or at a set time. |
| `update_ticket_type` | write | Change the name, price, allocation or door price of a ticket type, or archive it to stop sales. |
| `submit_event` | write | Send a draft to DICE for review. Once approved it is announced and goes on sale on its dates. |
| `update_event` | write | Change the date, times, venue, line-up or description of an event fans may already hold tickets for. |
| `message_attendees` | write | Send an operational message to ticket holders with MIO Connect, e.g. door times or entry info. |
| `cancel_event` | write | Cancel an event in MIO. Fans are told and refunds follow your DICE agreement. |

## List events

`POST https://cotlet.dev/api/v1/dice/list_events`

Access: read.

Lists the events of your MIO account, soonest first. Filter by state or start date to find tonight's show or everything still in draft. Use the event_id from each item in the other tools. Pages hold up to 100 events; pass next_cursor back as cursor.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `state` | enum | no | draft, submitted, review, approved, declined, cancelled or archived. Default: all. |
| `starts_after` | date | no | Only events starting on or after this date. |
| `starts_before` | date | no | Only events starting before this date. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/list_events \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("dice", "list_events")
```

**Node.js**

```js
const result = await cotlet.call('dice', 'list_events');
```

**CLI**

```bash
cotlet call dice list_events
```

### Example response

```json
{
  "events": [
    {
      "event_id": "ev_48213",
      "name": "Club Night",
      "state": "approved",
      "start": "2026-11-14T22:00:00+00:00",
      "venue": "The Warehouse",
      "allocation": 350
    },
    {
      "event_id": "ev_48377",
      "name": "Rooftop Session",
      "state": "draft",
      "start": "2026-12-05T19:00:00+00:00",
      "venue": "Skyline Terrace",
      "allocation": 200
    }
  ],
  "next_cursor": null
}
```

## Get event

`POST https://cotlet.dev/api/v1/dice/get_event`

Access: read.

Returns one event with its description, line-up, venue and dates, and every ticket type with its price tiers. Read it before changing prices, so your agent sees which tier is current.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/get_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("dice", "get_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'get_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call dice get_event --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "event_id": "ev_48213",
  "name": "Club Night",
  "state": "approved",
  "currency": "USD",
  "venue": "The Warehouse",
  "start": "2026-11-14T22:00:00+00:00",
  "end": "2026-11-15T04:00:00+00:00",
  "artists": [
    "DJ Orla",
    "Kest"
  ],
  "announce_at": "2026-10-01T10:00:00+00:00",
  "on_sale_at": "2026-10-02T10:00:00+00:00",
  "ticket_types": [
    {
      "ticket_type_id": "8841273",
      "name": "Early bird",
      "price_tier_type": "allocation",
      "tiers": [
        {
          "id": "510922",
          "name": "Early bird",
          "price": 1500,
          "allocation": 100
        }
      ]
    }
  ]
}
```

## Get sales summary

`POST https://cotlet.dev/api/v1/dice/get_sales_summary`

Access: read.

Adds up the orders of one event: tickets sold and face value per ticket type and per sales channel (internet, door, free, external). Face value is in cents. Both splits add up to the totals. Set since to count only newer orders.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `since` | datetime | no | Only orders placed after this time. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/get_sales_summary \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"ev_48213","since":"2026-10-05T00:00:00+01:00"}'
```

**Python**

```python
result = client.call("dice", "get_sales_summary", {"event_id":"ev_48213","since":"2026-10-05T00:00:00+01:00"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'get_sales_summary', {"event_id":"ev_48213","since":"2026-10-05T00:00:00+01:00"});
```

**CLI**

```bash
cotlet call dice get_sales_summary --data '{"event_id":"ev_48213","since":"2026-10-05T00:00:00+01:00"}'
```

### Example response

```json
{
  "event_id": "ev_48213",
  "currency": "USD",
  "tickets_sold": 182,
  "face_value": 314000,
  "by_ticket_type": [
    {
      "ticket_type_id": "8841273",
      "name": "Early bird",
      "tickets": 100,
      "face_value": 150000
    },
    {
      "ticket_type_id": "8841290",
      "name": "General admission",
      "tickets": 82,
      "face_value": 164000
    }
  ],
  "by_channel": [
    {
      "channel": "internet",
      "tickets": 160,
      "face_value": 276000
    },
    {
      "channel": "door",
      "tickets": 22,
      "face_value": 38000
    }
  ]
}
```

## List orders

`POST https://cotlet.dev/api/v1/dice/list_orders`

Access: read.

Lists the orders of one event, newest first, with time, number of tickets, sales channel and total in cents. Use it when the summary is not enough. Pages hold up to 100 orders; pass next_cursor back as cursor.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `sales_channel` | enum | no | internet, door, free or external. Default: all. |
| `since` | datetime | no | Only orders placed after this time. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/list_orders \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("dice", "list_orders", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'list_orders', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call dice list_orders --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "orders": [
    {
      "order_id": "or_90412",
      "placed_at": "2026-10-09T18:22:00+00:00",
      "channel": "internet",
      "tickets": 2,
      "total": 3600,
      "promo_code": null
    },
    {
      "order_id": "or_90398",
      "placed_at": "2026-10-09T16:05:00+00:00",
      "channel": "internet",
      "tickets": 1,
      "total": 1800,
      "promo_code": "FRIENDS"
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjUwfQ"
}
```

## List ticket holders

`POST https://cotlet.dev/api/v1/dice/list_ticket_holders`

Access: read.

Lists who holds a ticket for one event right now, so returned and transferred tickets are reflected. Filter by ticket type for a door list per type. Set format to csv to get a file your door team can open. Pages hold up to 100 rows; pass next_cursor back as cursor.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `ticket_type_id` | string | no | Only one ticket type. |
| `format` | enum | no | json or csv. Default: json. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/list_ticket_holders \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("dice", "list_ticket_holders", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'list_ticket_holders', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call dice list_ticket_holders --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "ticket_holders": [
    {
      "ticket_id": "tk_1182034",
      "name": "Sam Ortiz",
      "ticket_type": "Early bird",
      "claimed": true
    },
    {
      "ticket_id": "tk_1182035",
      "name": "Jo Marsh",
      "ticket_type": "General admission",
      "claimed": false
    }
  ],
  "next_cursor": null
}
```

## List returns

`POST https://cotlet.dev/api/v1/dice/list_returns`

Access: read.

Lists tickets that fans returned, newest first, with the date, the reason and the order they came from. Leave event_id out to cover all your events. Set since to see only the latest returns.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | no | Only one event. Default: all events. |
| `since` | datetime | no | Only returns after this time. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/list_returns \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("dice", "list_returns")
```

**Node.js**

```js
const result = await cotlet.call('dice', 'list_returns');
```

**CLI**

```bash
cotlet call dice list_returns
```

### Example response

```json
{
  "returns": [
    {
      "return_id": "rt_3301",
      "event_id": "ev_48213",
      "returned_at": "2026-10-08T12:40:00+00:00",
      "reason": "Can't make it",
      "order_id": "or_90102"
    }
  ]
}
```

## List transfers

`POST https://cotlet.dev/api/v1/dice/list_transfers`

Access: read.

Lists tickets that fans passed to another fan, newest first, with the date and the orders involved. Leave event_id out to cover all your events. Set since to see only the latest transfers.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | no | Only one event. Default: all events. |
| `since` | datetime | no | Only transfers after this time. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/list_transfers \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("dice", "list_transfers")
```

**Node.js**

```js
const result = await cotlet.call('dice', 'list_transfers');
```

**CLI**

```bash
cotlet call dice list_transfers
```

### Example response

```json
{
  "transfers": [
    {
      "transfer_id": "tf_7710",
      "event_id": "ev_48213",
      "transferred_at": "2026-10-09T09:15:00+00:00",
      "from_order_id": "or_90102",
      "to_order_id": "or_90415"
    }
  ]
}
```

## Create event

`POST https://cotlet.dev/api/v1/dice/create_event`

Access: write.

Saves a new event as a draft in MIO. Fans see nothing until you submit it with submit_event and DICE approves it. Venue is a name or an ID from one of your past events. Add ticket types with add_ticket_type. create_event reaches no one, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `name` | string | yes | Event name. |
| `venue` | string | yes | Venue name or ID from one of your past events. |
| `start` | datetime | yes | ISO 8601 with time zone. |
| `end` | datetime | yes | ISO 8601 with time zone. |
| `description` | string | no | Event description shown to fans. |
| `artists` | string[] | no | Line-up, headliner first. |
| `currency` | string | no | ISO code, e.g. USD, GBP, EUR. Default: your account currency. |
| `announce_at` | datetime | no | When the event appears on DICE. |
| `on_sale_at` | datetime | no | When tickets go on sale. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/create_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Club Night","venue":"The Warehouse","start":"2026-11-14T22:00:00+00:00","end":"2026-11-15T04:00:00+00:00","artists":["DJ Orla","Kest"],"currency":"USD","announce_at":"2026-10-15T10:00:00+00:00","on_sale_at":"2026-10-16T10:00:00+00:00"}'
```

**Python**

```python
result = client.call("dice", "create_event", {"name":"Club Night","venue":"The Warehouse","start":"2026-11-14T22:00:00+00:00","end":"2026-11-15T04:00:00+00:00","artists":["DJ Orla","Kest"],"currency":"USD","announce_at":"2026-10-15T10:00:00+00:00","on_sale_at":"2026-10-16T10:00:00+00:00"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'create_event', {"name":"Club Night","venue":"The Warehouse","start":"2026-11-14T22:00:00+00:00","end":"2026-11-15T04:00:00+00:00","artists":["DJ Orla","Kest"],"currency":"USD","announce_at":"2026-10-15T10:00:00+00:00","on_sale_at":"2026-10-16T10:00:00+00:00"});
```

**CLI**

```bash
cotlet call dice create_event --data '{"name":"Club Night","venue":"The Warehouse","start":"2026-11-14T22:00:00+00:00","end":"2026-11-15T04:00:00+00:00","artists":["DJ Orla","Kest"],"currency":"USD","announce_at":"2026-10-15T10:00:00+00:00","on_sale_at":"2026-10-16T10:00:00+00:00"}'
```

### Example response

```json
{
  "event_id": "ev_48501",
  "name": "Club Night",
  "state": "draft",
  "venue": "The Warehouse",
  "start": "2026-11-14T22:00:00+00:00",
  "end": "2026-11-15T04:00:00+00:00",
  "artists": [
    "DJ Orla",
    "Kest"
  ],
  "currency": "USD"
}
```

## Add ticket type

`POST https://cotlet.dev/api/v1/dice/add_ticket_type`

Access: write. Confirm: waits for the user's OK before it runs.

Adds a ticket type to an event with its face value in cents, allocation and an optional door price. A price of 0 makes a free ticket. On an event fans can already buy from, it changes what they can buy. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `name` | string | yes | e.g. Early bird, General admission. |
| `price` | integer | yes | Face value in cents. 0 for a free ticket. |
| `allocation` | integer | yes | Number of tickets. |
| `description` | string | no | Shown to fans under the name. |
| `door_sales_price` | integer | no | Price at the door in cents. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/add_ticket_type \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","name":"Jane Doe","price":1,"allocation":1}'
```

**Python**

```python
result = client.call("dice", "add_ticket_type", {"event_id":"event_8c41d2","name":"Jane Doe","price":1,"allocation":1})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'add_ticket_type', {"event_id":"event_8c41d2","name":"Jane Doe","price":1,"allocation":1});
```

**CLI**

```bash
cotlet call dice add_ticket_type --data '{"event_id":"event_8c41d2","name":"Jane Doe","price":1,"allocation":1}'
```

### Example response

```json
{
  "ticket_type_id": "8841290",
  "event_id": "ev_48213",
  "name": "General admission",
  "price": 2000,
  "allocation": 250,
  "door_sales_price": 2500
}
```

## Add price tier

`POST https://cotlet.dev/api/v1/dice/add_price_tier`

Access: write. Confirm: waits for the user's OK before it runs.

Adds a price tier to a ticket type. A tier takes over after the earlier tier's allocation sells out (pass allocation) or at a set time (pass time). Price is in cents. The response lists all tiers of the ticket type in order. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `ticket_type_id` | string | yes | Ticket type ID from get_event. |
| `name` | string | yes | e.g. Second release. |
| `price` | integer | yes | Face value in cents. |
| `allocation` | integer | no | Tickets in this tier, for allocation-based tiers. |
| `time` | datetime | no | When the tier switches, for time-based tiers. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/add_price_tier \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ticket_type_id":"8841273","name":"Second release","price":1800,"allocation":150}'
```

**Python**

```python
result = client.call("dice", "add_price_tier", {"ticket_type_id":"8841273","name":"Second release","price":1800,"allocation":150})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'add_price_tier', {"ticket_type_id":"8841273","name":"Second release","price":1800,"allocation":150});
```

**CLI**

```bash
cotlet call dice add_price_tier --data '{"ticket_type_id":"8841273","name":"Second release","price":1800,"allocation":150}'
```

### Example response

```json
{
  "ticket_type_id": "8841273",
  "price_tier_type": "allocation",
  "tiers": [
    {
      "id": "510922",
      "name": "Early bird",
      "price": 1500,
      "allocation": 100
    },
    {
      "id": "510987",
      "name": "Second release",
      "price": 1800,
      "allocation": 150
    }
  ]
}
```

## Update ticket type

`POST https://cotlet.dev/api/v1/dice/update_ticket_type`

Access: write. Confirm: waits for the user's OK before it runs.

Changes a ticket type: name, description, price, allocation, door price, or archived to stop sales. Only the fields you pass change. Price and allocation changes affect what fans pay and what is left. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `ticket_type_id` | string | yes | Ticket type ID from get_event. |
| `fields` | object | yes | Any of name, description, price, allocation, door_sales_price, archived. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/update_ticket_type \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ticket_type_id":"ticket_type_8c41d2","fields":"fields"}'
```

**Python**

```python
result = client.call("dice", "update_ticket_type", {"ticket_type_id":"ticket_type_8c41d2","fields":"fields"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'update_ticket_type', {"ticket_type_id":"ticket_type_8c41d2","fields":"fields"});
```

**CLI**

```bash
cotlet call dice update_ticket_type --data '{"ticket_type_id":"ticket_type_8c41d2","fields":"fields"}'
```

### Example response

```json
{
  "ticket_type_id": "8841290",
  "name": "General admission",
  "price": 2200,
  "allocation": 250,
  "archived": false
}
```

## Submit event

`POST https://cotlet.dev/api/v1/dice/submit_event`

Access: write. Confirm: waits for the user's OK before it runs.

Sends a draft to DICE for review. Under the MIO terms DICE decides at its sole discretion which events it promotes, so the event can be declined. Once approved, it is announced and goes on sale on its dates. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/submit_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("dice", "submit_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'submit_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call dice submit_event --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "event_id": "ev_48501",
  "state": "submitted"
}
```

## Update event

`POST https://cotlet.dev/api/v1/dice/update_event`

Access: write. Confirm: waits for the user's OK before it runs.

Changes the name, times, venue, line-up or description of an event. Only the fields you pass change. Fans may already hold tickets, so tell them with message_attendees. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `fields` | object | yes | Any of name, start, end, venue, artists, description. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/update_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","fields":"fields"}'
```

**Python**

```python
result = client.call("dice", "update_event", {"event_id":"event_8c41d2","fields":"fields"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'update_event', {"event_id":"event_8c41d2","fields":"fields"});
```

**CLI**

```bash
cotlet call dice update_event --data '{"event_id":"event_8c41d2","fields":"fields"}'
```

### Example response

```json
{
  "event_id": "ev_48213",
  "state": "approved",
  "updated": [
    "start"
  ],
  "start": "2026-11-14T20:00:00+00:00"
}
```

## Message attendees

`POST https://cotlet.dev/api/v1/dice/message_attendees`

Access: write. Confirm: waits for the user's OK before it runs.

Sends one message to the ticket holders of an event with MIO Connect. Keep it to event information such as door times. It reaches every ticket holder at once and cannot be unsent. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `message` | string | yes | Event information only, e.g. door times. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/message_attendees \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"ev_48213","message":"Doors now open at 20:00. Your ticket is still valid."}'
```

**Python**

```python
result = client.call("dice", "message_attendees", {"event_id":"ev_48213","message":"Doors now open at 20:00. Your ticket is still valid."})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'message_attendees', {"event_id":"ev_48213","message":"Doors now open at 20:00. Your ticket is still valid."});
```

**CLI**

```bash
cotlet call dice message_attendees --data '{"event_id":"ev_48213","message":"Doors now open at 20:00. Your ticket is still valid."}'
```

### Example response

```json
{
  "event_id": "ev_48213",
  "status": "sent",
  "recipients": 182,
  "sent_at": "2026-11-14T12:00:00+00:00"
}
```

## Cancel event

`POST https://cotlet.dev/api/v1/dice/cancel_event`

Access: write. Confirm: waits for the user's OK before it runs.

Cancels an event in MIO. Under the MIO terms, you are responsible for refunds due to customers when an event is cancelled or rescheduled. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/dice/cancel_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("dice", "cancel_event", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('dice', 'cancel_event', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call dice cancel_event --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "event_id": "ev_48213",
  "state": "cancelled"
}
```
