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 }