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

# Add a shift

> Adds a shift to an existing event. Times are wall-clock (`14:30`) and are read in
the event's own timezone — do not send an offset or a date.

Requires the `slots:write` scope.



## OpenAPI

````yaml https://api.signupbreeze.com/openapi.yaml post /v1/events/{event_id}/slots
openapi: 3.0.3
info:
  title: SignUpBreeze API
  description: >-
    Manage events, shifts, and signups programmatically — from your own scripts,
    an

    automation platform, or an AI agent.


    ## Authentication


    Every request needs a bearer token, which an organization owner or admin
    creates

    under **Organization settings → API**. Tokens belong to the organization
    rather

    than to the person who created one, so an admin leaving does not break a
    live

    integration.


    Each token carries a set of scopes, and every endpoint states the scope it

    requires. A request whose token lacks the scope is refused with `403`.


    **Every token expires**, after at most a year and by default after exactly
    that.

    An expired token is refused with `401`, the same as a revoked one, so plan
    to

    create a replacement before the expiry date shown in settings — nothing
    using

    the old token keeps working past it.


    ## Rate limiting


    Requests are throttled per API token, not per organization — issuing more

    tokens does not raise the ceiling. The limit varies by plan: 30 requests/min

    on Free and Calendar, 120 on Starter, 300 on Pro.


    Every response carries `X-RateLimit-Limit` and `X-RateLimit-Remaining`.

    Exceeding the limit returns `429`, with `Retry-After` and
    `X-RateLimit-Reset`

    added to that response so you know when to try again.


    ## Idempotency


    Writes accept an `Idempotency-Key` header. Send the same key again and the
    original

    response is replayed rather than the write happening twice — worth using
    anywhere a

    retry is possible, which is most places an agent is involved.


    ## Pagination


    Collections are cursor paginated. Follow `meta.next_cursor` rather than
    assuming

    page numbers.


    ## Scoping


    Everything a token can reach belongs to its organization. Another
    organization's

    record answers `404` rather than `403`, so a token cannot be used to
    discover that

    it exists.
  version: 1.0.0
servers:
  - url: https://api.signupbreeze.com
security:
  - default: []
tags:
  - name: Events
    description: >-

      Create and manage events. Every endpoint is scoped to the organization
      that owns the

      token — another organization's event responds `404`, not `403`, so a token
      cannot be

      used to discover that it exists.
  - name: Organization
    description: |-

      The organization a token belongs to.
  - name: Shifts
    description: >-

      The time slots volunteers sign up for. Shift times are wall-clock strings
      like `14:30`,

      interpreted in the parent event's timezone against its start date — you
      never send a

      date or an offset for a shift.
  - name: Signups
    description: >-

      Who has signed up. Read-only in v1: signups are created through the public
      event page,

      which is deliberately the only way a volunteer is added.
externalDocs:
  description: SignUpBreeze documentation
  url: https://docs.signupbreeze.com/api-reference/introduction
paths:
  /v1/events/{event_id}/slots:
    parameters:
      - in: path
        name: event_id
        description: The ID of the event.
        example: 019fdf11-4bb2-7039-92c3-9e7f1ee711a1
        required: true
        schema:
          type: string
      - in: path
        name: event
        description: The event's id.
        example: 019fdf11-4bb2-7039-92c3-9e7f1ee711a1
        required: true
        schema:
          type: string
    post:
      tags:
        - Shifts
      summary: Add a shift
      description: >-
        Adds a shift to an existing event. Times are wall-clock (`14:30`) and
        are read in

        the event's own timezone — do not send an offset or a date.


        Requires the `slots:write` scope.
      operationId: addAShift
      parameters:
        - in: header
          name: Idempotency-Key
          description: ''
          example: a7f3c1e0-2b44-4f6e-9c1d-8e5b0a2d7f31
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: What the shift is called.
                  example: Grill Master
                location:
                  type: string
                  description: Where this shift happens, if not the event location.
                  example: North gate
                  nullable: true
                start_time:
                  type: string
                  description: Wall-clock start as HH:MM. Omit for an all-day shift.
                  example: '11:00'
                  nullable: true
                end_time:
                  type: string
                  description: Wall-clock end as HH:MM. Must be after start_time.
                  example: '13:00'
                  nullable: true
                capacity:
                  type: integer
                  description: How many volunteers are needed. Your plan caps the maximum.
                  example: 4
              required:
                - title
                - capacity
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 019ff256-ece7-7109-b06e-fd801fcc2ba1
                    event_id: 019ff256-ece6-731f-a2ca-97baa9200f82
                    title: Setup Team
                    location: null
                    is_virtual: false
                    start_time: '2026-10-28T00:14:13+00:00'
                    end_time: '2026-10-28T02:14:13+00:00'
                    capacity: 10
                    filled: 0
                    remaining: 10
                    created_at: '2026-08-11T19:40:10+00:00'
                    updated_at: '2026-08-11T19:40:10+00:00'
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        example: 019ff256-ece7-7109-b06e-fd801fcc2ba1
                      event_id:
                        type: string
                        example: 019ff256-ece6-731f-a2ca-97baa9200f82
                      title:
                        type: string
                        example: Setup Team
                      location:
                        type: string
                        example: null
                        nullable: true
                      is_virtual:
                        type: boolean
                        example: false
                      start_time:
                        type: string
                        example: '2026-10-28T00:14:13+00:00'
                      end_time:
                        type: string
                        example: '2026-10-28T02:14:13+00:00'
                      capacity:
                        type: integer
                        example: 10
                      filled:
                        type: integer
                        example: 0
                      remaining:
                        type: integer
                        example: 10
                      created_at:
                        type: string
                        example: '2026-08-11T19:40:10+00:00'
                      updated_at:
                        type: string
                        example: '2026-08-11T19:40:10+00:00'
        '404':
          description: no such event, or it belongs to another organization
          content:
            application/json:
              schema:
                type: object
                example:
                  message: Not found.
                properties:
                  message:
                    type: string
                    example: Not found.
        '422':
          description: capacity exceeds the plan limit
          content:
            application/json:
              schema:
                type: object
                example:
                  message: The capacity field must not be greater than 100.
                  errors:
                    capacity:
                      - The capacity field must not be greater than 100.
                properties:
                  message:
                    type: string
                    example: The capacity field must not be greater than 100.
                  errors:
                    type: object
                    properties:
                      capacity:
                        type: array
                        example:
                          - The capacity field must not be greater than 100.
                        items:
                          type: string
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: >-
        Create a token under <b>Organization settings → API</b>. Tokens are
        shown once, on creation. They belong to the organization, not to you, so
        they keep working if you leave the team. API access is included on every
        plan; the rate limit depends on the plan.

````