> ## Documentation Index
> Fetch the complete documentation index at: https://tapace.lk/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Save event details

> Changes an event ticket template's event details and pushes them to every pass issued from it.

Use this when the event itself changes, such as a new start time or venue. You don't need a new revision or a [deployment](https://tapace.lk/docs/api-reference/deployments/create.md): TapAce updates every active pass of the template on its own, after the response.

> [!WARNING]
>
> Event details are shared by test and live. Saving them with either key updates the template's test **and** live passes.

How it reaches each wallet:

* **Apple Wallet:** each active pass gets a [pass update](https://tapace.lk/docs/api-reference/passes/get-update.md) whose `changes.event` names this save.
* **Google Wallet:** the event details are shared by all of a template's passes, so TapAce updates them once per environment and Google issuer. `googleClasses` reports each one.

**templateId** `string` *required*

The template ID. The template must be an active event ticket.

**Idempotency-Key** `string`

The SDK sends a key, but this PUT route does not currently provide stored-response replay. Read the current event state before repeating a change. See [Idempotency](https://tapace.lk/docs/idempotency.md).

**event** `object` *required*

The complete event details, with the properties described in [Get event details](https://tapace.lk/docs/api-reference/templates/get-event.md#the-event-details-object). They replace the current ones, so include everything you want to keep. Send `{}` to clear them all.

**notificationMode** `string` (default: silent)

`silent` updates the passes quietly. `notify` also alerts holders: on Apple Wallet, passes that show a changed detail announce it on the lock screen. On Google Wallet, Google decides whether to alert, and does so only for some details and close to the event's start.

### Response

Returns the new [event update](#the-event-update-object) with status `200`. Its `status` starts as `pending`. Follow it with [Get event details](https://tapace.lk/docs/api-reference/templates/get-event.md), which lists the latest saves.

## The event update object

**id** `string`

Unique ID, starting with `tevu_`.

**status** `string`

`pending`, `running` (passes are being updated), `completed` or `failed`. `error` explains a `failed` save.

**notificationMode** `string`

`silent` or `notify`.

**from** `object | null`

The event details before the save. `to` holds the details after it. Either is `null` when there were none.

**actor** `object | null`

Who saved it: `id`, `name` and `email`. For the API, `id` is the API key's ID and the other two are `null`.

**queuedCount** `integer`

How many Apple Wallet passes have been sent an update so far.

**apple** `object`

Apple Wallet progress: `pending`, `delivered`, `notInstalled` and `failed` passes. See [delivery status](https://tapace.lk/docs/guides/update-passes.md#delivery-status).

**googleClasses** `array`

One entry per environment and Google issuer the template's passes use: `environment`, nullable `issuerId`, and `status`, which is `updated` or `failed`. A `failed` entry has an `error`.

**createdAt** `string`

When it was saved. `finishedAt` records when every pass was updated.

### Errors

| Status | When |
| - | - |
| `400` | The template isn't an event ticket or is archived, a property is unknown or invalid (the message names it, such as `event.start`), a time is before the one it follows, or nothing changed. |
| `404` | The template doesn't exist. |

```bash cURL theme={null}
curl -X PUT https://api.tapace.lk/v1/templates/tmpl_Ev5Kq2Lm8Xt4Rn7Pz3Wb/event \
  -H "Authorization: Bearer $TAPACE_API_KEY" \
  -H "Idempotency-Key: 5a1e8c3b-9d2f-4b7a-a6e1-3c8f2d9b4e60" \
  -H "Content-Type: application/json" \
  -d '{
    "event": {
      "name": "Colombo Jazz Night",
      "venue": { "name": "Nelum Pokuna Theatre" },
      "doorsOpen": "2026-11-02T18:30:00+05:30",
      "start": "2026-11-02T19:30:00+05:30",
      "timezone": "Asia/Colombo"
    },
    "notificationMode": "notify"
  }'
```

```json 200 theme={null}
{
  "object": "template_event_update",
  "id": "tevu_Wm6Lq2Xv9Nt4Rk8Pz3Bd",
  "templateId": "tmpl_Ev5Kq2Lm8Xt4Rn7Pz3Wb",
  "status": "pending",
  "notificationMode": "notify",
  "from": {
    "name": "Colombo Jazz Night",
    "venue": { "name": "Nelum Pokuna Theatre" },
    "doorsOpen": "2026-11-02T18:00:00+05:30",
    "start": "2026-11-02T19:00:00+05:30",
    "timezone": "Asia/Colombo"
  },
  "to": {
    "name": "Colombo Jazz Night",
    "venue": { "name": "Nelum Pokuna Theatre" },
    "doorsOpen": "2026-11-02T18:30:00+05:30",
    "start": "2026-11-02T19:30:00+05:30",
    "timezone": "Asia/Colombo"
  },
  "actor": { "id": "cmgx4k2p90001ab12cd34ef56", "name": null, "email": null },
  "queuedCount": 0,
  "apple": { "pending": 0, "delivered": 0, "notInstalled": 0, "failed": 0 },
  "googleClasses": [],
  "error": null,
  "createdAt": "2026-10-26T09:00:00.000Z",
  "finishedAt": null
}
```

```json 400 theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "message": "event.start: Start can't be before doors open."
  },
  "requestId": "req_8f3a2c1d9e7b6a54"
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.