# BookingKoala API

> Every BookingKoala 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/bookingkoala

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 BookingKoala. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/bookingkoala`
- Connects with: Your BookingKoala admin or staff account
- Integration page: https://cotlet.dev/integrations/bookingkoala-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_bookings` | read | Bookings with customer, services, date, arrival time, provider and price. |
| `get_booking` | read | Full booking: services, address, provider, price and job length adjustments, notes and charges. |
| `list_customers` | read | Customers with name, email, phone, addresses and number of bookings. |
| `list_providers` | read | Providers and teams, active or not, with their bookings on a given day. |
| `list_charges` | read | Booking charges with amount, status, card or cash/check, and refunds. |
| `list_invoices` | read | Invoices from the Invoice Dashboard with customer, amount and due date. |
| `get_provider_payments` | read | Amount due per provider for a pay period and amount owed up to today. |
| `create_booking` | write | New booking for an existing or new customer, with a provider or left in the unassigned folder. |
| `reschedule_booking` | write | Move a booking to a new date and arrival time. |
| `assign_provider` | write | Assign a provider or team to a booking, or pair providers for it. |
| `add_booking_note` | write | Add a private booking note, a private customer note or a note for the service provider. |
| `cancel_booking` | write | Cancel a booking, with or without the cancellation fee and the provider's share of it. |
| `send_quote` | write | Email a saved quote with an expiry date, reminder and optional offer. |
| `refund_charge` | write | Full or partial refund of a charge. One refund per charge. |
| `resend_invoice` | write | Resend an unpaid invoice to the customer. |

## List bookings

`POST https://cotlet.dev/api/v1/bookingkoala/list_bookings`

Access: read.

Lists bookings in one folder: upcoming, unassigned, drafts and quotes, or cancelled. Filter by date range, customer or provider. Pages follow the order of the folder; pass next_cursor back as cursor. Quotes in drafts_quotes carry the quote_id that send_quote needs.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `folder` | enum | no | upcoming, unassigned, drafts_quotes or cancelled. Default: upcoming. |
| `from` | date | no | Only bookings on or after this date. |
| `to` | date | no | Only bookings on or before this date. |
| `customer_id` | string | no | Only bookings of this customer. |
| `provider_id` | string | no | Only bookings of this provider or team. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

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

**Python**

```python
result = client.call("bookingkoala", "list_bookings")
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'list_bookings');
```

**CLI**

```bash
cotlet call bookingkoala list_bookings
```

### Example response

```json
{
  "bookings": [
    {
      "booking_id": "48213",
      "customer": {
        "customer_id": "1207",
        "name": "Sarah Miller"
      },
      "services": [
        "Deep clean"
      ],
      "arrival": "2026-10-15T09:00:00-05:00",
      "provider": null,
      "folder": "unassigned",
      "price": "180.00"
    }
  ],
  "next_cursor": null
}
```

## Get booking

`POST https://cotlet.dev/api/v1/bookingkoala/get_booking`

Access: read.

