{"openapi":"3.1.0","info":{"title":"Clean Songs","version":"1.0.0","description":"Analyze customer-provided text in Portuguese and English for profanity, drugs, violence, and explicit sexual content. Get clear classifications, minimal evidence, and line numbers using deterministic rules.","contact":{"name":"Clean Songs","url":"https://www.oanor.com/by/clean-songs"}},"servers":[{"url":"https://api.oanor.com/clean-songs","description":"oanor gateway"}],"tags":[{"name":"v1"}],"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/health":{"get":{"operationId":"get_v1_health","tags":["v1"],"summary":"Health","description":"Check service availability.","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"status":"ok"}}}},"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/lyric-submissions/{submission_id}":{"get":{"operationId":"get_v1_lyric_submissions_submission_id_","tags":["v1"],"summary":"Check lyric submission status","description":"Returns only the submission ID and curation status (pending, approved or rejected). Approved lyrics go to an internal archive and are still not displayed to app users. Requires the X-Submission-Token header with the one-time token returned at creation.","parameters":[{"name":"submission_id","in":"path","required":true,"description":"submission ID to consult curation status","schema":{"type":"string"}},{"name":"X-Submission-Token","in":"header","required":true,"description":"One-time tracking token returned as tracking_token in the 202 response of POST /v1/lyric-submissions. Send it exactly as received (43 characters). It does not expire and cannot be recovered.","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/reports/{report_id}":{"get":{"operationId":"get_v1_reports_report_id_","tags":["v1"],"summary":"Reports","description":"Returns only the report ID and administrative review status (pending, approved or rejected). Approved means the report was accepted; it does not publish a rule change. Requires the X-Report-Token header with the one-time tracking token returned when the report was created.","parameters":[{"name":"X-Report-Token","in":"header","required":true,"description":"One-time tracking token returned as tracking_token in the 202 response of POST /v1/reports. Send it exactly as received (43 characters: letters, digits, \"-\" and \"_\"). Keep it secret; it cannot be recovered or reissued. Never put it in the URL or query string.","schema":{"type":"string"}},{"name":"report_id","in":"path","required":true,"description":"Report ID returned as report_id in the 202 response of POST /v1/reports (32 lowercase hexadecimal characters). Knowing the ID alone does not grant access; the matching X-Report-Token header is also required.","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/analyze-text":{"post":{"operationId":"post_v1_analyze_text","tags":["v1"],"summary":"Analyze Text","description":"Analyze customer-provided text in Portuguese or English.","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/lyric-submissions":{"post":{"operationId":"post_v1_lyric_submissions","tags":["v1"],"summary":"Submit lyrics for curation","description":"\t\nSubmit complete lyrics with song title and artist for human curation. Requires rights_confirmed and consent_to_store set to true. Submitted lyrics are never displayed to app users. Returns a submission ID and a one-time tracking token.","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/reports":{"post":{"operationId":"post_v1_reports","tags":["v1"],"summary":"Report an analysis issue","description":"Submit a false-positive or false-negative report for human review. Includes optional evidence of up to 280 characters and requires explicit consent to store the report. Reports do not automatically change detection rules.","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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":"tier-free","name":"Free","price_cents_month":0,"monthly_call_quota":1000,"rps_limit":1,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/clean-songs"}