> ## 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 Project Stats (all)

> Aggregate per-project statistics for a date range (max 31 days, no older than 90 days). Results are paginated via limit/offset.



## OpenAPI

````yaml /api-reference/openapi.json get /projects/stats
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), Conversations (read inbound threads and
    reply inside them), 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 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 600 requests per minute per key (bursts up to 600, refilling at 10 per
    second, the same for every scope; the `X-RateLimit-Limit` header reports
    your key's exact limit, and `Retry-After` on a 429 is the seconds until your
    next request is allowed).


    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.4.1
  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: Projects
    description: Create, edit, test, schedule, and inspect projects.
  - name: Conversations
    description: >-
      Read inbound threads and reply inside them from the same number.
      Conversations are created by project sends; the API never starts one.
  - 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: Brands
    description: List brands across your organization hierarchy.
  - name: 10DLC Campaigns
    description: >-
      List 10DLC campaigns (carrier registrations) across your organization
      hierarchy.
  - name: Email Campaigns
    description: >-
      Create, schedule, and report on email campaigns. Pause, resume, and test
      sends are deliverability decisions a human makes while watching a send,
      and live in the dashboard.
  - name: Email Templates
    description: Create and read saved email templates.
  - name: Email Senders
    description: >-
      Read the sender identities (From addresses) on your verified domains.
      Identities carry the physical mailing address and paid-for-by disclaimer,
      so they are created and edited in the dashboard.
  - name: Email Suppressions
    description: >-
      Read, add, and lift suppressions in bulk. This is the primitive for
      keeping your own opt-out record in sync with ours.
  - name: Contact Lists
    description: List, import, and analyze contact lists.
  - name: Email Lists
    description: >-
      Create email lists, read their contacts, and bulk-upsert or import
      addresses. To stop mailing someone use Email Suppressions, which survives
      a re-import.
  - name: Media Files
    description: List, import, and fetch media files.
  - name: Sending Domains
    description: >-
      Read the sending domains in your organization and the DNS records to
      publish. Domains are added in the dashboard: DNS is published by hand, so
      creation is not part of the API.
  - name: Tracking Domains
    description: >-
      List active link-tracking domains. Use the returned ids as
      `link_tracking_domain_id` on project create/update.
  - name: Organizations
    description: List descendant organizations and hierarchy.
  - name: Billing
    description: Usage and billing data across your organization.
  - name: Analytics
    description: Message statistics and delivery performance.
