{"openapi":"3.1.0","info":{"title":"Splice API","version":"0.1.0","description":"A fully local video/photo production technical calculator toolkit: depth of field, field of view, exposure triangle, timecode/frame-rate conversion with SMPTE drop-frame math, file size and storage estimates, aspect-ratio conversion, flicker-free shutter speeds, ND filter math, and a glossary.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://splice.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/splice/docs"},"termsOfService":"https://connectorbay.com/splice/terms"},"servers":[{"url":"https://splice.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/splice/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/depth_of_field":{"post":{"operationId":"depth_of_field","summary":"Real computed depth of field: near limit, far limit, total depth of field and hyperfocal distance, from the","description":"Real computed depth of field: near limit, far limit, total depth of field and hyperfocal distance, from the\n    standard circle-of-confusion-based thin-lens formula, using verified CoC constants per sensor format. Use for\n    \"depth of field for a 50mm lens at f/8 on a subject 3m away\", \"hyperfocal distance of a 35mm lens at f/5.6\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"focal_length_mm":{"description":"Lens focal length in mm.","examples":[50],"exclusiveMinimum":0,"maximum":2000,"title":"Focal Length Mm","type":"number"},"aperture_f":{"description":"Aperture as an f-number.","examples":[8],"exclusiveMinimum":0,"maximum":64,"title":"Aperture F","type":"number"},"subject_distance_m":{"description":"Distance from camera to subject, in meters.","examples":[3],"exclusiveMinimum":0,"maximum":100000,"title":"Subject Distance M","type":"number"},"sensor_format":{"default":"full_frame","description":"full_frame | aps_c | aps_c_canon | micro_four_thirds | one_inch | super_35","title":"Sensor Format","type":"string"}},"required":["focal_length_mm","aperture_f","subject_distance_m"],"title":"depth_of_fieldArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/field_of_view":{"post":{"operationId":"field_of_view","summary":"Horizontal, vertical and diagonal angle of view for a lens and sensor format, plus the full-frame-equivalent","description":"Horizontal, vertical and diagonal angle of view for a lens and sensor format, plus the full-frame-equivalent\n    focal length. Use for \"field of view of a 24mm lens on full frame\", \"35mm lens on Micro Four Thirds in full\n    frame terms\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"focal_length_mm":{"description":"Lens focal length in mm.","examples":[24],"exclusiveMinimum":0,"maximum":2000,"title":"Focal Length Mm","type":"number"},"sensor_format":{"default":"full_frame","description":"full_frame | aps_c | aps_c_canon | micro_four_thirds | one_inch | super_35","title":"Sensor Format","type":"string"}},"required":["focal_length_mm"],"title":"field_of_viewArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/exposure_triangle":{"post":{"operationId":"exposure_triangle","summary":"Given a correctly-exposed ISO/aperture/shutter-speed and one or two target changes, computes the remaining","description":"Given a correctly-exposed ISO/aperture/shutter-speed and one or two target changes, computes the remaining\n    setting needed to keep the same exposure — real stops-based reciprocity math (each full stop of aperture,\n    shutter speed or ISO is a factor of 2 in light). Use for \"I'm at ISO 100 f/2.8 1/125, what shutter speed do I\n    need at ISO 400\", \"correct exposure is f/4 1/60 ISO 100 — what aperture at 1/250 and ISO 400\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"current_iso":{"description":"A correctly-exposed ISO.","examples":[100],"exclusiveMinimum":0,"maximum":6553600,"title":"Current Iso","type":"number"},"current_aperture":{"description":"Correctly-exposed aperture, as an f-number.","examples":[2.8],"exclusiveMinimum":0,"maximum":90,"title":"Current Aperture","type":"number"},"current_shutter_speed":{"description":"Correctly-exposed shutter speed: '1/125', '2', '0.5'.","examples":["1/125"],"title":"Current Shutter Speed","type":"string"},"target_iso":{"anyOf":[{"exclusiveMinimum":0,"maximum":6553600,"type":"number"},{"type":"null"}],"default":null,"description":"A new ISO to change to.","title":"Target Iso"},"target_aperture":{"anyOf":[{"exclusiveMinimum":0,"maximum":90,"type":"number"},{"type":"null"}],"default":null,"description":"A new aperture to change to.","title":"Target Aperture"},"target_shutter_speed":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A new shutter speed to change to.","title":"Target Shutter Speed"}},"required":["current_iso","current_aperture","current_shutter_speed"],"title":"exposure_triangleArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/frame_rate_timecode_convert":{"post":{"operationId":"frame_rate_timecode_convert","summary":"Converts a timecode between frame rates, preserving real elapsed time, with correct SMPTE drop-frame handling","description":"Converts a timecode between frame rates, preserving real elapsed time, with correct SMPTE drop-frame handling\n    at 29.97/59.94fps (drops frame numbers 0-1 (or 0-3 at 59.94) at the start of every minute except every 10th).\n    Use for \"convert 01:20:15:10 from 24fps to 29.97 drop frame\", \"what's 00:10:00;00 at 29.97 in 25fps\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"timecode":{"description":"HH:MM:SS:FF, or HH:MM:SS;FF for drop-frame.","examples":["01:20:15:10"],"title":"Timecode","type":"string"},"from_fps":{"description":"Source frame rate.","examples":[24],"exclusiveMinimum":0,"maximum":1000,"title":"From Fps","type":"number"},"to_fps":{"description":"Target frame rate.","examples":[29.97],"exclusiveMinimum":0,"maximum":1000,"title":"To Fps","type":"number"}},"required":["timecode","from_fps","to_fps"],"title":"frame_rate_timecode_convertArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/file_size_estimator":{"post":{"operationId":"file_size_estimator","summary":"Estimates raw video file size from resolution, frame rate and codec, using Apple's own published ProRes data","description":"Estimates raw video file size from resolution, frame rate and codec, using Apple's own published ProRes data\n    rates or YouTube's published typical H.264 bitrates (H.265 estimated at its commonly-cited ~50% reduction) —\n    or a bitrate you supply directly. Use for \"file size of a 10 minute 4K ProRes 422 HQ clip at 24fps\", \"size of a\n    1 hour 1080p60 H.264 recording\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"duration_seconds":{"description":"Clip duration in seconds.","examples":[600],"exclusiveMinimum":0,"maximum":360000,"title":"Duration Seconds","type":"number"},"resolution":{"description":"480p, 720p, 1080p, 1440p, 4k/UHD, '4k dci', 8k, or 'WIDTHxHEIGHT'.","examples":["1080p"],"title":"Resolution","type":"string"},"fps":{"description":"Frame rate.","examples":[24],"exclusiveMinimum":0,"maximum":1000,"title":"Fps","type":"number"},"codec":{"description":"h264, h265/hevc, or a ProRes variant: prores_422_proxy, prores_422_lt, prores_422, prores_422_hq, prores_4444, prores_4444_xq.","examples":["prores_422_hq"],"title":"Codec","type":"string"},"bitrate_mbps":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Override with a known/target bitrate instead of the published table.","title":"Bitrate Mbps"}},"required":["duration_seconds","resolution","fps","codec"],"title":"file_size_estimatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/aspect_ratio_convert":{"post":{"operationId":"aspect_ratio_convert","summary":"Computes centered crop-to-fill dimensions (loses area) and letterbox/pillarbox-to-fit dimensions (keeps all","description":"Computes centered crop-to-fill dimensions (loses area) and letterbox/pillarbox-to-fit dimensions (keeps all\n    area, adds bars) to convert between aspect ratios. Use for \"crop 1920x1080 to 2.39:1\", \"letterbox 4:3 footage\n    to 16:9\", \"fit a 9:16 vertical video into 16:9\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"width":{"description":"Source width.","examples":[1920],"exclusiveMinimum":0,"title":"Width","type":"number"},"height":{"description":"Source height.","examples":[1080],"exclusiveMinimum":0,"title":"Height","type":"number"},"target_ratio":{"description":"'16:9', '4:3', '2.39:1', '1:1', '9:16', or any 'W:H'.","examples":["2.39:1"],"title":"Target Ratio","type":"string"}},"required":["width","height","target_ratio"],"title":"aspect_ratio_convertArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/storage_capacity_calculator":{"post":{"operationId":"storage_capacity_calculator","summary":"How much recording time fits in a given amount of storage at a given bitrate. Use for \"how much 4K footage","description":"How much recording time fits in a given amount of storage at a given bitrate. Use for \"how much 4K footage\n    fits on a 500GB card at 100 Mbps\", \"recording time on a 1TB drive at 50 Mbps\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"available_gb":{"description":"Available storage in GB.","examples":[500],"exclusiveMinimum":0,"maximum":10000000,"title":"Available Gb","type":"number"},"bitrate_mbps":{"description":"Recording bitrate in Mbps.","examples":[100],"exclusiveMinimum":0,"title":"Bitrate Mbps","type":"number"}},"required":["available_gb","bitrate_mbps"],"title":"storage_capacity_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/flicker_free_shutter_speeds":{"post":{"operationId":"flicker_free_shutter_speeds","summary":"The 180-degree-shutter-rule ideal shutter speed, plus the mains-frequency-safe shutter speeds that avoid","description":"The 180-degree-shutter-rule ideal shutter speed, plus the mains-frequency-safe shutter speeds that avoid\n    flicker/banding under artificial (AC-powered) lighting, for 50Hz vs 60Hz regions. Use for \"flicker-free shutter\n    speed for 24fps under 50Hz lighting\", \"safe shutter speeds at 60fps in the US\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"frame_rate":{"description":"Frame rate.","examples":[24],"exclusiveMinimum":0,"maximum":1000,"title":"Frame Rate","type":"number"},"power_grid_hz":{"default":60,"description":"Mains power frequency: 50 or 60.","title":"Power Grid Hz","type":"number"}},"required":["frame_rate"],"title":"flicker_free_shutter_speedsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/nd_filter_calculator":{"post":{"operationId":"nd_filter_calculator","summary":"Converts between an ND filter's strength and the resulting shutter-speed change, in either direction: give a","description":"Converts between an ND filter's strength and the resulting shutter-speed change, in either direction: give a\n    filter name to get the resulting shutter speed, or a target shutter speed to get the filter needed. Verified\n    stop values (ND2=1 stop ... ND1000=10 stops). Use for \"ND64 filter on 1/500, what's my new shutter speed\",\n    \"what ND filter do I need to go from 1/500 to 1/2 second\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"base_shutter_speed":{"description":"Shutter speed without the filter: '1/500', '1/125'.","examples":["1/500"],"title":"Base Shutter Speed","type":"string"},"nd_filter_strength":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"An ND filter name (ND2, ND4, ND8, ND16, ND32, ND64, ND128, ND256, ND1000...) to apply to base_shutter_speed.","examples":["ND64"],"title":"Nd Filter Strength"},"target_shutter_speed":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Instead of a filter name: the shutter speed you want to reach, to find the ND filter needed.","examples":["1/2"],"title":"Target Shutter Speed"}},"required":["base_shutter_speed"],"title":"nd_filter_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/light_loss_stops":{"post":{"operationId":"light_loss_stops","summary":"Looks up the stops of light reduction, filter factor and light transmission percentage for a named ND","description":"Looks up the stops of light reduction, filter factor and light transmission percentage for a named ND\n    filter. Use for \"how many stops is an ND64 filter\", \"what percent of light does an ND8 let through\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"nd_filter_strength":{"description":"An ND filter name: ND2, ND4, ND8, ND16, ND32, ND64, ND128, ND256, ND1000...","examples":["ND8"],"title":"Nd Filter Strength","type":"string"}},"required":["nd_filter_strength"],"title":"light_loss_stopsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/film_photo_glossary":{"post":{"operationId":"film_photo_glossary","summary":"Definitions of core video/photo production terms: circle of confusion, hyperfocal distance, stop, drop-frame","description":"Definitions of core video/photo production terms: circle of confusion, hyperfocal distance, stop, drop-frame\n    timecode, bit depth, chroma subsampling, the 180-degree shutter rule, ND filter, depth of field, crop factor,\n    aspect ratio, bitrate, codec. Use for \"what does drop-frame timecode mean\", \"what's chroma subsampling\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"A specific term to look up; omit to list all.","title":"Term"}},"title":"film_photo_glossaryArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}