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

# Get Survey Results

> Topline results for a survey project: per-question option counts and percentages, the unmatched/open-ended "other" bucket, and overall completion/dropoff rates. The numbers match the survey results page in the dashboard.

Returns `409` (`NOT_A_SURVEY`) when the project is not a survey.



## OpenAPI

````yaml /api-reference/openapi.json get /projects/{id}/survey-results
openapi: 3.1.0
info:
  title: Political Comms API
  summary: >-
    Direct-to-carrier political texting API for campaigns, PACs, advocacy
    organizations, fundraisers, and elected officials.
  description: >-
    Public REST API for the Political Comms platform. Surfaces include Projects
    (compose, test, schedule, send), Contact Lists (S3 import and analysis),
    Media Files, Organizations and hierarchy, Brands, Campaigns, Tracking
    Domains, Phone Numbers, Analytics, and Billing.


    Authentication is an API key passed in the `X-API-Key` header. Keys are
    generated from the dashboard at Admin → API Keys and are prefixed
    `pc_live_`. All POST and PATCH endpoints that mutate state are designed to
    be safe to retry, with optional `Idempotency-Key` headers for stronger
    guarantees. Rate limit is 100 requests per minute per key (60-second sliding
    window; write-only keys 60/min, delete-only keys 30/min — the
    `X-RateLimit-Limit` header reports your key's exact limit).


    Webhooks emit `message.sent`, `message.delivered`, `message.failed`,
    `message.replied`, and `link.clicked` events. Payloads are HMAC-signed;
    validate the signature before trusting any payload.


    A Model Context Protocol (MCP) server is available at
    https://docs.politicalcomms.com/mcp for AI agents that need to search the
    documentation programmatically. The developer hub at
    https://politicalcomms.com/developers/ has quickstart examples in cURL, raw
    HTTP, and Python.
  version: 1.1.0
  termsOfService: https://politicalcomms.com/terms/
  contact:
    name: Political Comms Support
    email: support@politicalcomms.com
    url: https://docs.politicalcomms.com
  license:
    name: Proprietary
    url: https://politicalcomms.com/terms/
  x-logo:
    url: https://politicalcomms.com/images/brand/pcomms-logo-left-of-text.png
    altText: Political Comms
    backgroundColor: '#ffffff'
    href: https://politicalcomms.com/
  x-mcp:
    url: https://docs.politicalcomms.com/mcp
    discovery_url: https://docs.politicalcomms.com/.well-known/mcp
    transport: http
    auth: none
    tools:
      - search_political_comms
      - query_docs_filesystem_political_comms
      - submit_feedback
servers:
  - url: https://api.politicalcomms.com/v1
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Organizations
    description: List descendant organizations and hierarchy.
  - name: Brands
    description: List brands across your organization hierarchy.
  - name: Campaigns
    description: List campaigns across your organization hierarchy.
  - name: Tracking Domains
    description: >-
      List active link-tracking domains. Use the returned ids as
      `link_tracking_domain_id` on project create/update.
  - name: Phone Numbers
    description: List phone numbers across 10DLC campaigns and toll-free verifications.
  - name: Toll-Free Verifications
    description: >-
      List toll-free verifications (carrier registrations) across your
      organization hierarchy.
  - name: Contact Lists
    description: List, import, and analyze contact lists.
  - name: Media Files
    description: List, import, and fetch media files.
  - name: Projects
    description: Create, edit, test, schedule, and inspect projects.
  - name: Analytics
    description: Message statistics and delivery performance.
  - name: Billing
    description: Usage and billing data across your organization.
paths:
  /projects/{id}/survey-results:
    get:
      tags:
        - Projects
      summary: Get Survey Results
      description: >-
        Topline results for a survey project: per-question option counts and
        percentages, the unmatched/open-ended "other" bucket, and overall
        completion/dropoff rates. The numbers match the survey results page in
        the dashboard.


        Returns `409` (`NOT_A_SURVEY`) when the project is not a survey.
      operationId: getSurveyResults
      parameters:
        - $ref: '#/components/parameters/IdPath'
      responses:
        '200':
          description: Topline survey results
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    properties:
                      project_id:
                        type: string
                      name:
                        type: string
                      status:
                        type: string
                      total_recipients:
                        type: integer
                      completion_rate:
                        type: number
                        description: >-
                          Percentage of responding conversations that reached
                          the final question.
                      dropoff_rate:
                        type: number
                      results:
                        type: array
                        description: One entry per question, ordered by sequence.
                        items:
                          type: object
                          properties:
                            question_id:
                              type: string
                            sequence:
                              type: integer
                            question_text:
                              type: string
                            question_type:
                              type: string
                            total_responses:
                              type: integer
                            option_results:
                              type: array
                              items:
                                type: object
                                properties:
                                  value:
                                    type: integer
                                  label:
                                    type: string
                                  count:
                                    type: integer
                                  percentage:
                                    type: integer
                            other_count:
                              type: integer
                              description: >-
                                Replies that matched no option (or all replies,
                                for open-ended questions).
                            other_percentage:
                              type: integer
              example:
                success: true
                data:
                  project_id: 01HX000000000000000000P002
                  name: Primary Intent Survey
                  status: completed
                  total_recipients: 5000
                  completion_rate: 42.1
                  dropoff_rate: 57.9
                  results:
                    - question_id: 01HX000000000000000000Q002
                      sequence: 2
                      question_text: >-
                        Do you plan to vote in the primary? Reply 1 for Yes, 2
                        for No, 3 for Undecided.
                      question_type: multiple_choice
                      total_responses: 812
                      option_results:
                        - value: 1
                          label: 'Yes'
                          count: 500
                          percentage: 62
                        - value: 2
                          label: 'No'
                          count: 150
                          percentage: 18
                        - value: 3
                          label: Undecided
                          count: 100
                          percentage: 12
                      other_count: 62
                      other_percentage: 8
                    - question_id: 01HX000000000000000000Q003
                      sequence: 3
                      question_text: What issue matters most to you this year?
                      question_type: open_ended
                      total_responses: 145
                      option_results: []
                      other_count: 145
                      other_percentage: 100
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: Project exists but is not a survey
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error: Project is not a survey
                code: NOT_A_SURVEY
                statusCode: 409
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    IdPath:
      name: id
      in: path
      required: true
      description: Resource ID
      schema:
        type: string
  responses:
    Unauthorized:
      description: Missing, malformed, revoked, or expired API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AuthErrorResponse'
          example:
            error: API key required
            message: Please provide an API key in the X-API-Key header
    Forbidden:
      description: >-
        The API key lacks the required permission scope, or the requested
        resource belongs to an organization outside the key's hierarchy.
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/AuthErrorResponse'
              - $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingScope:
              summary: Key lacks the required permission scope
              value:
                error: Insufficient permissions
                message: >-
                  This API key does not have the required permissions:
                  public:read
            orgAccessDenied:
              summary: Resource outside the key's organization hierarchy
              value:
                error: >-
                  Access denied: You do not have permission to access this
                  organization's data
                code: ORG_ACCESS_DENIED
                correlationId: de038205-7c9c-4d4a-99bc-d7275a52f07e
    NotFound:
      description: Resource not found or not visible to this API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Project not found
            code: PROJECT_NOT_FOUND
            correlationId: de038205-7c9c-4d4a-99bc-d7275a52f07e
    RateLimited:
      description: Rate limit exceeded. Check the Retry-After header.
      headers:
        Retry-After:
          description: Seconds until the window resets.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitErrorResponse'
          example:
            success: false
            error: Rate limit exceeded
            message: Maximum 1000 requests per 3600 seconds
            code: RATE_LIMIT_EXCEEDED
            statusCode: 429
            retryAfter: 1800
    InternalError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: An unexpected error occurred. Please try again later.
            code: INTERNAL_ERROR
            correlationId: de038205-7c9c-4d4a-99bc-d7275a52f07e
  schemas:
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message.
        code:
          type: string
          description: >-
            Machine-readable error code, e.g. VALIDATION_ERROR,
            ORG_ACCESS_DENIED, PROJECT_NOT_FOUND.
        correlationId:
          type: string
          description: Request correlation ID; include it in support requests.
        details:
          type:
            - array
            - object
          description: >-
            Present on some errors. An array of field-level issues for
            VALIDATION_ERROR; an object for other codes (e.g.
            insufficient-balance shortfall).
      required:
        - error
        - code
      additionalProperties: true
      description: >-
        Standard error body produced by the API error handler for 4xx/5xx
        responses.
    AuthErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Short error summary.
        message:
          type: string
          description: Human-readable detail.
      required:
        - error
        - message
      additionalProperties: true
      description: >-
        Error body returned by the API-key authentication layer (401 and
        permission 403s).
    RateLimitErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: string
        message:
          type: string
        code:
          type: string
          enum:
            - RATE_LIMIT_EXCEEDED
        statusCode:
          type: integer
          enum:
            - 429
        retryAfter:
          type: integer
          description: >-
            Seconds until the rate-limit window resets. Also sent as the
            Retry-After header.
      required:
        - success
        - error
        - code
        - statusCode
        - retryAfter
      additionalProperties: true
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Authenticate every request by passing your API key in the X-API-Key
        header. Keys are scoped to your organization hierarchy.

````