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

# Get a poll participant

> Returns one participant of a poll with their availability. The poll must belong to the space associated with the API key. This is the endpoint to call from a `poll.participant.*` webhook.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/polls/{pollId}/participants/{participantId}
openapi: 3.1.0
info:
  title: Rallly API
  description: >-
    ## Versioning


    `v1` is stable. Additive changes (new endpoints, new optional fields) may
    land on this path at any time; breaking changes only arrive under a new
    version prefix.


    ## Rate limits


    All endpoints share two limits per space: **60 requests per minute** and
    **5000 requests per day**. Both are fixed windows that open with the first
    request and reset when they expire. Both limits are per space, not per API
    key, so creating additional keys does not increase throughput.


    Every response from an authenticated request includes the standard
    `RateLimit-*` headers. Responses sent before the limiter runs (`401`, `403`,
    and the maintenance `503`) do not. `RateLimit-Policy` lists both limits;
    `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` describe
    whichever limit is closest to being exhausted. When either limit is exceeded
    the API responds with `429 Too Many Requests`, a `RATE_LIMIT_EXCEEDED` error
    body, and a `Retry-After` header indicating how many seconds to wait before
    retrying.


    If the rate limit store cannot be reached the API fails closed and responds
    with `503 Service Unavailable`, a `SERVICE_UNAVAILABLE` error body, and a
    `Retry-After` header.


    ## Dates and times


    Every poll has a `kind`. A `date` poll offers calendar days: each option
    carries a `date` in `YYYY-MM-DD` format, which is a floating date with no
    time component and no timezone, so never convert it through a timezone. A
    `time` poll offers time slots: each option carries a `startTime` as an ISO
    8601 instant in UTC and a `duration` in minutes; convert `startTime` into
    the poll's `timeZone` (or the viewer's) for display. Timestamps such as
    `createdAt` and `updatedAt` are always ISO 8601 instants in UTC.


    ## Request bodies


    Request bodies are validated strictly: a field that is not part of the
    documented schema is rejected with `VALIDATION_ERROR` rather than ignored,
    so a misspelt setting never silently falls back to its default.


    ## Enums


    Vote types are an open set. The built-in values are `yes`, `ifNeedBe` and
    `no`; new types may be added without a version change, so clients must
    tolerate values they do not recognise. `status` and `kind` are closed sets.


    ## Lists


    List endpoints return the items in `data`. `GET /polls` is paginated: it
    returns a `nextCursor` beside `data`; pass it as the `cursor` query
    parameter to fetch the next page, and it is `null` on the last page. `GET
    /polls/:pollId/participants` returns every participant in one response.


    ## Errors


    Every failure is `application/json` with the shape `{ "error": { "code",
    "message" } }`. `code` is stable and safe to branch on; `message` is
    human-readable and may change. `VALIDATION_ERROR` messages name each
    offending field.


    | Status | Code | When |

    | --- | --- | --- |

    | 400 | `VALIDATION_ERROR` | The body or query string did not match the
    schema, contained an unknown field, or the body was not valid JSON |

    | 400 | `INVALID_AUTHORIZATION_HEADER` | The `Authorization` header is not
    `Bearer <key>` |

    | 400 | `ORGANIZER_NOT_MEMBER` | The organizer email is not a member of the
    space |

    | 400 | `TOO_MANY_OPTIONS` | More than the maximum number of poll options |

    | 400 | `INAPPROPRIATE_CONTENT` | The title, description or location was
    flagged by content moderation |

    | 401 | `UNAUTHORIZED` | The API key is missing, invalid, expired or
    revoked, or its owner is banned |

    | 403 | `SPACE_NOT_PRO` | The space behind the key has no Pro subscription |

    | 404 | `NOT_FOUND` | No route matches the method and path |

    | 404 | `POLL_NOT_FOUND` | The poll does not exist or belongs to another
    space |

    | 404 | `PARTICIPANT_NOT_FOUND` | The participant does not exist or belongs
    to another poll |

    | 429 | `RATE_LIMIT_EXCEEDED` | A rate limit window is exhausted |

    | 503 | `SERVICE_UNAVAILABLE` | Maintenance, or the rate limit store cannot
    be reached |

    | 500 | `INTERNAL_ERROR` | Unexpected failure; the request id is logged |
  version: 1.0.0