paths:
  /projects/stats:
    get:
      tags:
        - Projects
      summary: Get Project Stats (all)
      description: >-
        Aggregate per-project statistics for a date range (max 31 days, no older
        than 90 days). Results are paginated via limit/offset.
      operationId: getAllProjectStats
      parameters:
        - $ref: '#/components/parameters/StartDate'
        - $ref: '#/components/parameters/EndDate'
        - $ref: '#/components/parameters/OrganizationIdCamel'
        - $ref: '#/components/parameters/BrandIdCamel'
        - $ref: '#/components/parameters/CampaignIdCamel'
        - name: status
          in: query
          required: false
          description: 'Filter by status: draft, active, completed, paused, all'
          schema:
            type: string
            enum:
              - draft
              - active
              - completed
              - paused
              - all
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 1000
            default: 100
          description: Number of projects to return (1-1000).
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
          description: Number of projects to skip.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    properties:
                      projects:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            name:
                              type: string
                            status:
                              type: string
                            protocol:
                              type: string
                            type:
                              type: string
                              enum:
                                - broadcast
                                - survey
                            channel:
                              type: string
                            organization_id:
                              type: string
                            brand_id:
                              type:
                                - string
                                - 'null'
                            campaign_id:
                              type:
                                - string
                                - 'null'
                            total_recipients:
                              type: integer
                            messages_sent:
                              type: integer
                            messages_delivered:
                              type: integer
                            messages_failed:
                              type: integer
                            messages_opted_out:
                              type: integer
                            replies_received:
                              type: integer
                            survey_responses_count:
                              type: integer
                            survey_completion_count:
                              type: integer
                            actual_cost:
                              type: string
                              description: Numeric string in dollars, e.g. "87.1926".
                            total_url_clicks:
                              type: integer
                            unique_url_clicks:
                              type: integer
                            url_share_count:
                              type: integer
                            created_at:
                              type: string
                              format: date-time
                            completed_at:
                              type:
                                - string
                                - 'null'
                            updated_at:
                              type: string
                              format: date-time
                            organization_name:
                              type: string
                            brand_name:
                              type:
                                - string
                                - 'null'
                            campaign_name:
                              type:
                                - string
                                - 'null'
                          additionalProperties: true
                      summary:
                        type: object
                        properties:
                          totalProjects:
                            type: integer
                          organizationCount:
                            type: integer
                          brandCount:
                            type: integer
                          campaignCount:
                            type: integer
                          statusBreakdown:
                            type: object
                            properties:
                              draft:
                                type: integer
                              active:
                                type: integer
                              completed:
                                type: integer
                              paused:
                                type: integer
                            additionalProperties: true
                          messageStats:
                            type: object
                            properties:
                              totalRecipients:
                                type: integer
                              totalSent:
                                type: integer
                              totalDelivered:
                                type: integer
                              totalFailed:
                                type: integer
                              totalOptedOut:
                                type: integer
                              totalReplies:
                                type: integer
                              totalActualCost:
                                type: number
                              totalUrlClicks:
                                type: integer
                              totalUniqueUrlClicks:
                                type: integer
                              totalUrlShares:
                                type: integer
                            additionalProperties: true
                          dateRange:
                            type: object
                            properties:
                              earliestProject:
                                type:
                                  - string
                                  - 'null'
                              latestProject:
                                type:
                                  - string
                                  - 'null'
                            additionalProperties: true
                        additionalProperties: true
                      pagination:
                        type: object
                        properties:
                          limit:
                            type: integer
                          offset:
                            type: integer
                          totalCount:
                            type: integer
                          hasMore:
                            type: boolean
                        additionalProperties: true
                      dateRange:
                        type: object
                        properties:
                          startDate:
                            type: string
                          endDate:
                            type: string
                        additionalProperties: true
                    additionalProperties: true
                required:
                  - success
                  - data
                additionalProperties: true
              example:
                success: true
                data:
                  projects:
                    - id: 8a3f5c7e-2d91-4b64-ae08-6f1c9d3e7b52
                      name: July GOTV Blast
                      status: completed
                      protocol: sms
                      type: broadcast
                      channel: 10dlc
                      organization_id: 0d9f6a2e-1b34-4c8e-9f21-3e7a8b5c4d10
                      brand_id: 7c1de5f0-9a42-4b6d-8e33-2f5a9c7b1e64
                      campaign_id: 4b8fa3c1-6d25-4e9a-bf47-8c2e5d9a3f71
                      total_recipients: 11800
                      messages_sent: 11800
                      messages_delivered: 11342
                      messages_failed: 458
                      messages_opted_out: 87
                      replies_received: 312
                      survey_responses_count: 0
                      survey_completion_count: 0
                      actual_cost: '354.0000'
                      total_url_clicks: 1893
                      unique_url_clicks: 1544
                      url_share_count: 12
                      created_at: '2025-07-01T14:00:00.000Z'
                      completed_at: '2025-07-02T18:30:00.000Z'
                      updated_at: '2025-07-02T18:30:00.000Z'
                      organization_name: Smith Campaign 2024
                      brand_name: Smith PAC
                      campaign_name: Fall 2025 GOTV
                  summary:
                    totalProjects: 1
                    organizationCount: 1
                    brandCount: 1
                    campaignCount: 1
                    statusBreakdown:
                      draft: 0
                      active: 0
                      completed: 1
                      paused: 0
                    messageStats:
                      totalRecipients: 11800
                      totalSent: 11800
                      totalDelivered: 11342
                      totalFailed: 458
                      totalOptedOut: 87
                      totalReplies: 312
                      totalActualCost: 354
                      totalUrlClicks: 1893
                      totalUniqueUrlClicks: 1544
                      totalUrlShares: 12
                    dateRange:
                      earliestProject: '2025-07-01T14:00:00.000Z'
                      latestProject: '2025-07-01T14:00:00.000Z'
                  pagination:
                    limit: 100
                    offset: 0
                    totalCount: 1
                    hasMore: false
                  dateRange:
                    startDate: '2025-07-01'
                    endDate: '2025-07-31'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    StartDate:
      name: startDate
      in: query
      required: true
      description: Start date in YYYY-MM-DD format
      schema:
        type: string
        format: date
        example: '2026-01-01'
    EndDate:
      name: endDate
      in: query
      required: true
      description: End date in YYYY-MM-DD format
      schema:
        type: string
        format: date
        example: '2026-01-31'
    OrganizationIdCamel:
      name: organizationId
      in: query
      required: false
      description: Filter to a specific descendant organization
      schema:
        type: string
    BrandIdCamel:
      name: brandId
      in: query
      required: false
      description: Filter to a specific brand
      schema:
        type: string
    CampaignIdCamel:
      name: campaignId
      in: query
      required: false
      description: Filter to a specific campaign
      schema:
        type: string
  responses:
    BadRequest:
      description: >-
        Invalid request (validation failure, malformed parameters, or a request
        the resource state does not allow).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Validation failed
            code: VALIDATION_ERROR
            correlationId: 030bf857-922f-4b82-8fca-c5b0769c1590
            details:
              - field: organization_id
                message: Invalid UUID
                code: invalid_format
    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
    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 600 requests per 60 seconds
            code: RATE_LIMIT_EXCEEDED
            statusCode: 429
            retryAfter: 3
    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. For VALIDATION_ERROR, an array of { field,
            message, code } with one entry per rejected field (field is the
            dotted path); 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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.