API Reference
Daydreamers API
Import a shoot, pick keepers, finish in Lightroom Classic or Photoshop, and send a gallery. Connect socials and post selected photographs to the accounts you linked, including Stories and highlights. REST over HTTPS is not required for agents: the official connector is MCP.
Introduction
The Daydreamers API lets assistants and apps work a photography job: pick keepers from a shoot, read published plans, and send a gallery copy. Originals stay on the machine unless you publish. There is no clip-farm endpoint and no bulk YouTube clipping.
Base URL:
https://lenslab.dev/api/mcpAgent-friendly from day one. Workflow, plans, and public notes are MCP tools at https://lenslab.dev/api/mcp. See MCP server.
Quickstart
Three steps: connect, list tools, ask about a shoot.
1. Get an API key
Sign in and open the dashboard. Paid plans unlock workspace tools. Public MCP list/call for workflow, plans, and articles does not need a key.
2. Check your credits
curl https://lenslab.dev/api/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": { "name": "foto_plans", "arguments": {} }
}'Returns published plan names and monthly amounts in USD. Not a quote.
3. Walk the shoot
curl https://lenslab.dev/api/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": { "name": "foto_workflow", "arguments": {} }
}'Authentication
Public MCP tools (workflow, plans, articles) do not need a key. Your Daydreamers account still owns shoots, galleries, and invoices. Do not paste workspace secrets into a prompt. Do not paste a Stripe secret key (sk_ or rk_) into this connector. That key charges money. This URL does not.
Authorization: Bearer your_key_hereIf you send a Bearer token, it is treated as an identifier for rate limits only on this public URL. It does not unlock shoots, photographs, or invoices. Rotate from the dashboard. Accounts without an active paid plan receive 403 subscription_required on billed workspace tools, with upgrade_url pointing at /pricing.
What a key can do
A leaked MCP Bearer does not download originals, post to socials, or cut video. Public tools return published copy: the workflow order, plan names, and blog titles. A Stripe secret key is a different object. If it leaks, anyone can create charges. Keep Stripe keys on the server. Never commit them. Never drop them in a chat.
| Kind | Prefix | Required | Description |
|---|---|---|---|
Public MCP | none | optional | No key. 60 calls / minute per IP. JSON only. No files. |
MCP Bearer | Bearer | optional | Optional identifier. Does not grant shoots or photos. Same 60 / minute cap. |
Stripe publishable | pk_ | optional | Browser checkout. Cannot charge on its own. |
Stripe secret / restricted | sk_ / rk_ | required | Server only. Can create Checkout Sessions and products. Never in the client or this MCP URL. |
Rate limits & plans
Per-client limits are enforced at the connector. Hitting them returns 429 Too Many Requests with Retry-After. A JSON-RPC batch counts as one call per item. Bodies over 64 KB and batches over 10 are rejected.
| Field | Type | Required | Description |
|---|---|---|---|
MCP list/call | 60 / minute | optional | tools/list and tools/call share this cap per IP or Bearer prefix. |
Concurrent Lightroom jobs | 3 | optional | At most three Lightroom Classic handoffs can run at once per account. |
Failed billed calls | 20 / hour | optional | Twenty failing billed calls in an hour pause further billed calls until the window resets. Read tools stay up. |
Auth failures | 10 / minute | optional | Repeated invalid-key attempts on the same prefix are rate-limited. |
Photo credits are not a rate limit. They reset with the billing cycle. Hobby is USD 20 / month (1,000 credits). Creator is USD 30 / month (5,000 credits, Adobe). Arena is USD 200 / month (25,000 credits). Enterprise is custom.
Stripe
Checkout uses Stripe Prices with lookup keys. Yearly is twelve months prepaid at the yearly monthly-equivalent. This table is the catalog. It is not a live quote.
| Lookup key | Amount | Required | Description |
|---|---|---|---|
hobby_monthly | 2000 | optional | Hobby USD 20 / month. 1,000 photo credits. |
hobby_yearly | 19200 | optional | Hobby USD 16 / month billed yearly. |
creator_monthly | 3000 | optional | Creator USD 30 / month. 5,000 photo credits. |
creator_yearly | 28800 | optional | Creator USD 24 / month billed yearly. |
arena_monthly | 20000 | optional | Arena USD 200 / month. 25,000 photo credits. |
arena_yearly | 192000 | optional | Arena USD 160 / month billed yearly. |
Errors
Errors are returned as JSON with error (a stable code you can branch on) and message (a human-readable string).
| Field | Type | Required | Description |
|---|---|---|---|
400 | bad_request | optional | Invalid request body. Common codes: invalid_json, unknown_tool, missing_arguments, shoot_unavailable. |
401 | invalid_api_key / api_key_revoked / account_not_found | optional | Missing or malformed Authorization header, revoked key, or the account associated with the key has been deleted. |
402 | insufficient_credits | optional | Not enough photo credits to start the job. Body includes credits_remaining, credits_needed, and upgrade_url. |
403 | subscription_required | optional | Your Daydreamers account has no active paid plan. Response includes upgrade_url pointing to /pricing. |
404 | not_found | optional | Shoot, gallery, or job does not exist, or is not owned by the authenticated account. |
409 | cannot_cancel | optional | Attempting to cancel a send that is no longer scheduled (already processing or delivered). |
429 | rate_limit | optional | Per-account rate limit hit. Honor the Retry-After header if present. |
500 | server_error | optional | Temporary server error. Safe to retry idempotent reads. Do not retry billed writes without idempotency. |
503 | usage_unavailable | optional | Credit usage could not be read temporarily. Safe to retry foto_plans. |
Clipping
Clipping here is picking: take a huge card and keep the frames that are actually the night. Daydreamers flags blur, blinks, and near-duplicates. You still mark the keepers. Rejects are flags, not deletes.
Call the workflow tool when an assistant needs the order of work:
{
"method": "tools/call",
"params": { "name": "foto_workflow", "arguments": {} }
}Captions
Gallery captions are titles and notes you attach to a delivered photograph. They do not reframe the file and they do not burn social-video styles onto a clip.
Write captions in the gallery before you send. Assistants can list public notes with foto_articles.
Automations
Connect social accounts in Connectors. One send can go to the feed, Stories, and specific highlights on the accounts you linked. Daydreamers does not post to accounts you have not connected, and it does not watch a YouTube channel for new uploads.
Scheduling
Schedule a gallery send or a social post of photographs you already picked. Live destinations are the accounts you connected. Instagram, Facebook, and Threads post only when that account is linked.
Credits
Photo credits come with the published plan. Confirm the amount at checkout.
{
"method": "tools/call",
"params": { "name": "foto_plans", "arguments": {} }
}Hobby 1,000 / month. Creator 5,000 / month. Arena 25,000 / month. Unused credits do not roll into cash.
MCP server
Streamable HTTP at https://lenslab.dev/api/mcp. Tools: foto_workflow, foto_plans, foto_articles.
Install from the MCP page for Claude, ChatGPT, Cursor, Grok, or Julius. Source lives on GitHub.
from openai import OpenAI
client = OpenAI(
api_key="<YOUR_XAI_API_KEY_HERE>",
base_url="https://api.x.ai/v1",
)
response = client.responses.create(
model="grok-4.6",
input="Pick keepers from tonight's shoot and send a gallery copy.",
tools=[{
"type": "mcp",
"server_url": "https://lenslab.dev/api/mcp",
"server_label": "daydream",
}],
)
print(response.output_text)Changelog
2026-09-10 · Public connector
- MCP tools for workflow, plans, and public articles.
- Lightroom Classic and Photoshop on the connectors arc.
- Errors documented as stable JSON codes.