servers:
  - url: https://api.rallly.co
security: []
paths:
  /v1/polls/{pollId}/participants/{participantId}:
    get:
      tags:
        - Polls
      summary: Get a poll participant
      description: >-
        Returns one participant of a poll with their availability. The poll must
        belong to the space associated with the API key. This is the endpoint to
        call from a `poll.participant.*` webhook.
      operationId: getV1PollsByPollIdParticipantsByParticipantId
      parameters:
        - schema:
            type: string
          in: path
          name: pollId
          required: true
        - schema:
            type: string
          in: path
          name: participantId
          required: true
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetPollParticipantResponse'
        '401':
          description: >-
            The API key is missing, invalid, expired or revoked, or its owner is
            banned. Includes a `WWW-Authenticate` header.
          headers:
            WWW-Authenticate:
              description: The bearer challenge, per RFC 6750.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            The space associated with the API key does not have a Pro
            subscription
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >-
            Poll not found (`POLL_NOT_FOUND`) or participant not found
            (`PARTICIPANT_NOT_FOUND`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: >-
            Rate limit exceeded. Includes a `Retry-After` header indicating how
            many seconds to wait before retrying.
          headers:
            Retry-After:
              description: Seconds to wait before retrying the request.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: >-
            The API is temporarily unavailable, for maintenance or because the
            rate limit store cannot be reached. Includes a `Retry-After` header.
            Maintenance responses are sent before the rate limiter runs and
            carry no `RateLimit-*` headers.
          headers:
            Retry-After:
              description: Seconds to wait before retrying the request.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearerAuth: []
components:
  schemas:
    GetPollParticipantResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Participant'
      required:
        - data
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: >-
                Machine-readable error code. The full list is in the API
                description.
              example: VALIDATION_ERROR
            message:
              type: string
              description: >-
                Human-readable explanation. For `VALIDATION_ERROR` it names each
                offending field, e.g. `title: Invalid input: expected string,
                received undefined; dates.0: Invalid ISO date`.
              example: 'title: Invalid input: expected string, received undefined'
          required:
            - code
            - message
      required:
        - error
    Participant:
      type: object
      properties:
        id:
          type: string
          example: cm5j2r8wb0003q9l4a1x6p0zt
        name:
          type: string
          example: Jane Smith
        email:
          anyOf:
            - type: string
            - type: 'null'
          example: jane@example.com
        createdAt:
          type: string
          format: date-time
          example: '2025-01-10T12:00:00.000Z'
        availability:
          type: array
          items:
            $ref: '#/components/schemas/AvailabilitySpan'
          description: >-
            When the participant is available: one span per option they can
            make, in start order, not merged. Options they cannot make, or did
            not answer, are absent. Each span matches an option of the poll by
            its time.
      required:
        - id
        - name
        - email
        - createdAt
        - availability
    AvailabilitySpan:
      type: object
      properties:
        start:
          type: string
          format: date-time
          description: Start of the span, inclusive, as a UTC instant.
          example: '2025-01-15T09:00:00.000Z'
        end:
          type: string
          format: date-time
          description: >-
            End of the span, exclusive, as a UTC instant: a 30 minute slot
            starting at 09:00 ends at 09:30, and the instant 09:30 is not in it.
          example: '2025-01-15T09:30:00.000Z'
        allDay:
          type: boolean
          description: >-
            True for a whole calendar day. The day is a floating date with no
            timezone, given as `start` at 00:00:00Z on that date and `end` at
            00:00:00Z on the next; read the date from `start` and ignore the
            time of day.
          example: false
        modifiers:
          type: array
          items:
            type: string
          description: >-
            Qualifiers on the availability. `ifNeedBe` means the participant can
            make it but would rather not. New modifiers may be added without a
            version change; one you do not recognise still leaves the span
            available.
          example:
            - ifNeedBe
      required:
        - start
        - end
        - allDay
        - modifiers
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````