{"openapi":"3.1.0","info":{"title":"Compomap API","version":"0.1.0","description":"A fully local, hand-curated photo composition reference (rule of thirds, leading lines, framing, symmetry, negative space, golden ratio and more) plus a computed tool returning exact thirds-grid or golden-ratio-grid coordinates for a given aspect ratio, canvas size and subject-position category.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://compomap.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/compomap/docs"},"termsOfService":"https://connectorbay.com/compomap/terms"},"servers":[{"url":"https://compomap.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/compomap/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/rule_info":{"post":{"operationId":"rule_info","summary":"Full explanation of one composition principle: description, when to use it, and common mistakes. Use for","description":"Full explanation of one composition principle: description, when to use it, and common mistakes. Use for\n    \"explain the rule of thirds\", \"when should I use negative space\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"rule":{"description":"A composition rule.","examples":["rule_of_thirds","leading_lines","negative_space"],"minLength":1,"title":"Rule","type":"string"}},"required":["rule"],"title":"rule_infoArguments","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/rule_list":{"post":{"operationId":"rule_list","summary":"All ten composition rules with a one-line description. Use for \"what composition rules do you cover\".","description":"All ten composition rules with a one-line description. Use for \"what composition rules do you cover\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"rule_listArguments","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/rule_for_scenario":{"post":{"operationId":"rule_for_scenario","summary":"Suggests 1-3 relevant composition rules for a described scene, keyword-matched against each rule's","description":"Suggests 1-3 relevant composition rules for a described scene, keyword-matched against each rule's\n    description and when-to-use guidance. Use for \"what composition rule fits a scene with a long road\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"scene_description":{"description":"A scene or goal, in plain language.","examples":["a long straight road disappearing into the distance","a small person standing in a huge empty desert"],"minLength":1,"title":"Scene Description","type":"string"}},"required":["scene_description"],"title":"rule_for_scenarioArguments","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/thirds_grid_coordinates":{"post":{"operationId":"thirds_grid_coordinates","summary":"Real computed geometry: returns the exact rule-of-thirds or golden-ratio grid-line coordinates and the four","description":"Real computed geometry: returns the exact rule-of-thirds or golden-ratio grid-line coordinates and the four\n    intersection ('power point') coordinates for a given aspect ratio and canvas size, plus a recommended subject\n    x/y position for the given subject-position category. Use for \"thirds-grid coordinates for a 16:9 photo,\n    subject in the top-left third\", \"golden ratio grid for a 1080x1350 canvas\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"aspect_ratio":{"description":"e.g. '16:9', '4:3', '1:1', '9:16', or 'WIDTHxHEIGHT'.","examples":["16:9"],"minLength":1,"title":"Aspect Ratio","type":"string"},"subject_position":{"default":"top_left","description":"top_left | top_right | bottom_left | bottom_right | top_third | bottom_third | left_third | right_third | center","title":"Subject Position","type":"string"},"canvas_width_px":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Canvas width in pixels. If omitted, a default width of 1200px is used.","title":"Canvas Width Px"},"canvas_height_px":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"default":null,"description":"Canvas height in pixels. If both width and height are given, aspect_ratio is used only to label the result.","title":"Canvas Height Px"},"grid_type":{"default":"thirds","description":"thirds | golden_ratio","title":"Grid Type","type":"string"}},"required":["aspect_ratio"],"title":"thirds_grid_coordinatesArguments","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/leading_lines_types":{"post":{"operationId":"leading_lines_types","summary":"The four categories of leading lines: converging, diagonal, curved/S-curve, and implied lines. Use for","description":"The four categories of leading lines: converging, diagonal, curved/S-curve, and implied lines. Use for\n    \"what types of leading lines are there\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"leading_lines_typesArguments","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/symmetry_types":{"post":{"operationId":"symmetry_types","summary":"The four categories of symmetry in composition: vertical, horizontal, radial, and broken symmetry. Use for","description":"The four categories of symmetry in composition: vertical, horizontal, radial, and broken symmetry. Use for\n    \"what types of symmetry are there in photography\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"symmetry_typesArguments","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/negative_space_tips":{"post":{"operationId":"negative_space_tips","summary":"Tips for using negative space effectively: simplicity, off-center placement, look room, mood, and aspect","description":"Tips for using negative space effectively: simplicity, off-center placement, look room, mood, and aspect\n    ratio considerations. Use for \"how do I use negative space well\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"negative_space_tipsArguments","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/framing_techniques":{"post":{"operationId":"framing_techniques","summary":"Techniques for using foreground framing: architectural vs organic frames, partial frames, and depth cues.","description":"Techniques for using foreground framing: architectural vs organic frames, partial frames, and depth cues.\n    Use for \"how do I use a doorway to frame my subject\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"framing_techniquesArguments","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/composition_glossary":{"post":{"operationId":"composition_glossary","summary":"Defines composition terms: vanishing point, foreground/midground/background, headroom, look room, rule of","description":"Defines composition terms: vanishing point, foreground/midground/background, headroom, look room, rule of\n    odds, power points, visual weight, depth of field. Use for \"what's look room\", \"what are power points\".","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":"composition_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}}}}