The Saturation API is designed to feel natural for both production teams and developers. It mirrors how real-world film and commercial productions operate, using human-readable IDs, flexible structures, and a philosophy that keeps things clear and simple.
Design Philosophy:
- Human-first — Use the same codes and names from your daily workflow.
- Minimize friction — Fewer calls, richer responses.
- Stay flexible — Adapt to your production style, not the other way around.
- Workspace — Your company or organization; holds all projects, contacts, and settings.
- Project — A specific production, campaign, or job. Includes:
- Multi-phase budget
- Actual expense tracking
- Purchase orders
- Files & Notes
Budgets are hierarchical, matching production workflows:
- Accounts — Major categories (e.g., Above-the-Line)
- Sub-accounts — Nested for detail
- Line Items — Specific costs (quantity, rate, calculations)
- Fringes — Auto payroll taxes/benefits
- Markups — Percent or flat fees
Track different versions of a budget:
- Estimate — Initial proposal
- Working — In-progress updates
- Actual — Real costs
- Committed — Locked POs
- Rollups — Compare versions (e.g., Variance)
Actuals — Real expenses:
- Manual entries (receipts, invoices)
- Imported transactions via API
- Converted purchase orders
- Split across multiple categories
Transactions — Raw bank/credit card data:
- Import via CSV or API
- Review and bulk categorize
- Convert to actuals
- Maintain audit trail
People and companies in your production:
- Crew — Cast, directors, crew roles
- Vendors — Rentals, locations, catering
- Clients — Agencies, brands, studios
Contacts are workspace-level:
- One record across all projects
- Consistent IDs for reporting
- Historical spend analysis
Use idMode=user
(human-readable) or idMode=system
(stable UUIDs).
expands
— Pull related data in one call:
GET /projects/film-2025/budget?expands[]=phases&expands[]=lines.contact
idMode
— ID format:user
— Human-friendly ("1100-LABOR"
)system
— UUID/nanoid
Import a Budget:
POST /projects/my-production/budget
{
"accountId": "root",
"lines": [{
"type": "line",
"accountId": "1100-LABOR",
"phaseData": { "estimate": { "quantity": 10, "rate": 25000 } }
}]
}
Track Actuals:
POST /projects/my-production/actuals
{
"description": "Camera rental from Panavision",
"amount": 15000,
"date": "2024-03-15",
"lineItemId": "2150",
"contactId": "vendor-panavision",
"tags": ["Day-1", "A-Camera"]
}
Import & Convert Transactions:
POST /projects/my-production/transactions/actualize
{
"transactions": ["txn-001", "txn-002"],
"lineItemId": "3100",
"tags": ["Week-1"]
}
Create a Contact:
POST /contacts
{
"name": "John Smith",
"company": "Smith Camera Rentals",
"type": "vendor",
"email": "john@smithcamera.com",
"taxId": "12-3456789"
}
Create a Purchase Order:
POST /projects/my-production/purchase-orders
{
"number": "PO-001",
"vendor": "contact-123",
"items": [{
"description": "Camera Package",
"amount": 35000,
"lineItemId": "2150"
}]
}
Split an Actual:
PUT /projects/my-production/actuals/actual-001
{
"expanded": true,
"subActuals": [
{ "lineItemId": "2100", "amount": 10000 },
{ "lineItemId": "2200", "amount": 5000 }
]
}
- Tag data by timeline, location, or department
- Use fringes for labor accuracy
- Define global variables for formulas
- Leverage
expands
to reduce calls
- Create a project
- Import a budget
- Apply
expands
andidMode
- Integrate with existing tools