openapi: 3.0.3
info:
  title: 'SchedulingKit API Documentation'
  description: 'RESTful API for managing bookings, event types, clients, invoices, and more.'
  version: 1.0.0
servers:
  -
    url: 'https://app.schedulingkit.com'
tags:
  -
    name: Authentication
    description: ''
  -
    name: Team
    description: ''
  -
    name: 'Event Types'
    description: ''
  -
    name: Events
    description: ''
  -
    name: Clients
    description: ''
  -
    name: Locations
    description: ''
  -
    name: Workflows
    description: ''
  -
    name: Finance
    description: ''
  -
    name: Other
    description: ''
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: 'You can generate API tokens from your team settings. Navigate to <b>Settings → API Tokens</b> and click <b>Create API Token</b>.'
security:
  -
    default: []
paths:
  /api/v1/auth/login:
    post:
      summary: Login
      operationId: login
      description: 'Authenticate with email and password to receive an API token.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  token: 1|abc123...
                  user:
                    id: 1
                    name: 'Jane Smith'
                    email: user@example.com
                    phone: '+1234567890'
                    timezone: America/New_York
                    current_team:
                      id: 1
                      name: 'My Business'
                      slug: my-business
                properties:
                  token:
                    type: string
                    example: 1|abc123...
                  user:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Jane Smith'
                      email:
                        type: string
                        example: user@example.com
                      phone:
                        type: string
                        example: '+1234567890'
                      timezone:
                        type: string
                        example: America/New_York
                      current_team:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          name:
                            type: string
                            example: 'My Business'
                          slug:
                            type: string
                            example: my-business
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The given data was invalid.'
                  errors:
                    email:
                      - 'These credentials do not match our records.'
                properties:
                  message:
                    type: string
                    example: 'The given data was invalid.'
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'These credentials do not match our records.'
                        items:
                          type: string
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: "The user's email address."
                  example: user@example.com
                password:
                  type: string
                  description: "The user's password."
                  example: password123
                device_name:
                  type: string
                  description: 'A name for the device/application requesting the token.'
                  example: 'My App'
              required:
                - email
                - password
                - device_name
      security: []
  /api/v1/auth/me:
    get:
      summary: 'Get authenticated user'
      operationId: getAuthenticatedUser
      description: "Retrieve the currently authenticated user's profile and team info."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  user:
                    id: 1
                    name: 'Jane Smith'
                    email: user@example.com
                    phone: '+1234567890'
                    timezone: America/New_York
                    current_team:
                      id: 1
                      name: 'My Business'
                      slug: my-business
                properties:
                  user:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Jane Smith'
                      email:
                        type: string
                        example: user@example.com
                      phone:
                        type: string
                        example: '+1234567890'
                      timezone:
                        type: string
                        example: America/New_York
                      current_team:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          name:
                            type: string
                            example: 'My Business'
                          slug:
                            type: string
                            example: my-business
      tags:
        - Authentication
  /api/v1/auth/logout:
    post:
      summary: Logout
      operationId: logout
      description: 'Revoke the current API token.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Logged out successfully.'
                properties:
                  message:
                    type: string
                    example: 'Logged out successfully.'
      tags:
        - Authentication
  /api/v1/team:
    get:
      summary: 'Get current team details'
      operationId: getCurrentTeamDetails
      description: 'Retrieve your current team including members, owner, and settings.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: 'My Business'
                    slug: my-business
                    owner:
                      id: 1
                      name: 'Jane Smith'
                      email: jane@example.com
                    users: []
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'My Business'
                      slug:
                        type: string
                        example: my-business
                      owner:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          name:
                            type: string
                            example: 'Jane Smith'
                          email:
                            type: string
                            example: jane@example.com
                      users:
                        type: array
                        example: []
      tags:
        - Team
    put:
      summary: 'Update team details'
      operationId: updateTeamDetails
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Team updated successfully.'
                  data:
                    id: 1
                    name: 'My Business'
                    slug: my-business
                properties:
                  message:
                    type: string
                    example: 'Team updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'My Business'
                      slug:
                        type: string
                        example: my-business
      tags:
        - Team
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The team name.'
                  example: 'My Business'
  /api/v1/event-types:
    get:
      summary: "List team's event types"
      operationId: listTeamsEventTypes
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      name: '30-min Consultation'
                      slug: 30-min-consultation
                      duration: 30
                      color: '#3B82F6'
                      is_active: true
                      requires_payment: false
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: '30-min Consultation'
                        slug: 30-min-consultation
                        duration: 30
                        color: '#3B82F6'
                        is_active: true
                        requires_payment: false
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: '30-min Consultation'
                        slug:
                          type: string
                          example: 30-min-consultation
                        duration:
                          type: integer
                          example: 30
                        color:
                          type: string
                          example: '#3B82F6'
                        is_active:
                          type: boolean
                          example: true
                        requires_payment:
                          type: boolean
                          example: false
      tags:
        - 'Event Types'
    post:
      summary: 'Create a new event type'
      operationId: createANewEventType
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event type created successfully.'
                  data:
                    id: 1
                    name: '30-min Consultation'
                    duration: 30
                properties:
                  message:
                    type: string
                    example: 'Event type created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: '30-min Consultation'
                      duration:
                        type: integer
                        example: 30
      tags:
        - 'Event Types'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The event type name.'
                  example: '30-min Consultation'
                duration:
                  type: integer
                  description: 'Duration in minutes.'
                  example: 30
                color:
                  type: string
                  description: 'The hex color code.'
                  example: '#3B82F6'
                location_type:
                  type: string
                  description: 'The meeting location type (zoom, google_meet, teams, phone, in_person).'
                  example: zoom
                increment_minutes:
                  type: integer
                  description: 'Scheduling increment in minutes.'
                  example: 15
                requires_payment:
                  type: boolean
                  description: 'Whether payment is required.'
                  example: false
                price:
                  type: number
                  description: 'The price if payment is required.'
                  example: 50.0
                currency:
                  type: string
                  description: 'The currency code.'
                  example: USD
                is_active:
                  type: boolean
                  description: 'Whether the event type is active.'
                  example: true
                description:
                  type: string
                  description: 'A description of the event type.'
                  example: 'A quick consultation to discuss your needs'
              required:
                - name
                - duration
  '/api/v1/event-types/{id}':
    get:
      summary: 'Get a single event type'
      operationId: getASingleEventType
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: '30-min Consultation'
                    slug: 30-min-consultation
                    duration: 30
                    color: '#3B82F6'
                    is_active: true
                    location_type: zoom
                    requires_payment: false
                    price: 0
                    increment_minutes: 15
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: '30-min Consultation'
                      slug:
                        type: string
                        example: 30-min-consultation
                      duration:
                        type: integer
                        example: 30
                      color:
                        type: string
                        example: '#3B82F6'
                      is_active:
                        type: boolean
                        example: true
                      location_type:
                        type: string
                        example: zoom
                      requires_payment:
                        type: boolean
                        example: false
                      price:
                        type: integer
                        example: 0
                      increment_minutes:
                        type: integer
                        example: 15
      tags:
        - 'Event Types'
    put:
      summary: 'Update an event type'
      operationId: updateAnEventType
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event type updated successfully.'
                  data:
                    id: 1
                    name: '30-min Consultation'
                    duration: 30
                properties:
                  message:
                    type: string
                    example: 'Event type updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: '30-min Consultation'
                      duration:
                        type: integer
                        example: 30
      tags:
        - 'Event Types'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The event type name.'
                  example: '30-min Consultation'
                duration:
                  type: integer
                  description: 'Duration in minutes.'
                  example: 30
                color:
                  type: string
                  description: 'The hex color code.'
                  example: '#3B82F6'
                location_type:
                  type: string
                  description: 'The meeting location type (zoom, google_meet, teams, phone, in_person).'
                  example: zoom
                increment_minutes:
                  type: integer
                  description: 'Scheduling increment in minutes.'
                  example: 15
                requires_payment:
                  type: boolean
                  description: 'Whether payment is required.'
                  example: false
                price:
                  type: number
                  description: 'The price if payment is required.'
                  example: 50.0
                is_active:
                  type: boolean
                  description: 'Whether the event type is active.'
                  example: true
                description:
                  type: string
                  description: 'A description of the event type.'
                  example: 'A quick consultation to discuss your needs'
    delete:
      summary: 'Delete an event type'
      operationId: deleteAnEventType
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event type deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Event type deleted successfully.'
      tags:
        - 'Event Types'
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the event type.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/events:
    get:
      summary: 'List all events'
      operationId: listAllEvents
      description: 'Get a paginated list of all events (bookings) for your team.'
      parameters:
        -
          in: query
          name: page
          description: 'Page number for pagination.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Page number for pagination.'
            example: 1
        -
          in: query
          name: per_page
          description: 'Number of items per page.'
          example: 50
          required: false
          schema:
            type: integer
            description: 'Number of items per page.'
            example: 50
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      event_type_id: 5
                      customer_id: 10
                      date: '2026-02-15'
                      start_time: '2026-02-15T14:00:00Z'
                      end_time: '2026-02-15T15:00:00Z'
                      status: scheduled
                      invitee_name: 'John Doe'
                      invitee_email: john@example.com
                      event_type:
                        id: 5
                        name: Consultation
                        duration: 60
                  meta:
                    current_page: 1
                    total: 150
                    per_page: 50
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        event_type_id: 5
                        customer_id: 10
                        date: '2026-02-15'
                        start_time: '2026-02-15T14:00:00Z'
                        end_time: '2026-02-15T15:00:00Z'
                        status: scheduled
                        invitee_name: 'John Doe'
                        invitee_email: john@example.com
                        event_type:
                          id: 5
                          name: Consultation
                          duration: 60
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        event_type_id:
                          type: integer
                          example: 5
                        customer_id:
                          type: integer
                          example: 10
                        date:
                          type: string
                          example: '2026-02-15'
                        start_time:
                          type: string
                          example: '2026-02-15T14:00:00Z'
                        end_time:
                          type: string
                          example: '2026-02-15T15:00:00Z'
                        status:
                          type: string
                          example: scheduled
                        invitee_name:
                          type: string
                          example: 'John Doe'
                        invitee_email:
                          type: string
                          example: john@example.com
                        event_type:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 5
                            name:
                              type: string
                              example: Consultation
                            duration:
                              type: integer
                              example: 60
                  meta:
                    type: object
                    properties:
                      current_page:
                        type: integer
                        example: 1
                      total:
                        type: integer
                        example: 150
                      per_page:
                        type: integer
                        example: 50
      tags:
        - Events
    post:
      summary: 'Create a new event'
      operationId: createANewEvent
      description: 'Create a new booking/event. Supports both one-time and recurring events. If the event type requires payment, include payment details.'
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Booking scheduled successfully'
                  data:
                    id: 1
                    event_type_id: 5
                    start_time: '2026-02-15T14:00:00Z'
                    end_time: '2026-02-15T15:00:00Z'
                    status: scheduled
                    invitee_name: 'John Doe'
                    invitee_email: john@example.com
                properties:
                  message:
                    type: string
                    example: 'Booking scheduled successfully'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      event_type_id:
                        type: integer
                        example: 5
                      start_time:
                        type: string
                        example: '2026-02-15T14:00:00Z'
                      end_time:
                        type: string
                        example: '2026-02-15T15:00:00Z'
                      status:
                        type: string
                        example: scheduled
                      invitee_name:
                        type: string
                        example: 'John Doe'
                      invitee_email:
                        type: string
                        example: john@example.com
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Validation error'
                  errors:
                    invitee_email:
                      - 'The invitee email field is required.'
                properties:
                  message:
                    type: string
                    example: 'Validation error'
                  errors:
                    type: object
                    properties:
                      invitee_email:
                        type: array
                        example:
                          - 'The invitee email field is required.'
                        items:
                          type: string
      tags:
        - Events
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                event_type_id:
                  type: integer
                  description: 'The ID of the event type to book.'
                  example: 5
                start_time:
                  type: string
                  description: 'The start time in ISO 8601 format.'
                  example: '2026-02-15T14:00:00Z'
                end_time:
                  type: string
                  description: 'The end time in ISO 8601 format.'
                  example: '2026-02-15T15:00:00Z'
                invitee_name:
                  type: string
                  description: 'The name of the person booking.'
                  example: 'John Doe'
                invitee_email:
                  type: string
                  description: 'The email of the person booking.'
                  example: john@example.com
                invitee_phone:
                  type: string
                  description: 'The phone number of the person booking.'
                  example: '+1234567890'
                  nullable: true
                notes:
                  type: string
                  description: 'Additional notes or comments.'
                  example: 'Please bring ID'
                  nullable: true
                invitee_timezone:
                  type: string
                  description: 'The timezone of the invitee.'
                  example: America/New_York
                  nullable: true
                location_id:
                  type: integer
                  description: 'The ID of the location.'
                  example: 2
                  nullable: true
                staff_id:
                  type: integer
                  description: 'The ID of the staff member.'
                  example: 3
                  nullable: true
                meeting_type:
                  type: string
                  description: 'The type of meeting.'
                  example: zoom
                  nullable: true
                extras:
                  type: array
                  description: 'Array of extra service IDs.'
                  example:
                    - 1
                    - 2
                  items:
                    type: string
                coupon_code:
                  type: string
                  description: 'Coupon code for discount.'
                  example: SAVE20
                  nullable: true
                answers:
                  type: object
                  description: 'Answers to custom questions.'
                  example:
                    1: 'Answer to question 1'
                  properties: {  }
                is_recurring:
                  type: boolean
                  description: 'Whether this is a recurring event.'
                  example: true
                  nullable: true
                recurrence_frequency:
                  type: string
                  description: 'Required if is_recurring is true. One of: daily, weekly, biweekly, monthly.'
                  example: weekly
                  nullable: true
                recurrence_days:
                  type: array
                  description: 'Array of weekday numbers (0=Sunday, 6=Saturday).'
                  example:
                    - 1
                    - 3
                    - 5
                  items:
                    type: string
                recurrence_count:
                  type: integer
                  description: 'Number of occurrences.'
                  example: 10
                  nullable: true
                recurrence_end_date:
                  type: string
                  description: 'End date for recurrence.'
                  example: '2026-06-15'
                  nullable: true
                recurring_payment_mode:
                  type: string
                  description: 'Payment mode for recurring: first_only or all.'
                  example: first_only
                  nullable: true
                payment_provider:
                  type: string
                  description: 'Required if payment needed. One of: stripe, paypal.'
                  example: stripe
                payment_token:
                  type: string
                  description: 'Required if payment needed. Payment token from provider.'
                  example: tok_visa
              required:
                - event_type_id
                - start_time
                - end_time
                - invitee_name
                - invitee_email
  '/api/v1/events/{id}':
    get:
      summary: 'Get a single event'
      operationId: getASingleEvent
      description: 'Retrieve detailed information about a specific event including related data like customer, location, extras, and recurring occurrences.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    event_type_id: 5
                    customer_id: 10
                    date: '2026-02-15'
                    start_time: '2026-02-15T14:00:00Z'
                    end_time: '2026-02-15T15:00:00Z'
                    status: scheduled
                    invitee_name: 'John Doe'
                    invitee_email: john@example.com
                    invitee_phone: '+1234567890'
                    notes: 'Please bring ID'
                    is_recurring: true
                    recurrence_frequency: weekly
                    event_type:
                      id: 5
                      name: Consultation
                      duration: 60
                    customer:
                      id: 10
                      name: 'John Doe'
                      email: john@example.com
                    location:
                      id: 2
                      name: 'Main Office'
                    extras: []
                    occurrences: []
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      event_type_id:
                        type: integer
                        example: 5
                      customer_id:
                        type: integer
                        example: 10
                      date:
                        type: string
                        example: '2026-02-15'
                      start_time:
                        type: string
                        example: '2026-02-15T14:00:00Z'
                      end_time:
                        type: string
                        example: '2026-02-15T15:00:00Z'
                      status:
                        type: string
                        example: scheduled
                      invitee_name:
                        type: string
                        example: 'John Doe'
                      invitee_email:
                        type: string
                        example: john@example.com
                      invitee_phone:
                        type: string
                        example: '+1234567890'
                      notes:
                        type: string
                        example: 'Please bring ID'
                      is_recurring:
                        type: boolean
                        example: true
                      recurrence_frequency:
                        type: string
                        example: weekly
                      event_type:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 5
                          name:
                            type: string
                            example: Consultation
                          duration:
                            type: integer
                            example: 60
                      customer:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 10
                          name:
                            type: string
                            example: 'John Doe'
                          email:
                            type: string
                            example: john@example.com
                      location:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 2
                          name:
                            type: string
                            example: 'Main Office'
                      extras:
                        type: array
                        example: []
                      occurrences:
                        type: array
                        example: []
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event not found'
                properties:
                  message:
                    type: string
                    example: 'Event not found'
      tags:
        - Events
    put:
      summary: 'Update an event'
      operationId: updateAnEvent
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Events
    delete:
      summary: 'Cancel an event'
      operationId: cancelAnEvent
      description: 'Cancel a scheduled event. This will update the status to cancelled and send notifications.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event cancelled successfully'
                  data:
                    id: 1
                    status: cancelled
                    cancellation_reason: 'Schedule conflict'
                properties:
                  message:
                    type: string
                    example: 'Event cancelled successfully'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      status:
                        type: string
                        example: cancelled
                      cancellation_reason:
                        type: string
                        example: 'Schedule conflict'
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event not found'
                properties:
                  message:
                    type: string
                    example: 'Event not found'
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Event is already cancelled'
                properties:
                  message:
                    type: string
                    example: 'Event is already cancelled'
      tags:
        - Events
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string
                  description: 'Optional cancellation reason.'
                  example: 'Schedule conflict'
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the event.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/v1/events/{id}/occurrences':
    get:
      summary: 'Get recurring event occurrences'
      operationId: getRecurringEventOccurrences
      description: 'Retrieve all occurrences in a recurring event series. Only works for parent events in a recurring series.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 2
                      date: '2026-02-15'
                      start_time: '2026-02-15T14:00:00Z'
                      end_time: '2026-02-15T15:00:00Z'
                      status: scheduled
                    -
                      id: 3
                      date: '2026-02-22'
                      start_time: '2026-02-22T14:00:00Z'
                      end_time: '2026-02-22T15:00:00Z'
                      status: scheduled
                  meta:
                    total_count: 10
                    frequency: weekly
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 2
                        date: '2026-02-15'
                        start_time: '2026-02-15T14:00:00Z'
                        end_time: '2026-02-15T15:00:00Z'
                        status: scheduled
                      -
                        id: 3
                        date: '2026-02-22'
                        start_time: '2026-02-22T14:00:00Z'
                        end_time: '2026-02-22T15:00:00Z'
                        status: scheduled
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        date:
                          type: string
                          example: '2026-02-15'
                        start_time:
                          type: string
                          example: '2026-02-15T14:00:00Z'
                        end_time:
                          type: string
                          example: '2026-02-15T15:00:00Z'
                        status:
                          type: string
                          example: scheduled
                  meta:
                    type: object
                    properties:
                      total_count:
                        type: integer
                        example: 10
                      frequency:
                        type: string
                        example: weekly
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'This event is not a recurring series parent'
                properties:
                  message:
                    type: string
                    example: 'This event is not a recurring series parent'
      tags:
        - Events
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the event.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/clients:
    get:
      summary: "List team's clients"
      operationId: listTeamsClients
      description: 'Get a paginated list of all clients for your team.'
      parameters:
        -
          in: query
          name: page
          description: 'Page number for pagination.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Page number for pagination.'
            example: 1
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      name: 'John Doe'
                      email: john@example.com
                      phone: '+1234567890'
                  meta:
                    current_page: 1
                    total: 25
                    per_page: 50
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'John Doe'
                        email: john@example.com
                        phone: '+1234567890'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'John Doe'
                        email:
                          type: string
                          example: john@example.com
                        phone:
                          type: string
                          example: '+1234567890'
                  meta:
                    type: object
                    properties:
                      current_page:
                        type: integer
                        example: 1
                      total:
                        type: integer
                        example: 25
                      per_page:
                        type: integer
                        example: 50
      tags:
        - Clients
    post:
      summary: 'Create a new client'
      operationId: createANewClient
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Client created successfully.'
                  data:
                    id: 1
                    name: 'John Doe'
                    email: john@example.com
                    phone: '+1234567890'
                properties:
                  message:
                    type: string
                    example: 'Client created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'John Doe'
                      email:
                        type: string
                        example: john@example.com
                      phone:
                        type: string
                        example: '+1234567890'
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: Error
                  errors:
                    email:
                      - 'The email has already been taken.'
                properties:
                  message:
                    type: string
                    example: Error
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'The email has already been taken.'
                        items:
                          type: string
      tags:
        - Clients
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: "The client's full name."
                  example: 'John Doe'
                email:
                  type: string
                  description: "The client's email address."
                  example: john@example.com
                phone:
                  type: string
                  description: "The client's phone number."
                  example: '+1234567890'
                  nullable: true
                notes:
                  type: string
                  description: 'Any notes about the client.'
                  example: 'VIP customer'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the client is active.'
                  example: true
                  nullable: true
              required:
                - name
                - email
  '/api/v1/clients/{id}':
    get:
      summary: 'Get a single client'
      operationId: getASingleClient
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: 'John Doe'
                    email: john@example.com
                    phone: '+1234567890'
                    notes: 'VIP customer'
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'John Doe'
                      email:
                        type: string
                        example: john@example.com
                      phone:
                        type: string
                        example: '+1234567890'
                      notes:
                        type: string
                        example: 'VIP customer'
      tags:
        - Clients
    put:
      summary: 'Update a client'
      operationId: updateAClient
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Client updated successfully.'
                  data:
                    id: 1
                    name: 'John Doe'
                    email: john@example.com
                properties:
                  message:
                    type: string
                    example: 'Client updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'John Doe'
                      email:
                        type: string
                        example: john@example.com
      tags:
        - Clients
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: "The client's full name."
                  example: 'John Doe'
                email:
                  type: string
                  description: "The client's email address."
                  example: john@example.com
                phone:
                  type: string
                  description: "The client's phone number."
                  example: '+1234567890'
                  nullable: true
                notes:
                  type: string
                  description: 'Any notes about the client.'
                  example: 'VIP customer'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the client is active.'
                  example: true
                  nullable: true
    delete:
      summary: 'Delete a client'
      operationId: deleteAClient
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Client deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Client deleted successfully.'
      tags:
        - Clients
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the client.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/locations:
    get:
      summary: "List team's locations"
      operationId: listTeamsLocations
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      name: 'Main Office'
                      address: '123 Main St'
                      city: 'New York'
                      state: NY
                      country: US
                      is_active: true
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Main Office'
                        address: '123 Main St'
                        city: 'New York'
                        state: NY
                        country: US
                        is_active: true
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Main Office'
                        address:
                          type: string
                          example: '123 Main St'
                        city:
                          type: string
                          example: 'New York'
                        state:
                          type: string
                          example: NY
                        country:
                          type: string
                          example: US
                        is_active:
                          type: boolean
                          example: true
      tags:
        - Locations
    post:
      summary: 'Create a new location'
      operationId: createANewLocation
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Location created successfully.'
                  data:
                    id: 1
                    name: 'Main Office'
                    address: '123 Main St'
                    city: 'New York'
                properties:
                  message:
                    type: string
                    example: 'Location created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Main Office'
                      address:
                        type: string
                        example: '123 Main St'
                      city:
                        type: string
                        example: 'New York'
      tags:
        - Locations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The location name.'
                  example: 'Main Office'
                address:
                  type: string
                  description: 'The street address.'
                  example: '123 Main St'
                  nullable: true
                city:
                  type: string
                  description: 'The city.'
                  example: 'New York'
                  nullable: true
                state:
                  type: string
                  description: 'The state or province.'
                  example: NY
                  nullable: true
                zip:
                  type: string
                  description: 'The postal/zip code.'
                  example: '10001'
                  nullable: true
                country:
                  type: string
                  description: 'The country.'
                  example: US
                  nullable: true
                phone:
                  type: string
                  description: 'The location phone number.'
                  example: '+1234567890'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the location is active.'
                  example: true
                  nullable: true
              required:
                - name
  '/api/v1/locations/{id}':
    get:
      summary: 'Get a single location'
      operationId: getASingleLocation
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: 'Main Office'
                    address: '123 Main St'
                    city: 'New York'
                    state: NY
                    country: US
                    phone: '+1234567890'
                    is_active: true
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Main Office'
                      address:
                        type: string
                        example: '123 Main St'
                      city:
                        type: string
                        example: 'New York'
                      state:
                        type: string
                        example: NY
                      country:
                        type: string
                        example: US
                      phone:
                        type: string
                        example: '+1234567890'
                      is_active:
                        type: boolean
                        example: true
      tags:
        - Locations
    put:
      summary: 'Update a location'
      operationId: updateALocation
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Location updated successfully.'
                  data:
                    id: 1
                    name: 'Main Office'
                    address: '123 Main St'
                properties:
                  message:
                    type: string
                    example: 'Location updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Main Office'
                      address:
                        type: string
                        example: '123 Main St'
      tags:
        - Locations
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The location name.'
                  example: 'Main Office'
                address:
                  type: string
                  description: 'The street address.'
                  example: '123 Main St'
                  nullable: true
                city:
                  type: string
                  description: 'The city.'
                  example: 'New York'
                  nullable: true
                state:
                  type: string
                  description: 'The state or province.'
                  example: NY
                  nullable: true
                zip:
                  type: string
                  description: 'The postal/zip code.'
                  example: '10001'
                  nullable: true
                country:
                  type: string
                  description: 'The country.'
                  example: US
                  nullable: true
                phone:
                  type: string
                  description: 'The location phone number.'
                  example: '+1234567890'
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the location is active.'
                  example: true
                  nullable: true
    delete:
      summary: 'Delete a location'
      operationId: deleteALocation
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Location deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Location deleted successfully.'
      tags:
        - Locations
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the location.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/workflows:
    get:
      summary: "List team's workflows"
      operationId: listTeamsWorkflows
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      name: 'Follow-up Email'
                      trigger_type: after_event
                      is_active: true
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Follow-up Email'
                        trigger_type: after_event
                        is_active: true
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Follow-up Email'
                        trigger_type:
                          type: string
                          example: after_event
                        is_active:
                          type: boolean
                          example: true
      tags:
        - Workflows
    post:
      summary: 'Create a new workflow'
      operationId: createANewWorkflow
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Workflow created successfully.'
                  data:
                    id: 1
                    name: 'Follow-up Email'
                    trigger_type: after_event
                properties:
                  message:
                    type: string
                    example: 'Workflow created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Follow-up Email'
                      trigger_type:
                        type: string
                        example: after_event
      tags:
        - Workflows
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The workflow name.'
                  example: 'Follow-up Email'
                event_type_id:
                  type: integer
                  description: 'The event type this workflow applies to.'
                  example: 5
                  nullable: true
                trigger_type:
                  type: string
                  description: 'The trigger type (before_event, after_event, on_booking, on_cancellation).'
                  example: after_event
                trigger_time:
                  type: integer
                  description: 'Time in minutes relative to the trigger.'
                  example: 60
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the workflow is active.'
                  example: true
                  nullable: true
                actions:
                  type: array
                  description: 'The workflow actions.'
                  example:
                    - architecto
                  items:
                    type: string
              required:
                - name
                - trigger_type
  '/api/v1/workflows/{id}':
    get:
      summary: 'Get a single workflow'
      operationId: getASingleWorkflow
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: 'Follow-up Email'
                    trigger_type: after_event
                    trigger_time: 60
                    is_active: true
                    actions: []
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Follow-up Email'
                      trigger_type:
                        type: string
                        example: after_event
                      trigger_time:
                        type: integer
                        example: 60
                      is_active:
                        type: boolean
                        example: true
                      actions:
                        type: array
                        example: []
      tags:
        - Workflows
    put:
      summary: 'Update a workflow'
      operationId: updateAWorkflow
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Workflow updated successfully.'
                  data:
                    id: 1
                    name: 'Follow-up Email'
                    trigger_type: after_event
                properties:
                  message:
                    type: string
                    example: 'Workflow updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Follow-up Email'
                      trigger_type:
                        type: string
                        example: after_event
      tags:
        - Workflows
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The workflow name.'
                  example: 'Follow-up Email'
                event_type_id:
                  type: integer
                  description: 'The event type this workflow applies to.'
                  example: 5
                  nullable: true
                trigger_type:
                  type: string
                  description: 'The trigger type (before_event, after_event, on_booking, on_cancellation).'
                  example: after_event
                trigger_time:
                  type: integer
                  description: 'Time in minutes relative to the trigger.'
                  example: 60
                  nullable: true
                is_active:
                  type: boolean
                  description: 'Whether the workflow is active.'
                  example: true
                  nullable: true
                actions:
                  type: array
                  description: 'The workflow actions.'
                  example:
                    - architecto
                  items:
                    type: string
    delete:
      summary: 'Delete a workflow'
      operationId: deleteAWorkflow
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Workflow deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Workflow deleted successfully.'
      tags:
        - Workflows
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the workflow.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/invoices:
    get:
      summary: "List team's invoices"
      operationId: listTeamsInvoices
      description: 'Get a paginated list of all invoices for your team.'
      parameters:
        -
          in: query
          name: page
          description: 'Page number for pagination.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Page number for pagination.'
            example: 1
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      invoice_number: INV-0001
                      customer_name: 'John Doe'
                      customer_email: john@example.com
                      total: 150.0
                      status: paid
                      invoice_date: '2026-03-01'
                      due_date: '2026-03-15'
                  meta:
                    current_page: 1
                    total: 25
                    per_page: 50
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        invoice_number: INV-0001
                        customer_name: 'John Doe'
                        customer_email: john@example.com
                        total: 150
                        status: paid
                        invoice_date: '2026-03-01'
                        due_date: '2026-03-15'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        invoice_number:
                          type: string
                          example: INV-0001
                        customer_name:
                          type: string
                          example: 'John Doe'
                        customer_email:
                          type: string
                          example: john@example.com
                        total:
                          type: number
                          example: 150.0
                        status:
                          type: string
                          example: paid
                        invoice_date:
                          type: string
                          example: '2026-03-01'
                        due_date:
                          type: string
                          example: '2026-03-15'
                  meta:
                    type: object
                    properties:
                      current_page:
                        type: integer
                        example: 1
                      total:
                        type: integer
                        example: 25
                      per_page:
                        type: integer
                        example: 50
      tags:
        - Finance
    post:
      summary: 'Create a new invoice'
      operationId: createANewInvoice
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invoice created successfully.'
                  data:
                    id: 1
                    invoice_number: INV-0001
                    total: 150.0
                    status: draft
                properties:
                  message:
                    type: string
                    example: 'Invoice created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      invoice_number:
                        type: string
                        example: INV-0001
                      total:
                        type: number
                        example: 150.0
                      status:
                        type: string
                        example: draft
      tags:
        - Finance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_name:
                  type: string
                  description: "The customer's name."
                  example: 'John Doe'
                customer_email:
                  type: string
                  description: "The customer's email."
                  example: john@example.com
                invoice_date:
                  type: string
                  description: 'The invoice date (YYYY-MM-DD).'
                  example: '2026-03-01'
                due_date:
                  type: string
                  description: 'The due date (YYYY-MM-DD).'
                  example: '2026-03-15'
                currency:
                  type: string
                  description: 'The currency code.'
                  example: USD
                  nullable: true
                items:
                  type: array
                  description: 'The invoice line items.'
                  example:
                    - architecto
                  items:
                    type: string
                tax_rate:
                  type: number
                  description: 'The tax rate percentage.'
                  example: 8.5
                  nullable: true
                discount_amount:
                  type: number
                  description: 'The discount amount.'
                  example: 0.0
                  nullable: true
                notes:
                  type: string
                  description: 'Any notes for the invoice.'
                  example: 'Thank you for your business'
                  nullable: true
              required:
                - customer_name
                - customer_email
                - invoice_date
                - due_date
                - items
  '/api/v1/invoices/{id}':
    get:
      summary: 'Get a single invoice'
      operationId: getASingleInvoice
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    invoice_number: INV-0001
                    customer_name: 'John Doe'
                    customer_email: john@example.com
                    total: 150.0
                    status: paid
                    invoice_date: '2026-03-01'
                    due_date: '2026-03-15'
                    items: []
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      invoice_number:
                        type: string
                        example: INV-0001
                      customer_name:
                        type: string
                        example: 'John Doe'
                      customer_email:
                        type: string
                        example: john@example.com
                      total:
                        type: number
                        example: 150.0
                      status:
                        type: string
                        example: paid
                      invoice_date:
                        type: string
                        example: '2026-03-01'
                      due_date:
                        type: string
                        example: '2026-03-15'
                      items:
                        type: array
                        example: []
      tags:
        - Finance
    put:
      summary: 'Update an invoice'
      operationId: updateAnInvoice
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invoice updated successfully.'
                  data:
                    id: 1
                    invoice_number: INV-0001
                    total: 150.0
                properties:
                  message:
                    type: string
                    example: 'Invoice updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      invoice_number:
                        type: string
                        example: INV-0001
                      total:
                        type: number
                        example: 150.0
      tags:
        - Finance
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_name:
                  type: string
                  description: "The customer's name."
                  example: 'John Doe'
                customer_email:
                  type: string
                  description: "The customer's email."
                  example: john@example.com
                due_date:
                  type: string
                  description: 'The due date (YYYY-MM-DD).'
                  example: '2026-03-15'
                items:
                  type: array
                  description: 'The invoice line items.'
                  example:
                    - architecto
                  items:
                    type: string
                tax_rate:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 15
                  nullable: true
                discount_amount:
                  type: number
                  description: 'Must be at least 0.'
                  example: 76
                  nullable: true
                notes:
                  type: string
                  description: 'Any notes for the invoice.'
                  example: 'Thank you for your business'
                  nullable: true
    delete:
      summary: 'Delete an invoice'
      operationId: deleteAnInvoice
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invoice deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Invoice deleted successfully.'
      tags:
        - Finance
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/transactions:
    get:
      summary: "List team's transactions"
      operationId: listTeamsTransactions
      description: 'Get a paginated list of all payment transactions for your team.'
      parameters:
        -
          in: query
          name: page
          description: 'Page number for pagination.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Page number for pagination.'
            example: 1
        -
          in: query
          name: status
          description: 'Filter by status (completed, pending, failed, refunded).'
          example: completed
          required: false
          schema:
            type: string
            description: 'Filter by status (completed, pending, failed, refunded).'
            example: completed
        -
          in: query
          name: type
          description: 'Filter by type.'
          example: payment
          required: false
          schema:
            type: string
            description: 'Filter by type.'
            example: payment
        -
          in: query
          name: provider
          description: 'Filter by payment provider (stripe, paypal).'
          example: stripe
          required: false
          schema:
            type: string
            description: 'Filter by payment provider (stripe, paypal).'
            example: stripe
        -
          in: query
          name: date_from
          description: 'Filter from date (YYYY-MM-DD).'
          example: '2026-01-01'
          required: false
          schema:
            type: string
            description: 'Filter from date (YYYY-MM-DD).'
            example: '2026-01-01'
        -
          in: query
          name: date_to
          description: 'Filter to date (YYYY-MM-DD).'
          example: '2026-03-31'
          required: false
          schema:
            type: string
            description: 'Filter to date (YYYY-MM-DD).'
            example: '2026-03-31'
        -
          in: query
          name: search
          description: 'Search by customer name or email.'
          example: john
          required: false
          schema:
            type: string
            description: 'Search by customer name or email.'
            example: john
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      amount: 150.0
                      currency: USD
                      status: completed
                      provider: stripe
                      created_at: '2026-03-01T12:00:00Z'
                  meta:
                    current_page: 1
                    total: 50
                    per_page: 50
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        amount: 150
                        currency: USD
                        status: completed
                        provider: stripe
                        created_at: '2026-03-01T12:00:00Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        amount:
                          type: number
                          example: 150.0
                        currency:
                          type: string
                          example: USD
                        status:
                          type: string
                          example: completed
                        provider:
                          type: string
                          example: stripe
                        created_at:
                          type: string
                          example: '2026-03-01T12:00:00Z'
                  meta:
                    type: object
                    properties:
                      current_page:
                        type: integer
                        example: 1
                      total:
                        type: integer
                        example: 50
                      per_page:
                        type: integer
                        example: 50
      tags:
        - Finance
  '/api/v1/transactions/{id}':
    get:
      summary: 'Get a single transaction'
      operationId: getASingleTransaction
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    amount: 150.0
                    currency: USD
                    status: completed
                    provider: stripe
                    provider_transaction_id: pi_abc123
                    created_at: '2026-03-01T12:00:00Z'
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      amount:
                        type: number
                        example: 150.0
                      currency:
                        type: string
                        example: USD
                      status:
                        type: string
                        example: completed
                      provider:
                        type: string
                        example: stripe
                      provider_transaction_id:
                        type: string
                        example: pi_abc123
                      created_at:
                        type: string
                        example: '2026-03-01T12:00:00Z'
      tags:
        - Finance
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the transaction.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/taxes:
    get:
      summary: "List team's taxes"
      operationId: listTeamsTaxes
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: 1
                      name: 'Sales Tax'
                      rate: 8.5
                      is_active: true
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Sales Tax'
                        rate: 8.5
                        is_active: true
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Sales Tax'
                        rate:
                          type: number
                          example: 8.5
                        is_active:
                          type: boolean
                          example: true
      tags:
        - Finance
    post:
      summary: 'Create a new tax'
      operationId: createANewTax
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tax created successfully.'
                  data:
                    id: 1
                    name: 'Sales Tax'
                    rate: 8.5
                    is_active: true
                properties:
                  message:
                    type: string
                    example: 'Tax created successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Sales Tax'
                      rate:
                        type: number
                        example: 8.5
                      is_active:
                        type: boolean
                        example: true
      tags:
        - Finance
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The tax name.'
                  example: 'Sales Tax'
                rate:
                  type: number
                  description: 'The tax rate percentage (0-100).'
                  example: 8.5
                is_active:
                  type: boolean
                  description: 'Whether the tax is active.'
                  example: true
                  nullable: true
              required:
                - name
                - rate
  '/api/v1/taxes/{id}':
    get:
      summary: 'Get a single tax'
      operationId: getASingleTax
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    id: 1
                    name: 'Sales Tax'
                    rate: 8.5
                    is_active: true
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Sales Tax'
                      rate:
                        type: number
                        example: 8.5
                      is_active:
                        type: boolean
                        example: true
      tags:
        - Finance
    put:
      summary: 'Update a tax'
      operationId: updateATax
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tax updated successfully.'
                  data:
                    id: 1
                    name: 'Sales Tax'
                    rate: 8.5
                    is_active: true
                properties:
                  message:
                    type: string
                    example: 'Tax updated successfully.'
                  data:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'Sales Tax'
                      rate:
                        type: number
                        example: 8.5
                      is_active:
                        type: boolean
                        example: true
      tags:
        - Finance
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The tax name.'
                  example: 'Sales Tax'
                rate:
                  type: number
                  description: 'The tax rate percentage (0-100).'
                  example: 8.5
                is_active:
                  type: boolean
                  description: 'Whether the tax is active.'
                  example: true
                  nullable: true
    delete:
      summary: 'Delete a tax'
      operationId: deleteATax
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tax deleted successfully.'
                properties:
                  message:
                    type: string
                    example: 'Tax deleted successfully.'
      tags:
        - Finance
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the tax.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/auth/device-token:
    post:
      summary: 'Register a device push token.'
      operationId: registerADevicePushToken
      description: "Stores or updates the Expo push token for the authenticated user.\nIf the token already exists for another user, it will be reassigned."
      parameters: []
      responses: {  }
      tags:
        - Other
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: b
                platform:
                  type: string
                  description: ''
                  example: fcm
                  enum:
                    - expo
                    - fcm
                    - apns
                device_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'n'
              required:
                - token
    delete:
      summary: 'Remove a device push token.'
      operationId: removeADevicePushToken
      description: 'Deactivates the push token (used on logout).'
      parameters: []
      responses: {  }
      tags:
        - Other
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: ''
                  example: architecto
              required:
                - token
