Pixieset Studio Clients & CRM API

Internal client relationship management surface of Pixieset's own Studio web app - list, search, retrieve, and update clients and leads (id prefix cl_), their address info, notes, associated galleries, and documents. Not a Pixieset-published API; endpoint shapes are modeled from unofficial third-party reverse-engineering documentation and are unverified against Pixieset's current implementation.

OpenAPI Specification

pixieset-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Pixieset Studio & Gallery API (Modeled, Unofficial)
  description: >-
    Pixieset does not publish a public or partner developer API - there is no
    self-serve API key or OAuth signup, no official API reference, and no
    developer program. The endpoints below model the internal, session-cookie
    -authenticated web APIs that power Pixieset's own Studio Manager
    (studio.pixieset.com) and Client Gallery (galleries.pixieset.com) web
    apps, as documented by an independent third party
    (https://trozz.github.io/pixieset-api-docs/, "unofficial documentation
    created through reverse engineering and API analysis... not affiliated
    with or endorsed by Pixieset"). Paths, parameters, and response shapes are
    sourced from that community project (111+ endpoints catalogued there);
    only a representative subset is modeled here across Clients, Sessions,
    Invoices, Contracts, and Gallery Collections. Nothing here is
    independently verified against Pixieset's current implementation -
    treat this as a best-effort, sourced model rather than an authoritative
    reference, it may change or disappear without notice, and using it against
    Pixieset's production systems outside of your own account should be
    checked against Pixieset's Terms of Service.
  version: '1.0-modeled'
  contact:
    name: Pixieset
    url: https://pixieset.com
externalDocs:
  description: Unofficial Pixieset API documentation (trozz/pixieset-api-docs)
  url: https://trozz.github.io/pixieset-api-docs/
servers:
  - url: https://studio.pixieset.com/api/v1
    description: Studio API (business management) - modeled, unofficial
  - url: https://galleries.pixieset.com/api/v1
    description: Gallery API (client delivery & sales) - modeled, unofficial
security:
  - sessionCookie: []
tags:
  - name: Clients
    description: Client and lead CRM records.
  - name: Sessions
    description: Bookable session types, scheduling, and availability.
  - name: Invoices
    description: Invoices and payments.
  - name: Contracts
    description: Contracts and contract templates.
  - name: Collections
    description: Gallery collections, access, and downloads.
paths:
  /clients/:
    get:
      operationId: listClients
      tags: [Clients]
      summary: List clients and leads
      description: >-
        Returns a paginated list of client/lead/other contact records.
        Modeled from the Studio API Clients & CRM reference.
      parameters:
        - name: page
          in: query
          schema: { type: integer, default: 1 }
        - name: per_page
          in: query
          schema: { type: integer, default: 25 }
        - name: types
          in: query
          description: "Comma-separated: client, lead, other"
          schema: { type: string }
      responses:
        '200':
          description: Paginated list of clients.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ClientListResponse' }
  /clients/search:
    get:
      operationId: searchClients
      tags: [Clients]
      summary: Search clients and leads
      parameters:
        - name: q
          in: query
          required: true
          schema: { type: string }
        - name: types
          in: query
          schema: { type: string, enum: [all, client, lead] }
        - name: page
          in: query
          schema: { type: integer }
        - name: pageSize
          in: query
          schema: { type: integer, maximum: 100 }
      responses:
        '200':
          description: Matching clients.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ClientListResponse' }
  /clients/{client_id}:
    get:
      operationId: getClient
      tags: [Clients]
      summary: Get client details
      parameters:
        - name: client_id
          in: path
          required: true
          schema: { type: string, example: cl_ABC123DEF456GHI789JKL012MNO345 }
      responses:
        '200':
          description: Client detail.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Client' }
    put:
      operationId: updateClient
      tags: [Clients]
      summary: Update a client
      parameters:
        - name: client_id
          in: path
          required: true
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema: { $ref: '#/components/schemas/Client' }
      responses:
        '200':
          description: Updated client.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Client' }
  /session_types/:
    get:
      operationId: listSessionTypes
      tags: [Sessions]
      summary: List session types
      description: Bookable service definitions with scheduling and payment config.
      responses:
        '200':
          description: List of session types.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/SessionType' }
    post:
      operationId: createSessionType
      tags: [Sessions]
      summary: Create a session type
      requestBody:
        content:
          application/json:
            schema: { $ref: '#/components/schemas/SessionType' }
      responses:
        '201':
          description: Created session type.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/SessionType' }
  /session_types/{session_type_id}/check-day-avail/{date_timezone}:
    get:
      operationId: checkDayAvailability
      tags: [Sessions]
      summary: Check day availability for a session type
      parameters:
        - name: session_type_id
          in: path
          required: true
          schema: { type: string, example: set_SES001ABC123DEF456GHI789JKL012 }
        - name: date_timezone
          in: path
          required: true
          description: "Format: YYYY-M-D-Area/City, e.g. 2025-8-7-Europe/London"
          schema: { type: string }
      responses:
        '200':
          description: Availability for the requested day.
          content:
            application/json:
              schema: { type: object }
  /sessions:
    get:
      operationId: listSessions
      tags: [Sessions]
      summary: List booked sessions
      responses:
        '200':
          description: Booked sessions with client and session-type info.
          content:
            application/json:
              schema: { type: object }
  /invoices/:
    get:
      operationId: listInvoices
      tags: [Invoices]
      summary: List invoices
      parameters:
        - name: expand
          in: query
          schema: { type: string, example: client }
        - name: timeframe_filter
          in: query
          schema: { type: string, example: this_month }
        - name: currency
          in: query
          schema: { type: string, example: usd }
        - name: payment_type
          in: query
          schema: { type: string, enum: [all, paid, unpaid, overdue] }
      responses:
        '200':
          description: Paginated list of invoices.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Invoice' }
  /invoices/{invoice_id}:
    get:
      operationId: getInvoice
      tags: [Invoices]
      summary: Get invoice details
      parameters:
        - name: invoice_id
          in: path
          required: true
          schema: { type: string, example: in_INV001ABC123DEF456GHI789JKL012 }
        - name: expand
          in: query
          schema: { type: string, example: all }
      responses:
        '200':
          description: Invoice detail with line items and payments.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Invoice' }
  /invoices/invoice_summary:
    get:
      operationId: getInvoiceSummary
      tags: [Invoices]
      summary: Get invoice summary statistics
      parameters:
        - name: timeframe_filter
          in: query
          schema: { type: string }
        - name: currency
          in: query
          schema: { type: string }
      responses:
        '200':
          description: Summary totals for invoices.
          content:
            application/json:
              schema: { type: object }
  /invoices/payments/list/:
    get:
      operationId: listInvoicePayments
      tags: [Invoices]
      summary: List payments across all invoices
      parameters:
        - name: expand
          in: query
          schema: { type: string, example: client }
        - name: client_id
          in: query
          schema: { type: string }
        - name: page_size
          in: query
          schema: { type: integer }
      responses:
        '200':
          description: Paginated list of payments.
          content:
            application/json:
              schema: { type: object }
  /contracts/:
    get:
      operationId: listContracts
      tags: [Contracts]
      summary: List contracts
      parameters:
        - name: expand
          in: query
          schema: { type: string, example: all }
        - name: page
          in: query
          schema: { type: integer }
      responses:
        '200':
          description: Paginated list of contracts.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/Contract' }
  /contracts/{contract_id}:
    get:
      operationId: getContract
      tags: [Contracts]
      summary: Get contract details
      parameters:
        - name: contract_id
          in: path
          required: true
          schema: { type: string, example: co_CON001ABC123DEF456GHI789JKL012 }
        - name: expand
          in: query
          schema: { type: string, example: all }
      responses:
        '200':
          description: Contract detail with rendered content and signatures.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Contract' }
  /templates/contracts:
    get:
      operationId: listContractTemplates
      tags: [Contracts]
      summary: List contract templates
      responses:
        '200':
          description: List of contract templates.
          content:
            application/json:
              schema: { type: object }
  /templates/contracts/{template_id}:
    get:
      operationId: getContractTemplate
      tags: [Contracts]
      summary: Get contract template details
      parameters:
        - name: template_id
          in: path
          required: true
          schema: { type: string, example: ct_CON002ABC123DEF456GHI789JKL012 }
      responses:
        '200':
          description: Contract template detail with HTML body and variables.
          content:
            application/json:
              schema: { type: object }
    put:
      operationId: updateContractTemplate
      tags: [Contracts]
      summary: Update a contract template
      parameters:
        - name: template_id
          in: path
          required: true
          schema: { type: string }
      requestBody:
        content:
          application/json:
            schema: { type: object }
      responses:
        '200':
          description: Updated contract template.
          content:
            application/json:
              schema: { type: object }
  /collections/{collection_id}:
    get:
      operationId: getCollection
      tags: [Collections]
      summary: Get gallery collection details
      servers:
        - url: https://galleries.pixieset.com/api/v1
      parameters:
        - name: collection_id
          in: path
          required: true
          schema: { type: integer, example: 90516387 }
        - name: expand
          in: query
          schema: { type: string, example: video_cover }
      responses:
        '200':
          description: Collection detail.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: { $ref: '#/components/schemas/Collection' }
  /collections/{collection_id}/galleries:
    get:
      operationId: listCollectionGalleries
      tags: [Collections]
      summary: List galleries in a collection
      servers:
        - url: https://galleries.pixieset.com/api/v1
      parameters:
        - name: collection_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Galleries within the collection.
          content:
            application/json:
              schema: { type: object }
  /collections/{collection_id}/clients:
    get:
      operationId: listCollectionClients
      tags: [Collections]
      summary: List clients with access to a collection
      servers:
        - url: https://galleries.pixieset.com/api/v1
      parameters:
        - name: collection_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Clients with access, permission level, and favorites count.
          content:
            application/json:
              schema: { type: object }
  /collections/{collection_id}/downloads/:
    get:
      operationId: listCollectionDownloads
      tags: [Collections]
      summary: List all download activity for a collection
      servers:
        - url: https://galleries.pixieset.com/api/v1
      parameters:
        - name: collection_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Combined photo and video download activity.
          content:
            application/json:
              schema: { type: object }
  /collections/{collection_id}/favorites:
    get:
      operationId: listCollectionFavorites
      tags: [Collections]
      summary: List client-favorited photos and videos in a collection
      servers:
        - url: https://galleries.pixieset.com/api/v1
      parameters:
        - name: collection_id
          in: path
          required: true
          schema: { type: integer }
      responses:
        '200':
          description: Favorited media with client attribution.
          content:
            application/json:
              schema: { type: object }
components:
  securitySchemes:
    sessionCookie:
      type: apiKey
      in: cookie
      name: session_cookie
      description: >-
        Session cookie issued by the Pixieset web login flow
        (studio.pixieset.com/login or galleries.pixieset.com/login). This is
        the internal web-app session mechanism, not a published API-key or
        OAuth developer credential - Pixieset does not offer either for
        third-party use. Write operations additionally require an
        X-CSRF-Token header per the reverse-engineered documentation.
  schemas:
    Client:
      type: object
      properties:
        id: { type: string, example: cl_ABC123DEF456GHI789JKL012MNO345 }
        email: { type: string }
        first_name: { type: string }
        last_name: { type: string }
        phone: { type: string }
        company: { type: string, nullable: true }
        status_name: { type: string, example: Active }
        type: { type: string, enum: [client, lead, other] }
        created_at: { type: string, format: date-time }
    ClientListResponse:
      type: object
      properties:
        data:
          type: array
          items: { $ref: '#/components/schemas/Client' }
        meta:
          type: object
          properties:
            current_page: { type: integer }
            per_page: { type: integer }
            total: { type: integer }
    SessionType:
      type: object
      properties:
        id: { type: string, example: set_SES001ABC123DEF456GHI789JKL012 }
        name: { type: string }
        status: { type: string, enum: [published, draft] }
        duration: { type: integer, description: Minutes }
        location: { type: string }
        payment_amount_full: { type: integer, description: Smallest currency unit }
        currency: { type: string, example: gbp }
        collect_payment: { type: boolean }
    Invoice:
      type: object
      properties:
        id: { type: string, example: in_INV001ABC123DEF456GHI789JKL012 }
        invoice_number: { type: string }
        amount: { type: integer, description: Smallest currency unit }
        amount_formatted: { type: string }
        currency: { type: string }
        status: { type: string, enum: [draft, sent, paid, overdue] }
        due_date: { type: string, format: date }
        client: { $ref: '#/components/schemas/Client' }
    Contract:
      type: object
      properties:
        id: { type: string, example: co_CON001ABC123DEF456GHI789JKL012 }
        contract_number: { type: string }
        status:
          type: string
          enum: [draft, sent, viewed, partially_signed, signed, expired, cancelled]
        due_date: { type: string, format: date-time }
        signed_date: { type: string, format: date-time, nullable: true }
        client: { $ref: '#/components/schemas/Client' }
    Collection:
      type: object
      properties:
        id: { type: integer, example: 90516387 }
        name: { type: string }
        description: { type: string }
        gallery_count: { type: integer }
        photo_count: { type: integer }
        video_count: { type: integer }
        password_protected: { type: boolean }
        downloadable: { type: boolean }
        expiry_date: { type: string, format: date, nullable: true }