Returns one booking with its services, service address, assigned provider or team, price and job length adjustments, notes and charges. Use it before changing a booking so your agent sees its current state.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | yes | Booking ID from list_bookings. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/get_booking \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"booking_id":"booking_8c41d2"}'
```

**Python**

```python
result = client.call("bookingkoala", "get_booking", {"booking_id":"booking_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'get_booking', {"booking_id":"booking_8c41d2"});
```

**CLI**

```bash
cotlet call bookingkoala get_booking --data '{"booking_id":"booking_8c41d2"}'
```

### Example response

```json
{
  "booking_id": "48213",
  "customer": {
    "customer_id": "1207",
    "name": "Sarah Miller"
  },
  "services": [
    "Deep clean"
  ],
  "address": "14 Maple Street, Austin, TX",
  "arrival": "2026-10-15T09:00:00-05:00",
  "provider": {
    "id": "312",
    "name": "Team Blue"
  },
  "price": "180.00",
  "notes": [
    {
      "type": "private_booking",
      "text": "Gate code 4417"
    }
  ],
  "charges": [
    {
      "charge_id": "90417",
      "amount": "50.00",
      "status": "charged"
    }
  ]
}
```

## List customers

`POST https://cotlet.dev/api/v1/bookingkoala/list_customers`

Access: read.

Lists customers, or searches them by name, email or phone. Each customer comes with addresses and a booking count. Use customer_id with list_bookings or create_booking. Pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | no | Search by name, email or phone. |
| `limit` | integer | no | Customers per page. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

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

**Python**

```python
result = client.call("bookingkoala", "list_customers")
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'list_customers');
```

**CLI**

```bash
cotlet call bookingkoala list_customers
```

### Example response

```json
{
  "customers": [
    {
      "customer_id": "1207",
      "name": "Sarah Miller",
      "email": "sarah@example.com",
      "phone": "+1 555 0100",
      "addresses": [
        "14 Maple Street, Austin, TX"
      ],
      "bookings": 6
    }
  ],
  "next_cursor": null
}
```

## List providers

`POST https://cotlet.dev/api/v1/bookingkoala/list_providers`

Access: read.

Lists providers and teams, active or not. Pass a date to see each provider's bookings that day, which shows who has room. Use the id as provider_id in list_bookings, create_booking and assign_provider.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `date` | date | no | Show each provider's bookings on this day. |

### Request

**cURL**

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

**Python**

```python
result = client.call("bookingkoala", "list_providers")
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'list_providers');
```

**CLI**

```bash
cotlet call bookingkoala list_providers
```

### Example response

```json
{
  "providers": [
    {
      "id": "312",
      "name": "Team Blue",
      "type": "team",
      "active": true,
      "bookings_on_date": 3
    },
    {
      "id": "318",
      "name": "Marcus Reed",
      "type": "provider",
      "active": true,
      "bookings_on_date": 1
    }
  ]
}
```

## List charges

`POST https://cotlet.dev/api/v1/bookingkoala/list_charges`

Access: read.

Lists charges from Booking Charges, newest first, with amount, status, payment method and any refund. Filter by booking or by charge date. The charge_id goes to refund_charge.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | no | Only charges of this booking. |
| `from` | date | no | Charged on or after this date. |
| `to` | date | no | Charged on or before this date. |

### Request

**cURL**

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

**Python**

```python
result = client.call("bookingkoala", "list_charges")
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'list_charges');
```

**CLI**

```bash
cotlet call bookingkoala list_charges
```

### Example response

```json
{
  "charges": [
    {
      "charge_id": "90417",
      "booking_id": "48213",
      "amount": "50.00",
      "status": "charged",
      "method": "card",
      "charged_at": "2026-10-15T12:30:00-05:00",
      "refunded": "0.00"
    }
  ]
}
```

## List invoices

`POST https://cotlet.dev/api/v1/bookingkoala/list_invoices`

Access: read.

Lists invoices from the Invoice Dashboard, the active ones or the ones on the Overdue tab. Each has customer, amount and due date. The invoice_id goes to resend_invoice.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | active or overdue. Default: active. |

### Request

**cURL**

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

**Python**

```python
result = client.call("bookingkoala", "list_invoices")
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'list_invoices');
```

**CLI**

```bash
cotlet call bookingkoala list_invoices
```

### Example response

```json
{
  "invoices": [
    {
      "invoice_id": "inv_7710",
      "customer": {
        "customer_id": "1207",
        "name": "Sarah Miller"
      },
      "amount": "240.00",
      "due_date": "2026-10-01",
      "status": "overdue"
    }
  ]
}
```

## Get provider payments

`POST https://cotlet.dev/api/v1/bookingkoala/get_provider_payments`

Access: read.

Returns, per provider, the amount due for the pay period you give and the amount owed up to today, the same two figures as Provider Payments in BookingKoala. The amount owed up to today is never lower than the amount due for the period. It is read only: it does not pay anyone.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | Start of the pay period. |
| `to` | date | yes | End of the pay period. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/get_provider_payments \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01","to":"2026-10-01"}'
```

**Python**

```python
result = client.call("bookingkoala", "get_provider_payments", {"from":"2026-10-01","to":"2026-10-01"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'get_provider_payments', {"from":"2026-10-01","to":"2026-10-01"});
```

**CLI**

```bash
cotlet call bookingkoala get_provider_payments --data '{"from":"2026-10-01","to":"2026-10-01"}'
```

### Example response

```json
{
  "from": "2026-09-28",
  "to": "2026-10-11",
  "providers": [
    {
      "id": "312",
      "name": "Team Blue",
      "amount_due": "1240.00",
      "owed_to_date": "1240.00"
    },
    {
      "id": "318",
      "name": "Marcus Reed",
      "amount_due": "610.00",
      "owed_to_date": "730.00"
    }
  ],
  "total_due": "1850.00"
}
```

## Create booking

`POST https://cotlet.dev/api/v1/bookingkoala/create_booking`

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

Creates a booking for an existing customer, or for a new one when you pass a name and email. Without provider_id the booking waits in the unassigned folder. save_as can store it as a draft or a quote instead. Returns the booking_id and its folder. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `customer` | object | yes | customer_id, or first_name, last_name and email for a new customer. |
| `services` | object | yes | Industry and the services or extras picked on the booking form. |
| `arrival` | datetime | yes | Date and arrival time, ISO 8601 with time zone. |
| `address` | string | no | Service address. Default: the customer's existing address. |
| `provider_id` | string | no | Provider or team. Omit to leave the booking unassigned. |
| `payment` | enum | no | existing_card or cash_check. Default: existing_card. |
| `save_as` | enum | no | booking, draft or quote. Default: booking. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/create_booking \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customer":{"customer_id":"1207"},"services":{"industry":"Home cleaning","services":["Deep clean"]},"arrival":"2026-10-13T09:00:00-05:00","payment":"existing_card","save_as":"booking"}'
```

**Python**

```python
result = client.call("bookingkoala", "create_booking", {"customer":{"customer_id":"1207"},"services":{"industry":"Home cleaning","services":["Deep clean"]},"arrival":"2026-10-13T09:00:00-05:00","payment":"existing_card","save_as":"booking"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'create_booking', {"customer":{"customer_id":"1207"},"services":{"industry":"Home cleaning","services":["Deep clean"]},"arrival":"2026-10-13T09:00:00-05:00","payment":"existing_card","save_as":"booking"});
```

**CLI**

```bash
cotlet call bookingkoala create_booking --data '{"customer":{"customer_id":"1207"},"services":{"industry":"Home cleaning","services":["Deep clean"]},"arrival":"2026-10-13T09:00:00-05:00","payment":"existing_card","save_as":"booking"}'
```

### Example response

```json
{
  "booking_id": "48377",
  "status": "upcoming",
  "folder": "upcoming",
  "arrival": "2026-10-12T09:00:00-05:00",
  "customer": {
    "customer_id": "1207",
    "name": "Sarah Miller"
  },
  "provider": null,
  "payment": "cash_check"
}
```

## Reschedule booking

`POST https://cotlet.dev/api/v1/bookingkoala/reschedule_booking`

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

Moves one booking to a new date and arrival time and returns the updated booking. The assigned provider or team stays unless keep_provider is false. Rescheduling fees are set in BookingKoala; check them before moving many jobs. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | yes | Booking ID from list_bookings. |
| `arrival` | datetime | yes | New date and arrival time, ISO 8601 with time zone. |
| `keep_provider` | boolean | no | Keep the assigned provider or team. Default: true. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/reschedule_booking \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"booking_id":"48213","arrival":"2026-10-16T10:00:00-05:00","keep_provider":true}'
```

**Python**

```python
result = client.call("bookingkoala", "reschedule_booking", {"booking_id":"48213","arrival":"2026-10-16T10:00:00-05:00","keep_provider":True})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'reschedule_booking', {"booking_id":"48213","arrival":"2026-10-16T10:00:00-05:00","keep_provider":true});
```

**CLI**

```bash
cotlet call bookingkoala reschedule_booking --data '{"booking_id":"48213","arrival":"2026-10-16T10:00:00-05:00","keep_provider":true}'
```

### Example response

```json
{
  "booking_id": "48213",
  "status": "upcoming",
  "arrival": "2026-10-16T10:00:00-05:00",
  "provider": {
    "id": "312",
    "name": "Team Blue"
  }
}
```

## Assign provider

`POST https://cotlet.dev/api/v1/bookingkoala/assign_provider`

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

Assigns one provider or team to a booking, which takes it out of the unassigned folder. Pass several provider_ids to pair providers on one booking; that needs provider pairing switched on in your BookingKoala scheduling permissions and on each provider. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | yes | Booking ID from list_bookings. |
| `provider_ids` | string[] | yes | One provider or team, or several providers to pair. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/assign_provider \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"booking_id":"48213","provider_ids":["312"]}'
```

**Python**

```python
result = client.call("bookingkoala", "assign_provider", {"booking_id":"48213","provider_ids":["312"]})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'assign_provider', {"booking_id":"48213","provider_ids":["312"]});
```

**CLI**

```bash
cotlet call bookingkoala assign_provider --data '{"booking_id":"48213","provider_ids":["312"]}'
```

### Example response

```json
{
  "booking_id": "48213",
  "status": "assigned",
  "folder": "upcoming",
  "providers": [
    {
      "id": "312",
      "name": "Team Blue"
    }
  ]
}
```

## Add booking note

`POST https://cotlet.dev/api/v1/bookingkoala/add_booking_note`

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

