{"service":"DGFX Factory","base_url":"https://preview.factory.dgfx.us","docs":"https://preview.factory.dgfx.us/docs/api","auth":{"how":"Authorization: Bearer fk_… — an API key a DGFX admin makes for your organization (Admin → organization → API keys). It acts as a member of that one organization.","org":"Every request names the organization: ?org=<slug> on GET, \"org\" in the JSON body on POST. It must be the key's own organization."},"flow":["POST /api/jobs with the version name and params → {job:{id}}","either poll GET /api/jobs/{id}?org= until status is \"done\" (or \"error\"), then GET /api/assets/{id}?org=&download=1 for each output","or add a delivery step: \"deliver\":[{\"channel\":\"webhook\",\"target\":{\"url\":\"https://you/hook\"}}] and the Factory POSTs {event:\"job.completed\", job_id, artifacts:[{filename, kind, url}]} with signed links when it is done"],"job_fields":{"params":"the version's parameters (see versions[].params); validated server-side; unknown names are refused","subject":"a short human name for the render; lands in every filename","formats":"size presets by name — one full render per preset (GET /api/formats)","deliver":"where the outputs go when done: download | webhook | email | social | klaviyo | mailchimp","refresh_data":"true re-fetches the version's data (ch-gis queries, URL inputs) before rendering instead of reading the kept cut"},"endpoints":[{"method":"GET","path":"/api/discover","purpose":"this document — with a key, your organization and its versions"},{"method":"POST","path":"/api/jobs","purpose":"submit a render: {org, version, params, subject?, formats?, deliver?, refresh_data?}"},{"method":"GET","path":"/api/jobs?org=","purpose":"recent jobs"},{"method":"GET","path":"/api/jobs/{id}?org=","purpose":"one job: status, progress, outputs (assets), deliveries, steps"},{"method":"GET","path":"/api/assets/{id}?org=","purpose":"fetch an output (redirects to a short-lived signed link); add &download=1 to save"},{"method":"POST","path":"/api/uploads?org=","purpose":"send a file (multipart \"file\" or raw body + ?filename=) → an asset id for asset-ref params"},{"method":"GET","path":"/api/versions?org=","purpose":"the versions your organization may run"},{"method":"GET","path":"/api/versions/{name}/data?org=","purpose":"the data cuts a version keeps; POST {action:\"refresh\"} to re-cut on the next run"},{"method":"GET","path":"/api/formats","purpose":"every size preset by name"},{"method":"GET","path":"/api/channels","purpose":"delivery channels and what each needs"},{"method":"GET","path":"/api/engines","purpose":"the frameworks"},{"method":"POST","path":"/api/schedules","purpose":"repeat a submission: {org, version, params, recurrence, timezone, at_time, …, refresh_data?}"}],"channels":{"download":{"label":"Download link","needs":[],"accepts":["*"],"note":"presigned S3 URL, expiring"},"webhook":{"label":"Webhook","needs":[],"accepts":["*"],"note":"POST the delivery payload to a URL"},"email":{"label":"Email","needs":[],"accepts":["*"],"note":"Amazon SES when SES_REGION + EMAIL_FROM are set, else SMTP — ported from ch-gfx EmailService"},"social":{"label":"Social post","needs":[],"accepts":["video","still"],"note":"the org's Buffer (API) or Zapier hook; target.channel_id picks the Buffer channel, mode queue|now|next|scheduled|draft"},"klaviyo":{"label":"Klaviyo template","needs":[],"accepts":["email"],"note":"the org's Klaviyo key; uploads the rendered HTML email as reusable content; sending stays a human action"},"mailchimp":{"label":"Mailchimp template","needs":[],"accepts":["email"],"note":"the org's Mailchimp key; uploads the rendered HTML email as a template; campaign send stays a human action"}},"formats":{"count":56,"list":"https://preview.factory.dgfx.us/api/formats"},"you":null,"note":"Unauthenticated: send a key to see your organization and its versions."}