{"openapi":"3.1.0","info":{"title":"BeatSyncAPI","version":"1.0.0","description":"Analyze an uploaded audio file for BPM, beat timestamps, downbeats, and cut-ready timing points.","x-beatsyncapi-contract":{"limits":{"max_audio_bytes":10485760,"max_audio_mib":10,"max_audio_duration_seconds":120,"max_multipart_body_bytes":11534336,"rapidapi_request_limit_mb":12},"plans":{"Basic":{"price_usd_monthly":null,"monthly_requests":null,"requests_per_minute":null,"hard_limit":true},"Pro":{"price_usd_monthly":25,"monthly_requests":300,"requests_per_minute":2,"hard_limit":true}}}},"servers":[{"url":"https://beatsyncapi.p.rapidapi.com","description":"RapidAPI"}],"paths":{"/health":{"get":{"operationId":"getHealth","summary":"Check gateway health","responses":{"200":{"description":"Gateway is available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"},"example":{"status":"ok"}}}}}}},"/v1/analyze-sync":{"post":{"operationId":"analyzeSync","summary":"Analyze uploaded audio","description":"Both Basic and Pro accept one audio file up to 10 MiB and 120 seconds. Both plans use a Hard Limit with no overage.","security":[{"RapidAPIKey":[]}],"parameters":[{"name":"X-RapidAPI-Host","in":"header","required":true,"schema":{"type":"string","const":"beatsyncapi.p.rapidapi.com"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AnalyzeSyncMultipart"}}}},"responses":{"200":{"description":"Analysis completed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeSyncResponse"},"example":{"duration":34.12,"bpm":99.4,"beats":[{"time":0.61},{"time":1.22}],"downbeats":[{"time":0.61,"bar":1}],"cut_points":[{"time":4.84,"score":0.88,"type":"strong"}],"cut_points_by_style":{},"meta":{"task_id":"atsk_...","request_id":"req_...","processing_ms":2841,"audio_duration":34.12,"schema_version":"1.0","engine_version":"beat-this-final0"}}}}},"400":{"$ref":"#/components/responses/ClientError"},"403":{"$ref":"#/components/responses/ClientError"},"413":{"$ref":"#/components/responses/FileTooLarge"},"415":{"$ref":"#/components/responses/ClientError"},"429":{"$ref":"#/components/responses/ClientError"},"500":{"$ref":"#/components/responses/ServiceError"},"503":{"$ref":"#/components/responses/ServiceError"},"504":{"$ref":"#/components/responses/ServiceError"}}}}},"components":{"securitySchemes":{"RapidAPIKey":{"type":"apiKey","in":"header","name":"X-RapidAPI-Key"}},"schemas":{"AnalyzeSyncMultipart":{"type":"object","additionalProperties":false,"required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"Audio file up to 10 MiB and 120 seconds."}}},"AnalyzeSyncResponse":{"type":"object","additionalProperties":false,"required":["duration","bpm","beats","downbeats","cut_points","cut_points_by_style","meta"],"properties":{"duration":{"type":"number"},"bpm":{"type":"number"},"beats":{"type":"array","items":{"$ref":"#/components/schemas/BeatPoint"}},"downbeats":{"type":"array","items":{"$ref":"#/components/schemas/Downbeat"}},"cut_points":{"type":"array","description":"Default downbeat-oriented cut points.","items":{"$ref":"#/components/schemas/CutPoint"}},"cut_points_by_style":{"type":"object","description":"Optional style-specific cut point sets. Empty until a style is implemented and documented.","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/CutPoint"}}},"meta":{"$ref":"#/components/schemas/AnalyzeMeta"}}},"BeatPoint":{"type":"object","additionalProperties":false,"required":["time"],"properties":{"time":{"type":"number"}}},"Downbeat":{"type":"object","additionalProperties":false,"required":["time","bar"],"properties":{"time":{"type":"number"},"bar":{"type":"integer"}}},"CutPoint":{"type":"object","additionalProperties":false,"required":["time","score","type"],"properties":{"time":{"type":"number"},"score":{"type":"number"},"type":{"type":"string"}}},"AnalyzeMeta":{"type":"object","additionalProperties":false,"required":["task_id","request_id","processing_ms","audio_duration","schema_version","engine_version"],"properties":{"task_id":{"type":"string"},"request_id":{"type":"string"},"processing_ms":{"type":"integer"},"audio_duration":{"type":"number"},"schema_version":{"type":"string"},"engine_version":{"type":"string"}}},"HealthResponse":{"type":"object","additionalProperties":false,"required":["status"],"properties":{"status":{"type":"string","const":"ok"}}},"ErrorDetail":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","forbidden","unsupported_media_type","invalid_idempotency_key","body_too_large","invalid_request","file_too_large","idempotency_conflict","too_many_requests","SERVICE_UNAVAILABLE","INVALID_REQUEST","INVALID_AUDIO_URL","URL_NOT_PUBLIC","URL_RESOLVE_FAILED","REDIRECT_NOT_ALLOWED","DOWNLOAD_TIMEOUT","FILE_TOO_LARGE","UNSUPPORTED_AUDIO_FORMAT","AUDIO_TOO_LONG","ANALYSIS_TIMEOUT","ANALYSIS_FAILED","RAPIDAPI_AUTH_FAILED","INTERNAL_ERROR"]},"message":{"type":"string"},"request_id":{"type":"string"}}},"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"},"task_id":{"type":"string"}}}},"responses":{"ClientError":{"description":"The request is invalid, unauthorized, unsupported, or over a plan limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"invalid_request","message":"Multipart upload requires a file field named file."}}}}},"FileTooLarge":{"description":"The multipart body or audio file is too large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"file_too_large","message":"Uploaded audio file exceeds the 10 MiB limit."}}}}},"ServiceError":{"description":"The service failed or timed out.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":{"code":"ANALYSIS_TIMEOUT","message":"Analysis did not finish before the synchronous response timeout.","request_id":"req_..."},"task_id":"atsk_..."}}}}}}}