{"openapi":"3.1.0","info":{"title":"Picture Framing API","version":"1.0.0","description":"Picture-framing maths as an API, computed locally and deterministically — the mat-cutting and moulding numbers a framer or artist measures a job by. The mat endpoint sizes the mat board around an artwork: the window opening is the art minus a small overlap on each edge (≈ 0.25 inch so the mat holds the print), and the outer mat is the window plus the border widths — give one border or per-side borders, with a heavier bottom for a balanced, bottom-weighted mat, so an 8×10 print with a 2-inch border has a 7.5×9.5 window and an 11.5×13.5 mat. The moulding endpoint computes the frame stick needed: length = inner perimeter + 8 × the moulding width, because each of the four 45-degree mitred corners adds one moulding width — an 11.5×13.5 frame in 1.5-inch moulding needs 62.5 inches, plus any waste allowance. Everything is computed locally and deterministically, so it is instant and private. Ideal for picture-framing, custom-framing, art-gallery and DIY app developers, mat-cutter and moulding-estimating tools, and framing education. Pure local computation — no key, no third-party service, instant. Imperial inches in; lengths in inches and feet. Live, nothing stored. 2 compute endpoints. A planning aid — measure twice, cut once.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/framing-api","description":"oanor gateway"}],"tags":[{"name":"Framing"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/mat":{"get":{"operationId":"get_v1_mat","tags":["Framing"],"summary":"Mat window & outer size","description":"","parameters":[{"name":"artwork_width","in":"query","required":true,"description":"Artwork width (in)","schema":{"type":"string"},"example":"8"},{"name":"artwork_height","in":"query","required":true,"description":"Artwork height (in)","schema":{"type":"string"},"example":"10"},{"name":"border","in":"query","required":false,"description":"Border all sides (in)","schema":{"type":"string"},"example":"2"},{"name":"border_top","in":"query","required":false,"description":"Top border (in)","schema":{"type":"string"}},{"name":"border_bottom","in":"query","required":false,"description":"Bottom border (weighted)","schema":{"type":"string"}},{"name":"border_sides","in":"query","required":false,"description":"Side borders (in)","schema":{"type":"string"}},{"name":"overlap","in":"query","required":false,"description":"Mat overlap per edge (in, default 0.25)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"The mat window is the artwork minus the overlap on each edge (so the mat holds it). Outer size = window + the borders. A heavier bottom border (weighted/bottom-weighted mat) looks balanced to the eye.","inputs":{"overlap":0.25,"border_top":2,"border_sides":2,"artwork_width":8,"border_bottom":2,"artwork_height":10},"outer_width":11.5,"outer_height":13.5,"window_width":7.5,"window_height":9.5},"meta":{"timestamp":"2026-06-06T07:14:09.406Z","request_id":"d6d924f4-8472-4c59-bdc7-7d72b185d6bd"},"status":"ok","message":"Mat board","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/moulding":{"get":{"operationId":"get_v1_moulding","tags":["Framing"],"summary":"Frame moulding length","description":"","parameters":[{"name":"frame_width","in":"query","required":true,"description":"Frame opening width (in)","schema":{"type":"string"},"example":"11.5"},{"name":"frame_height","in":"query","required":true,"description":"Frame opening height (in)","schema":{"type":"string"},"example":"13.5"},{"name":"moulding_width","in":"query","required":true,"description":"Moulding face width (in)","schema":{"type":"string"},"example":"1.5"},{"name":"clearance","in":"query","required":false,"description":"Rabbet clearance (in, default 0.125)","schema":{"type":"string"}},{"name":"waste_percent","in":"query","required":false,"description":"Waste % (default 0)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Moulding length = inner perimeter + 8 × moulding width (the 45° mitres add one moulding width per corner-cut). Buy a little extra — cuts and short ends add up.","inputs":{"clearance":0.125,"frame_width":11.5,"frame_height":13.5,"moulding_width":1.5},"rabbet_width":11.625,"rabbet_height":13.625,"inner_perimeter":50.5,"mitre_allowance":12,"moulding_length_feet":5.208,"moulding_length_inches":62.5},"meta":{"timestamp":"2026-06-06T07:14:09.493Z","request_id":"c91deb57-1512-4a39-aa36-7436aef484dc"},"status":"ok","message":"Frame moulding","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"notes":"Imperial inches. Mat overlaps the art ~0.25\" each edge; borders default 2\" (use a heavier bottom for a weighted mat). Moulding adds 8× the moulding width for the corners. A planning aid.","service":"framing-api","endpoints":{"GET /v1/mat":"Mat window (over the art) and outer mat size from the artwork and border widths.","GET /v1/meta":"This document.","GET /v1/moulding":"Frame moulding length needed, including the 45° mitre allowance."},"description":"Picture-framing maths: mat board window & outer size, and frame moulding length with mitre allowance."},"meta":{"timestamp":"2026-06-06T07:14:09.573Z","request_id":"e826dd06-7c8c-4d6b-8872-53fab3a9e5ed"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":5750,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":460,"monthly_call_quota":54500,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1280,"monthly_call_quota":234000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":3900,"monthly_call_quota":1280000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/framing-api"}