{"openapi":"3.1.0","info":{"title":"The Amateur Shoot Plan API","version":"2026-09-24.v1","description":"A practical filming-plan service. Customers film their own project. No AI imagery or editing/post-production is included."},"servers":[{"url":"https://theamateur.co.uk"}],"paths":{"/api/shoot-plan/v1/capabilities":{"get":{"operationId":"shoot_plan_capabilities","responses":{"200":{"description":"Current truthful capability state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Capabilities"}}}}}}},"/api/shoot-plan/v1/example":{"get":{"operationId":"shoot_plan_example","responses":{"200":{"description":"Synthetic example","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Plan"}}}}}}},"/api/shoot-plan/v1/quote":{"post":{"operationId":"shoot_plan_quote","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["projectType","targetRuntimeSeconds","sceneCount","locationCount","peopleCount","shootMinutes","orientation","noAiImagery"],"properties":{"projectType":{"type":"string","enum":["interview","promo","tutorial","event","narrative"]},"targetRuntimeSeconds":{"type":"integer","minimum":15,"maximum":7200},"sceneCount":{"type":"integer","minimum":1,"maximum":100},"locationCount":{"type":"integer","minimum":1,"maximum":25},"peopleCount":{"type":"integer","minimum":0,"maximum":50},"shootMinutes":{"type":"integer","minimum":15,"maximum":1440},"orientation":{"type":"string","enum":["landscape","portrait","square","mixed"]},"coverageNeeds":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["interview","demonstration","dialogue","live_event","night","moving_subject","product_detail","voiceover"]}},"equipment":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]}},"noAiImagery":{"const":true}}}}}},"responses":{"200":{"description":"Deterministic quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}}},"400":{"description":"Invalid or private input"}}}},"/api/shoot-plan/v1/checkout":{"post":{"security":[{"customerSession":[]}],"parameters":[{"name":"X-CSRF-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Required with browser-session authentication; omitted for Shoot Plan bearer credentials."},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","format":"uri"},"description":"Required with browser-session authentication and must equal the configured customer origin."}],"summary":"Create a provider-hosted checkout when the capability reports it connected","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["quote","idempotencyKey"],"properties":{"quote":{"type":"object","additionalProperties":false,"required":["projectType","targetRuntimeSeconds","sceneCount","locationCount","peopleCount","shootMinutes","orientation","noAiImagery"],"properties":{"projectType":{"type":"string","enum":["interview","promo","tutorial","event","narrative"]},"targetRuntimeSeconds":{"type":"integer","minimum":15,"maximum":7200},"sceneCount":{"type":"integer","minimum":1,"maximum":100},"locationCount":{"type":"integer","minimum":1,"maximum":25},"peopleCount":{"type":"integer","minimum":0,"maximum":50},"shootMinutes":{"type":"integer","minimum":15,"maximum":1440},"orientation":{"type":"string","enum":["landscape","portrait","square","mixed"]},"coverageNeeds":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["interview","demonstration","dialogue","live_event","night","moving_subject","product_detail","voiceover"]}},"equipment":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]}},"noAiImagery":{"const":true}}},"idempotencyKey":{"type":"string","minLength":1,"maxLength":120}}}}}},"responses":{"201":{"description":"Hosted checkout created"},"401":{"description":"Authentication required"},"503":{"description":"Hosted checkout is not connected"}}}},"/api/shoot-plan/v1/plans":{"get":{"operationId":"shoot_plan_list","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"responses":{"200":{"description":"Organisation-scoped plan summaries","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlanSummary"}}}}},"401":{"description":"Authentication required"}}},"post":{"operationId":"shoot_plan_create","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"parameters":[{"name":"X-CSRF-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Required with browser-session authentication; omitted for Shoot Plan bearer credentials."},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","format":"uri"},"description":"Required with browser-session authentication and must equal the configured customer origin."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["orderId","intake","idempotencyKey"],"properties":{"orderId":{"type":"string"},"intake":{"type":"object","additionalProperties":false,"required":["title","briefText","beats","safetyAcknowledged"],"properties":{"title":{"type":"string","minLength":3,"maxLength":120},"briefText":{"type":"string","minLength":20,"maxLength":20000},"beats":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","minLength":3,"maxLength":240}},"beatLocations":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","minLength":2,"maxLength":120}},"constraints":{"type":"object","additionalProperties":false,"properties":{"locationNotes":{"type":"string","maxLength":1000},"accessNotes":{"type":"string","maxLength":1000},"soundNotes":{"type":"string","maxLength":1000},"lightNotes":{"type":"string","maxLength":1000},"mobilityNotes":{"type":"string","maxLength":1000},"safetyNotes":{"type":"string","maxLength":1000},"availableMinutes":{"type":"integer","minimum":15,"maximum":1440},"locationTransferMinutes":{"type":"integer","minimum":0,"maximum":720}}},"safetyAcknowledged":{"const":true}}},"idempotencyKey":{"type":"string","minLength":1,"maxLength":120}}}}}},"responses":{"201":{"description":"Plan task created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Authentication required"},"409":{"description":"Payment or state gate"}}}},"/api/shoot-plan/v1/plans/{taskId}":{"get":{"operationId":"shoot_plan_get","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Organisation-scoped plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Authentication required"},"404":{"description":"Not found"}}}},"/api/shoot-plan/v1/plans/{taskId}/status":{"get":{"operationId":"shoot_plan_status","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Organisation-scoped status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskStatus"}}}},"401":{"description":"Authentication required"},"404":{"description":"Not found"}}}},"/api/shoot-plan/v1/plans/{taskId}/revisions":{"post":{"operationId":"shoot_plan_revise","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-CSRF-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Required with browser-session authentication; omitted for Shoot Plan bearer credentials."},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","format":"uri"},"description":"Required with browser-session authentication and must equal the configured customer origin."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"request":{"type":"string","minLength":1,"maxLength":1000},"replacementBeats":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string","minLength":3,"maxLength":240}},"constraintUpdates":{"type":"object","additionalProperties":false,"properties":{"locationNotes":{"type":"string","maxLength":1000},"accessNotes":{"type":"string","maxLength":1000},"soundNotes":{"type":"string","maxLength":1000},"lightNotes":{"type":"string","maxLength":1000},"mobilityNotes":{"type":"string","maxLength":1000},"safetyNotes":{"type":"string","maxLength":1000},"availableMinutes":{"type":"integer","minimum":15,"maximum":1440},"locationTransferMinutes":{"type":"integer","minimum":0,"maximum":720}}},"framingMode":{"type":"string","enum":["closer","wide_locked"]},"audioPriority":{"type":"string","enum":["clean"]},"idempotencyKey":{"type":"string","minLength":1,"maxLength":120}},"required":["request","idempotencyKey"]}}}},"responses":{"200":{"description":"Revised plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"400":{"description":"Invalid, unchanged, or absent structured change; the included revision is not consumed"},"401":{"description":"Authentication required"},"409":{"description":"Revision or state gate"}}}},"/api/shoot-plan/v1/plans/{taskId}/progress-ops":{"post":{"operationId":"shoot_plan_progress_sync","security":[{"customerSession":[]},{"shootPlanBearer":[]}],"parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-CSRF-Token","in":"header","required":false,"schema":{"type":"string"},"description":"Required with browser-session authentication; omitted for Shoot Plan bearer credentials."},{"name":"Origin","in":"header","required":false,"schema":{"type":"string","format":"uri"},"description":"Required with browser-session authentication and must equal the configured customer origin."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["ops"],"properties":{"ops":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","additionalProperties":false,"required":["opId","basePlanVersion","itemKey","state"],"properties":{"opId":{"type":"string","format":"uuid"},"basePlanVersion":{"type":"integer","minimum":1},"itemKey":{"type":"string","pattern":"^(shot|check):"},"state":{"enum":["complete","incomplete"]},"recordedAt":{"type":["string","null"],"format":"date-time"}}}}}}}}},"responses":{"200":{"description":"Progress operations applied or safely rejected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressSyncResult"}}}},"401":{"description":"Authentication required"},"404":{"description":"Plan not found"},"409":{"description":"Operation id conflict"}}}}},"components":{"securitySchemes":{"customerSession":{"type":"apiKey","in":"cookie","name":"__Host-avs_session"},"shootPlanBearer":{"type":"http","scheme":"bearer","bearerFormat":"Shoot Plan organisation credential"}},"schemas":{"Capabilities":{"type":"object","required":["schemaVersion","service","customerFilmsProject","noAiImageryRequired","boundary","publicTools","protectedTools","outputs","revisionLimit","commercial","privacy"],"properties":{"schemaVersion":{"type":"string"},"service":{"const":"shoot_plan"},"title":{"type":"string"},"proposition":{"type":"string"},"customerFilmsProject":{"const":true},"noAiImageryRequired":{"const":true},"boundary":{"type":"string"},"publicTools":{"type":"array","items":{"type":"string"}},"protectedTools":{"type":"array","items":{"type":"string"}},"outputs":{"type":"array","items":{"type":"string"}},"revisionLimit":{"const":1},"commercial":{"type":"object","required":["currency","packages","hostedCheckoutConnected","purchasable","paymentAuthority","registryPublished"],"properties":{"currency":{"const":"GBP"},"packages":{"type":"array","items":{"type":"object","required":["code","name","priceMinor","limits"],"properties":{"code":{"type":"string"},"name":{"type":"string"},"priceMinor":{"type":"integer"},"limits":{"type":"object"}}}},"hostedCheckoutConnected":{"type":"boolean"},"purchasable":{"type":"boolean"},"admissionMode":{"type":"string"},"paymentAuthority":{"type":"string"},"registryPublished":{"const":false}}},"privacy":{"type":"object","required":["publicQuoteAcceptsPrivateScript","privateInputRequiresAuthorisation","privateInputRetentionDays","purchasedPlanRetained","fmeCustomerDataAllowed"],"properties":{"publicQuoteAcceptsPrivateScript":{"const":false},"privateInputRequiresAuthorisation":{"const":true},"privateInputRetentionDays":{"type":"integer","minimum":1},"purchasedPlanRetained":{"const":true},"fmeCustomerDataAllowed":{"const":false}}}}},"Quote":{"type":"object","required":["quoteId","status","metadata","minimumShootMinutes","validUntil","purchasable"],"properties":{"quoteId":{"type":"string"},"status":{"enum":["quoted","custom_quote_required"]},"metadata":{"type":"object","additionalProperties":false,"required":["projectType","targetRuntimeSeconds","sceneCount","locationCount","peopleCount","shootMinutes","orientation","noAiImagery"],"properties":{"projectType":{"type":"string","enum":["interview","promo","tutorial","event","narrative"]},"targetRuntimeSeconds":{"type":"integer","minimum":15,"maximum":7200},"sceneCount":{"type":"integer","minimum":1,"maximum":100},"locationCount":{"type":"integer","minimum":1,"maximum":25},"peopleCount":{"type":"integer","minimum":0,"maximum":50},"shootMinutes":{"type":"integer","minimum":15,"maximum":1440},"orientation":{"type":"string","enum":["landscape","portrait","square","mixed"]},"coverageNeeds":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["interview","demonstration","dialogue","live_event","night","moving_subject","product_detail","voiceover"]}},"equipment":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]}},"noAiImagery":{"const":true}}},"minimumShootMinutes":{"type":"integer"},"validUntil":{"type":"string","format":"date-time"},"amountMinor":{"type":["integer","null"]},"currency":{"const":"GBP"},"purchasable":{"type":"boolean"},"checkoutUrl":{"type":["string","null"]}}},"Plan":{"type":"object","required":["schemaVersion","planId","version","status","title","summary","noAiImagery","constraints","feasibility","shootOrderRationale","setupGroups","shots","coverageRisks","captureChecklist","revision"],"properties":{"schemaVersion":{"type":"string"},"planId":{"type":"string"},"taskId":{"type":"string"},"version":{"type":"integer"},"status":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"noAiImagery":{"const":true},"constraints":{"type":"object"},"feasibility":{"type":"object","additionalProperties":false,"required":["status","availableMinutes","minimumShootMinutes","scheduledMinutes","contingencyMinutes","basis"],"properties":{"status":{"const":"passed"},"availableMinutes":{"type":"integer"},"minimumShootMinutes":{"type":"integer"},"scheduledMinutes":{"type":"integer"},"contingencyMinutes":{"type":"integer"},"basis":{"type":"string"}}},"shootOrderRationale":{"type":"string"},"setupGroups":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["setupGroup","name","estimateMinutes","instruction"],"properties":{"setupGroup":{"type":"string"},"name":{"type":"string"},"estimateMinutes":{"type":"integer"},"instruction":{"type":"string"}}}},"shots":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["shotId","setupGroup","priority","sceneOrBeat","coverageRole","framing","angle","movement","subjectAction","suggestedHoldSeconds","audio","equipment","continuityNote","captureInstruction","reason","alternativeIfImpossible"],"properties":{"shotId":{"type":"string"},"setupGroup":{"type":"string"},"priority":{"enum":["must","should","optional"]},"sceneOrBeat":{"type":"string"},"coverageRole":{"type":"string"},"framing":{"type":"string"},"angle":{"type":"string"},"movement":{"type":"string"},"subjectAction":{"type":"string"},"suggestedHoldSeconds":{"type":"integer"},"audio":{"type":"string"},"equipment":{"type":"array","items":{"type":"string"}},"continuityNote":{"type":"string"},"captureInstruction":{"type":"string"},"reason":{"type":"string"},"alternativeIfImpossible":{"type":"string"}}}},"coverageRisks":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["riskId","severity","beat","risk","recovery"],"properties":{"riskId":{"type":"string"},"severity":{"type":"string"},"beat":{"type":"string"},"risk":{"type":"string"},"recovery":{"type":"string"}}}},"captureChecklist":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["itemId","group","label","required"],"properties":{"itemId":{"type":"string"},"group":{"enum":["before","during","finish"]},"label":{"type":"string"},"required":{"type":"boolean"}}}},"revision":{"type":"object","required":["included","used","boundary"],"properties":{"included":{"const":1},"used":{"enum":[0,1]},"boundary":{"type":"string"},"lastRequest":{"type":"string"}}}}},"PlanSummary":{"type":"object","additionalProperties":false,"required":["taskId","orderId","status","title","version","createdAt","updatedAt","planExpiresAt","privateInputExpiresAt","privateInputPurgedAt","revisionUsed"],"properties":{"taskId":{"type":"string"},"orderId":{"type":"string"},"status":{"type":"string"},"title":{"type":"string"},"version":{"type":"integer","minimum":1},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"planExpiresAt":{"type":["string","null"],"format":"date-time"},"privateInputExpiresAt":{"type":"string","format":"date-time"},"privateInputPurgedAt":{"type":["string","null"],"format":"date-time"},"revisionUsed":{"type":"integer","enum":[0,1]}}},"ProgressSyncResult":{"type":"object","additionalProperties":false,"required":["taskId","version","updatedAt","progress","results"],"properties":{"taskId":{"type":"string"},"version":{"type":"integer","minimum":1},"updatedAt":{"type":"string","format":"date-time"},"progress":{"type":"array","uniqueItems":true,"items":{"type":"string","pattern":"^(shot|check):"}},"results":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["opId","result"],"properties":{"opId":{"type":"string","format":"uuid"},"result":{"enum":["applied","duplicate","item_not_in_current_version","item_changed_in_current_version","base_version_unavailable"]},"priorResult":{"enum":["applied","item_not_in_current_version","item_changed_in_current_version","base_version_unavailable"]}}}}}},"TaskStatus":{"type":"object","required":["taskId","orderId","status","revisionUsed","planExpiresAt","privateInputExpiresAt","privateInputPurgedAt"],"properties":{"taskId":{"type":"string"},"orderId":{"type":"string"},"status":{"type":"string"},"revisionUsed":{"type":"integer"},"planExpiresAt":{"type":["string","null"],"format":"date-time"},"privateInputExpiresAt":{"type":"string","format":"date-time"},"privateInputPurgedAt":{"type":["string","null"],"format":"date-time"}}},"Task":{"allOf":[{"$ref":"#/components/schemas/TaskStatus"},{"type":"object","required":["plan"],"properties":{"plan":{"$ref":"#/components/schemas/Plan"}}}]}}}}