Adds a note to a booking. private_booking and private_customer notes are for your team only; for_provider is shown to the service provider, so it reaches another person. Returns the note_id. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | yes | Booking ID from list_bookings. |
| `type` | enum | yes | private_booking, private_customer or for_provider. |
| `text` | string | yes | Note text. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/add_booking_note \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"booking_id":"booking_8c41d2","type":"private_booking","text":"text"}'
```

**Python**

```python
result = client.call("bookingkoala", "add_booking_note", {"booking_id":"booking_8c41d2","type":"private_booking","text":"text"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'add_booking_note', {"booking_id":"booking_8c41d2","type":"private_booking","text":"text"});
```

**CLI**

```bash
cotlet call bookingkoala add_booking_note --data '{"booking_id":"booking_8c41d2","type":"private_booking","text":"text"}'
```

### Example response

```json
{
  "note_id": "n_5521",
  "booking_id": "48213",
  "type": "for_provider",
  "status": "added"
}
```

## Cancel booking

`POST https://cotlet.dev/api/v1/bookingkoala/cancel_booking`

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

Cancels one booking and moves it to the cancelled folder. charge_fee false cancels without your cancellation fee. pay_provider false skips the provider's share of the fee. reason takes one of the cancellation reasons you set up in BookingKoala. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `booking_id` | string | yes | Booking ID from list_bookings. |
| `charge_fee` | boolean | no | Charge your cancellation fee. Default: true. |
| `pay_provider` | boolean | no | Pay the provider out of the fee. Default: true. |
| `reason` | string | no | One of your cancellation reasons, if set up. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/cancel_booking \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"booking_id":"booking_8c41d2"}'
```

**Python**

```python
result = client.call("bookingkoala", "cancel_booking", {"booking_id":"booking_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'cancel_booking', {"booking_id":"booking_8c41d2"});
```

**CLI**

```bash
cotlet call bookingkoala cancel_booking --data '{"booking_id":"booking_8c41d2"}'
```

### Example response

```json
{
  "booking_id": "48213",
  "status": "cancelled",
  "folder": "cancelled",
  "fee_charged": false,
  "reason": "Customer request"
}
```

## Send quote

`POST https://cotlet.dev/api/v1/bookingkoala/send_quote`

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

Emails a quote saved in the drafts and quotes folder to the customer, with an optional expiry date, reminder and offer. Returns the recipient and expiry. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `quote_id` | string | yes | Quote ID from list_bookings with folder drafts_quotes. |
| `to` | string | no | Recipient email. Default: the customer's email. |
| `expires_on` | date | no | Expiry date of the quote link. |
| `reminder_days` | integer | no | Send a reminder after this many days. |
| `offer` | string | no | Discount, e.g. "10%" or "$20". |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/send_quote \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"quote_id":"quote_8c41d2"}'
```

**Python**

```python
result = client.call("bookingkoala", "send_quote", {"quote_id":"quote_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'send_quote', {"quote_id":"quote_8c41d2"});
```

**CLI**

```bash
cotlet call bookingkoala send_quote --data '{"quote_id":"quote_8c41d2"}'
```

### Example response

```json
{
  "quote_id": "q_3302",
  "status": "sent",
  "to": "sarah@example.com",
  "expires_on": "2026-10-25"
}
```

## Refund charge

`POST https://cotlet.dev/api/v1/bookingkoala/refund_charge`

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

Refunds a charge in full, or in part when you pass amount; a partial amount includes tax. BookingKoala allows one refund per transaction, so a second refund on the same charge fails. The reason shows on the booking. notify false skips the customer notification. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `charge_id` | string | yes | Charge ID from list_charges. |
| `amount` | string | no | Partial refund including tax. Omit for a full refund. |
| `reason` | string | yes | Reason shown on the booking. |
| `notify` | boolean | no | Notify the customer. Default: true. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/refund_charge \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"charge_id":"charge_8c41d2","reason":"reason"}'
```

**Python**

```python
result = client.call("bookingkoala", "refund_charge", {"charge_id":"charge_8c41d2","reason":"reason"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'refund_charge', {"charge_id":"charge_8c41d2","reason":"reason"});
```

**CLI**

```bash
cotlet call bookingkoala refund_charge --data '{"charge_id":"charge_8c41d2","reason":"reason"}'
```

### Example response

```json
{
  "charge_id": "90417",
  "status": "refunded",
  "charge_amount": "50.00",
  "refunded": "25.00",
  "reason": "Kitchen not finished, half refunded"
}
```

## Resend invoice

`POST https://cotlet.dev/api/v1/bookingkoala/resend_invoice`

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

Resends one unpaid invoice to its customer, the same as Resend in the Actions menu of the Invoice Dashboard. Returns the send time. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `invoice_id` | string | yes | Invoice ID from list_invoices. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bookingkoala/resend_invoice \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"invoice_id":"invoice_8c41d2"}'
```

**Python**

```python
result = client.call("bookingkoala", "resend_invoice", {"invoice_id":"invoice_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bookingkoala', 'resend_invoice', {"invoice_id":"invoice_8c41d2"});
```

**CLI**

```bash
cotlet call bookingkoala resend_invoice --data '{"invoice_id":"invoice_8c41d2"}'
```

### Example response

```json
{
  "invoice_id": "inv_7710",
  "status": "resent",
  "to": "sarah@example.com",
  "sent_at": "2026-10-12T08:00:00-05:00"
}
```
