{"openapi":"3.1.0","info":{"title":"Tangent Recording public studio API","version":"1.0.0","description":"Guest studio facts and team-reviewed inquiries. No payment, booking confirmation or internal manager tools."},"servers":[{"url":"https://www.tangentrecording.com"}],"paths":{"/api/public/tools/get_studio_information":{"post":{"operationId":"get_studio_information","description":"Read published studio facts, $150/hour engineer-inclusive pricing with no minimum, or FAQs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","enum":["overview","rooms","equipment","pricing","faq"]}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}},"responses":{"200":{"description":"Public facts, availability check, status, or a durable pending-review receipt."},"400":{"description":"Invalid request."},"409":{"description":"Idempotency key reused with different details."},"429":{"description":"Intake rate limit reached."},"503":{"description":"Service unavailable; no successful write is claimed."}}}},"/api/public/tools/estimate_session_cost":{"post":{"operationId":"estimate_session_cost","description":"Estimate requested minutes at $2.50/minute with engineer included, no minimum. Standard rate assumed across room/service options; final scope and quote require team confirmation. Does not book or charge.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"durationMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":1440},"room":{"type":"string","enum":["live","mix","both","unsure"],"default":"unsure"},"service":{"type":"string","enum":["recording","mixing","atmos_post"],"default":"recording"}},"required":["durationMinutes"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}},"responses":{"200":{"description":"Public facts, availability check, status, or a durable pending-review receipt."},"400":{"description":"Invalid request."},"409":{"description":"Idempotency key reused with different details."},"429":{"description":"Intake rate limit reached."},"503":{"description":"Service unavailable; no successful write is claimed."}}}},"/api/public/tools/submit_studio_inquiry":{"post":{"operationId":"submit_studio_inquiry","description":"With explicit customer consent, save a session, question or callback request for team review. Reuse the same idempotency key only for retrying the same details. This does not confirm a booking.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["session","question","callback"]},"name":{"type":"string","minLength":1,"maxLength":120},"email":{"type":"string","format":"email","maxLength":254},"phone":{"type":"string","pattern":"^[+\\d][\\d\\s().-]{6,39}$"},"room":{"type":"string","enum":["live","mix","both","unsure"]},"preferredDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"durationMinutes":{"type":"integer","exclusiveMinimum":0,"maximum":1440},"message":{"type":"string","minLength":1,"maxLength":4000},"consent":{"type":"boolean","const":true},"idempotencyKey":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[a-zA-Z0-9_-]+$"}},"required":["kind","name","email","message","consent","idempotencyKey"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}},"responses":{"200":{"description":"Public facts, availability check, status, or a durable pending-review receipt."},"400":{"description":"Invalid request."},"409":{"description":"Idempotency key reused with different details."},"429":{"description":"Intake rate limit reached."},"503":{"description":"Service unavailable; no successful write is claimed."}}}},"/api/public/tools/check_session_availability":{"post":{"operationId":"check_session_availability","description":"Check a requested calendar window when live availability has been enabled. Does not reserve a room or confirm a booking.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"room":{"type":"string","enum":["live","mix","both"]},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"}},"required":["room","startsAt","endsAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}},"responses":{"200":{"description":"Public facts, availability check, status, or a durable pending-review receipt."},"400":{"description":"Invalid request."},"409":{"description":"Idempotency key reused with different details."},"429":{"description":"Intake rate limit reached."},"503":{"description":"Service unavailable; no successful write is claimed."}}}},"/api/public/tools/get_inquiry_status":{"post":{"operationId":"get_inquiry_status","description":"Read only your request status using the private status token from its receipt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid"},"statusToken":{"type":"string","minLength":32,"maxLength":128}},"required":["requestId","statusToken"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}},"responses":{"200":{"description":"Public facts, availability check, status, or a durable pending-review receipt."},"400":{"description":"Invalid request."},"409":{"description":"Idempotency key reused with different details."},"429":{"description":"Intake rate limit reached."},"503":{"description":"Service unavailable; no successful write is claimed."}}}}}}