> For the complete documentation index, see [llms.txt](https://docs.vomevolunteer.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.vomevolunteer.com/resources/schedule/shift-series.md).

# Shift Series

A **shift series** is a repeating shift: "every Tuesday and Thursday, 2pm to 5pm, starting November 7, open-ended". In Vome this is the **Series** tab of the Create Shift popup.

A series is not a batch of shifts, and the difference matters when you are automating.

|                   | A batch of shifts                 | A shift series                                                                |
| ----------------- | --------------------------------- | ----------------------------------------------------------------------------- |
| What it is        | A finite set of dates you created | A standing instruction                                                        |
| After the request | Nothing more happens              | Vome keeps generating shifts from it, indefinitely                            |
| Assigning a user  | Books them for one date           | Books them for every future occurrence, including dates that do not exist yet |
| Changing it       | Edit each shift                   | Edit the series template once                                                 |

Vome materializes real shifts from a series for a rolling window, about six months ahead when the series is open-ended, and extends it daily. A series created today is still producing shifts next year with no further calls from you.

### Base path

`/api/shift-series/`

Series are **created** through the Shifts resource, because in Vome a series is a kind of shift rather than a separate thing to build. See Create a shift series.

### What you can do

| Action              | Endpoint                                              |
| ------------------- | ----------------------------------------------------- |
| Create a series     | `POST /api/shifts/bulk-create/` with a `series` block |
| List series         | `GET /api/shift-series/`                              |
| Retrieve one        | `GET /api/shift-series/{series_id}/`                  |
| Edit the template   | `POST /api/shift-series/{series_id}/update/`          |
| Change when it ends | `POST /api/shift-series/{series_id}/reschedule-end/`  |
| End it              | `POST /api/shift-series/{series_id}/end/`             |
| Assign users        | `POST /api/shift-series/bulk-assign/`                 |
| Remove users        | `POST /api/shift-series/bulk-remove/`                 |
| See who is on it    | `GET /api/shift-series/{series_id}/enrollments/`      |

### There is no delete

A series is **ended**, never deleted. Ending stops it generating and marks it ended, while every shift that already happened, and everyone who attended one, stays on the record. Deleting a series would delete that history, including volunteer hours.

If a series was ended by mistake, extend it again with Change when a series ends.

### Authentication

Every endpoint requires an `API-KEY` header, the same as the rest of the API.

```python
headers = {
    "API-KEY": "your_unique_api_key_here"
}
```
