{"openapi":"3.1.0","info":{"title":"Maybloc API","version":"1.0.0","description":"Speech-to-text for recorded audio. Upload a recording and get back a transcript with every speaker separated, overlapping speech kept, and every word timed."},"servers":[{"url":"https://app.maybloc.com/api/v1","description":"Maybloc v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Uploads","description":"Send a recording straight to private storage."},{"name":"Transcripts","description":"Transcribe recordings and read the results."},{"name":"Account","description":"Your workspace and its balance."}],"paths":{"/account":{"get":{"tags":["Account"],"summary":"Retrieve the account","operationId":"getAccount","description":"The workspace's balance, to check credit before submitting, and the calling key's scope.","responses":{"200":{"description":"The account","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"account"},"workspace":{"type":"string"},"balance":{"type":"object","properties":{"currency":{"type":"string","const":"usd"},"micro_usd":{"type":"integer"}}},"key_scope":{"type":"string","enum":["full","read"]}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/uploads":{"post":{"tags":["Uploads"],"summary":"Create an upload","operationId":"createUpload","description":"Returns a URL that accepts one PUT of the file for 15 minutes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadRequest"}}}},"responses":{"201":{"description":"Upload created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Upload"}}}},"400":{"description":"Invalid file name, size or field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"File is larger than 2 GB","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Not a supported audio format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/uploads/{id}/complete":{"post":{"tags":["Uploads"],"summary":"Complete an upload","operationId":"completeUpload","description":"Call after the PUT succeeds. The file's size and type are checked before it can be transcribed.","parameters":[{"$ref":"#/components/parameters/UploadId"}],"responses":{"200":{"description":"Upload verified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompletedUpload"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Upload not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The file is missing or does not match what was declared","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts":{"get":{"tags":["Transcripts"],"summary":"List transcripts","operationId":"listTranscripts","description":"Transcripts newest first, up to limit per page. To read the next page, pass the last id as starting_after while has_more is true.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":100}},{"name":"starting_after","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"The id of the last transcript of the previous page."}],"responses":{"200":{"description":"A list of transcripts","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Transcript"}},"has_more":{"type":"boolean"}}}}}},"400":{"description":"Invalid limit or starting_after","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Transcripts"],"summary":"Create a transcript","operationId":"createTranscript","description":"Queues a completed upload for transcription and holds its price from your balance. Repeating the request with the same Idempotency-Key returns the same transcript and charges once.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTranscriptRequest"}}}},"responses":{"202":{"description":"Transcript queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"400":{"description":"Invalid request, or a recording outside 20 seconds to 3 hours","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Your balance is too low","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Read-only API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Upload not completed, or Idempotency-Key reused for a different request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts/{id}":{"get":{"tags":["Transcripts"],"summary":"Retrieve a transcript","operationId":"getTranscript","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"responses":{"200":{"description":"The transcript","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Transcripts"],"summary":"Rename a transcript or its speakers","operationId":"updateTranscript","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTranscriptRequest"}}}},"responses":{"200":{"description":"The updated transcript","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"400":{"description":"Invalid name","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Read-only API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Transcripts"],"summary":"Delete a transcript","operationId":"deleteTranscript","description":"Deletes the recording and its transcript now. Billing records stay. Cancel a running transcript first.","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"responses":{"204":{"description":"Deleted"},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Read-only API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The transcript is still running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts/{id}/result":{"get":{"tags":["Transcripts"],"summary":"Retrieve the result","operationId":"getTranscriptResult","description":"Available once the transcript is completed.","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"responses":{"200":{"description":"Speakers, timed turns and words, and overlaps","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptResult"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not completed yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts/{id}/export":{"get":{"tags":["Transcripts"],"summary":"Export subtitles or text","operationId":"exportTranscript","description":"The transcript as an SRT or WebVTT subtitle file, or plain text, with speaker names. Subtitles use caption-sized cues when the subtitles add-on is on, otherwise one cue per turn. With redact_pii the text is redacted.","parameters":[{"$ref":"#/components/parameters/TranscriptId"},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["srt","vtt","txt"],"default":"srt"}}],"responses":{"200":{"description":"The file","content":{"application/x-subrip":{"schema":{"type":"string"}},"text/vtt":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Unknown format","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Not completed yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts/{id}/addons":{"post":{"tags":["Transcripts"],"summary":"Add add-ons","operationId":"addTranscriptAddons","description":"Adds add-ons to a completed transcript without transcribing it again, or more translation languages and custom fields to the ones it has. The difference in per-minute price is charged for the recording's length. Generated add-ons are then produced, and the transcript.addons.completed webhook fires when they are ready; names found by identify_speakers are applied to speakers you haven't named.","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["addons"],"properties":{"addons":{"type":"array","items":{"type":"string","enum":["redact_pii","smart_format","subtitles","insights","identify_speakers","sentiment","topics","keywords","custom_fields","translation"]},"minItems":1},"translate_to":{"type":"array","items":{"type":"string"},"description":"More languages, with translation."},"custom_fields":{"type":"array","items":{"$ref":"#/components/schemas/CustomField"},"description":"More questions, with custom_fields."}}}}}},"responses":{"200":{"description":"The transcript with its new configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"400":{"description":"Unknown add-on","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Your balance is too low","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Read-only API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The transcript isn't completed, or add-ons are still being generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/transcripts/{id}/cancel":{"post":{"tags":["Transcripts"],"summary":"Cancel a transcript","operationId":"cancelTranscript","description":"Stops a queued or running transcript. Canceled transcripts are not charged.","parameters":[{"$ref":"#/components/parameters/TranscriptId"}],"responses":{"200":{"description":"The canceled transcript","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transcript"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Read-only API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Transcript not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The transcript has already finished","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An API key: Authorization: Bearer mbk_live_..."}},"parameters":{"TranscriptId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"UploadId":{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":160},"description":"A unique key per transcript you want. Reuse it only to retry the same request."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","request_id"],"properties":{"code":{"type":"string","examples":["invalid_request","insufficient_credit","rate_limited"]},"message":{"type":"string"},"request_id":{"type":"string","description":"Quote this when contacting support."}}}}},"CreateUploadRequest":{"type":"object","required":["file_name","content_type","byte_size"],"properties":{"file_name":{"type":"string","maxLength":255,"description":"Shown as the transcript's title."},"content_type":{"type":"string","enum":["audio/mpeg","audio/mp4","audio/x-m4a","audio/aac","audio/wav","audio/x-wav","audio/wave","audio/vnd.wave","audio/flac","audio/x-flac","audio/ogg","audio/opus","audio/webm","video/mp4","video/quicktime","video/x-matroska","video/webm"],"description":"MP3, M4A, AAC, WAV, FLAC, OGG, Opus or WebM audio, or MP4, MOV, MKV or WebM video (only the sound is kept)."},"byte_size":{"type":"integer","minimum":1,"maximum":2147483648}}},"Upload":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"upload"},"upload_url":{"type":"string","format":"uri","description":"PUT the file bytes here, with the returned headers."},"headers":{"type":"object","additionalProperties":{"type":"string"}},"file_name":{"type":"string"},"content_type":{"type":"string"},"byte_size":{"type":"integer"},"status":{"type":"string","const":"pending"}}},"CompletedUpload":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"upload"},"status":{"type":"string","const":"completed"}}},"CreateTranscriptRequest":{"type":"object","required":["upload_id","duration_ms"],"properties":{"upload_id":{"type":"string","format":"uuid"},"duration_ms":{"type":"integer","minimum":20000,"maximum":10800000,"description":"The recording's length (20 seconds to 3 hours). The price is based on it, and it is checked against the file."},"config":{"$ref":"#/components/schemas/RunConfig"}}},"RunConfig":{"type":"object","additionalProperties":false,"description":"How the transcript is made. Unknown fields are rejected. The playground's Export config writes this object.","properties":{"model":{"type":"string","enum":["calico-1-flash"],"default":"calico-1-flash"},"language":{"type":"string","enum":["auto","en","es","fr","de","it","pt","nl","pl","ru","uk","tr","ar","fa","he","hi","ur","bn","ta","te","mr","gu","pa","kn","ml","zh","ja","ko","th","vi","id","ms","tl","sv","da","no","fi","cs","ro","hu","el","bg","hr","sk","sl","sr"],"default":"auto","description":"ISO 639-1 code of the spoken language, or auto to detect one language for the recording."},"addons":{"type":"array","uniqueItems":true,"items":{"type":"string","enum":["redact_pii","smart_format","subtitles","insights","identify_speakers","sentiment","topics","keywords","custom_fields","translation"]},"description":"Made from the transcript and priced per minute on top of the model: redact_pii (PII redaction, +$0.0005/min), smart_format (Smart formatting, +$0.0005/min), subtitles (Subtitles, free), insights (Insights, +$0.001/min), identify_speakers (Speaker names, +$0.0005/min), sentiment (Sentiment, +$0.0005/min), topics (Topics and entities, +$0.0005/min), keywords (Key terms, +$0.0005/min), custom_fields (Custom fields, +$0.0005/min), translation (Translation, +$0.0015/min per language)."},"translate_to":{"type":"array","uniqueItems":true,"maxItems":5,"items":{"type":"string","enum":["en","es","fr","de","it","pt","nl","pl","ru","uk","tr","ar","fa","he","hi","ur","bn","ta","te","mr","gu","pa","kn","ml","zh","ja","ko","th","vi","id","ms","tl","sv","da","no","fi","cs","ro","hu","el","bg","hr","sk","sl","sr"]},"description":"With translation: 1 to 5 languages to translate into, each charged per minute."},"custom_fields":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/CustomField"},"description":"With custom_fields: 1 to 20 questions answered from the recording."}}},"CustomField":{"type":"object","required":["key","question"],"properties":{"key":{"type":"string","pattern":"^[a-z][a-z0-9_]{0,39}$","description":"Names the answer in the result."},"question":{"type":"string","maxLength":500},"type":{"type":"string","enum":["text","number","boolean","list","speaker","choice"],"default":"text","description":"boolean is yes or no; speaker answers with a speaker id; choice answers with one of options."},"options":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":50,"description":"With type choice."}}},"UpdateTranscriptRequest":{"type":"object","properties":{"file_name":{"type":"string","minLength":1,"maxLength":255},"speaker_names":{"type":"object","description":"Names keyed by speaker id. An empty string removes a name.","additionalProperties":{"type":"string","maxLength":60}}}},"Transcript":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"transcript"},"model":{"type":"string"},"status":{"type":"string","enum":["queued","processing","completed","failed","canceled"]},"file_name":{"type":"string"},"speaker_names":{"type":"object","additionalProperties":{"type":"string"}},"config":{"$ref":"#/components/schemas/RunConfig"},"duration_ms":{"type":"integer"},"error":{"type":["string","null"],"description":"Why it failed or was canceled."},"cost":{"type":"object","properties":{"currency":{"type":"string","const":"usd"},"estimated_micro_usd":{"type":"integer","description":"Held from your balance when the transcript is created."},"charged_micro_usd":{"type":["integer","null"],"description":"Set when it completes. Failed and canceled transcripts are not charged."}}},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}}},"TranscriptResult":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"transcript.result"},"model":{"type":"string"},"duration_ms":{"type":"integer"},"language":{"type":["string","null"],"description":"The main language (ISO 639-1)."},"speakers":{"type":"array","items":{"$ref":"#/components/schemas/Speaker"}},"turns":{"type":"array","items":{"$ref":"#/components/schemas/Turn"}},"overlaps":{"type":"array","items":{"$ref":"#/components/schemas/Overlap"}},"activity":{"type":"array","description":"When each speaker is audible, including short sounds that carry no words.","items":{"$ref":"#/components/schemas/Activity"}},"analytics":{"type":"object","description":"Conversation analytics computed from the timing, included with every result at no charge.","properties":{"speech_ms":{"type":"integer"},"silence_ms":{"type":"integer","description":"Total of pauses of 2 seconds or more."},"silences":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer","description":"Start, in milliseconds from the beginning of the recording."},"end_ms":{"type":"integer","description":"End, in milliseconds from the beginning of the recording."}}}},"overlap_ms":{"type":"integer"},"switches_per_minute":{"type":"number","description":"Speaker changes per minute of speech."},"median_response_ms":{"type":["integer","null"],"description":"Median gap before a different speaker replies; negative when they overlap."},"speakers":{"type":"array","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"talk_ms":{"type":"integer"},"talk_share":{"type":"number"},"turns":{"type":"integer"},"words":{"type":"integer"},"words_per_minute":{"type":["integer","null"],"description":"Null for languages written without spaces."},"longest_turn_ms":{"type":"integer"},"longest_turn_start_ms":{"type":"integer"},"interruptions":{"type":"integer","description":"Times this speaker started while another was mid-sentence."},"questions":{"type":"integer"}}}}}},"addons":{"type":"object","description":"Output of the add-ons in config.addons; only those appear. Generated add-ons have a status: pending until the transcript.addons.completed webhook, then ready, or failed with their price refunded. With redact_pii the result is served only once names and other details have been looked for, and its text and words are redacted; smart_format makes them punctuated and readable. Speakers in generated text appear as {{speaker_1}}: replace them with speaker_names.","properties":{"redact_pii":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"redactions":{"type":"integer"},"types":{"type":"object","additionalProperties":{"type":"integer"},"description":"Redactions by type: person_name, phone_number, email, address, date_of_birth, government_id, credit_card, bank_account, account_number, medical, ip_address, url, username, other."},"audio":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"type":{"type":"string"}}},"description":"Where each redacted value was said, to bleep the audio."}}},"smart_format":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."}}},"subtitles":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"ready once the text is punctuated; until then the cues use the words as heard."},"cues":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"lines":{"type":"array","minItems":1,"maxItems":2,"description":"One or two lines. dual lines are two people talking at once: show each with a leading dash. label: name the speaker before this line.","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"text":{"type":"string"},"label":{"type":"boolean"},"dual":{"type":"boolean"}}}}}}},"report":{"type":"object","description":"How the cues meet the Netflix timed text rules: counts of cues that could not, such as cues_over_reading_speed in fast crosstalk.","additionalProperties":{"type":["integer","number","string"]}}}},"insights":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"summary":{"type":"string","description":"One paragraph."},"chapters":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"title":{"type":"string"},"summary":{"type":"string"}}}},"key_points":{"type":"array","items":{"type":"object","properties":{"at_ms":{"type":"integer"},"text":{"type":"string"}}}},"action_items":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["action","decision","question"]},"at_ms":{"type":"integer"},"speaker_id":{"type":["string","null"],"description":"Who owns it, when someone does."},"task":{"type":"string"},"due":{"type":["string","null"]}}}},"highlights":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"title":{"type":"string"},"why":{"type":"string"}}}}}},"identify_speakers":{"type":"object","description":"Names and roles the conversation makes clear, with the words that show it.","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"names":{"type":"array","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":["string","null"]},"at_ms":{"type":"integer"},"evidence":{"type":"string"}}}}}},"sentiment":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"overall":{"type":"string","enum":["positive","neutral","negative","mixed"]},"speakers":{"type":"array","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"tone":{"type":"string","enum":["positive","neutral","negative","mixed"]}}}},"moments":{"type":"array","items":{"type":"object","properties":{"at_ms":{"type":"integer"},"tone":{"type":"string","enum":["positive","neutral","negative","mixed"]},"note":{"type":"string"}}}}}},"topics":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"topics":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"relevance":{"type":"number"}}}},"entities":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"type":{"type":"string","enum":["person","organization","location","product","event","date","money","other"]},"mentions":{"type":"array","items":{"type":"object","properties":{"at_ms":{"type":"integer"},"speaker_id":{"type":"string"}}}}}}}}},"keywords":{"type":"object","properties":{"terms":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string"},"count":{"type":"integer"},"mentions":{"type":"array","items":{"type":"object","properties":{"at_ms":{"type":"integer"},"speaker_id":{"type":"string"},"turn_id":{"type":"string"}}},"description":"Where it was said, in time order (at most 100)."}}}}}},"custom_fields":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"answers":{"type":"object","additionalProperties":true,"description":"Each question's key with its answer in the type asked for, or null when the recording doesn't say."}}},"translation":{"type":"object","properties":{"languages":{"type":"object","description":"By language code.","additionalProperties":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","failed"],"description":"pending while it is generated; failed if it couldn't be, and its price was refunded."},"lines":{"type":"array","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"text":{"type":"string"},"translated":{"type":"boolean","description":"false: kept in the original language."},"turn_ids":{"type":"array","items":{"type":"string"}}}}},"subtitles":{"type":"object","properties":{"cues":{"type":"array","items":{"type":"object","properties":{"start_ms":{"type":"integer"},"end_ms":{"type":"integer"},"lines":{"type":"array","minItems":1,"maxItems":2,"description":"One or two lines. dual lines are two people talking at once: show each with a leading dash. label: name the speaker before this line.","items":{"type":"object","properties":{"speaker_id":{"type":"string"},"text":{"type":"string"},"label":{"type":"boolean"},"dual":{"type":"boolean"}}}}}}},"report":{"type":"object","description":"How the cues meet the Netflix timed text rules: counts of cues that could not, such as cues_over_reading_speed in fast crosstalk.","additionalProperties":{"type":["integer","number","string"]}}}}}}}}}}}}},"Speaker":{"type":"object","description":"Speaker ids are stable within one transcript.","properties":{"id":{"type":"string"},"speaking_ms":{"type":"integer"}}},"Turn":{"type":"object","description":"One speaker talking without a break.","properties":{"id":{"type":"string"},"speaker_id":{"type":"string"},"start_ms":{"type":"integer","description":"Start, in milliseconds from the beginning of the recording."},"end_ms":{"type":"integer","description":"End, in milliseconds from the beginning of the recording."},"text":{"type":"string"},"words":{"type":"array","items":{"$ref":"#/components/schemas/Word"}}}},"Word":{"type":"object","properties":{"text":{"type":"string"},"start_ms":{"type":"integer","description":"Start, in milliseconds from the beginning of the recording."},"end_ms":{"type":"integer","description":"End, in milliseconds from the beginning of the recording."}}},"Overlap":{"type":"object","description":"Two or more speakers talking at once.","properties":{"id":{"type":"string"},"start_ms":{"type":"integer","description":"Start, in milliseconds from the beginning of the recording."},"end_ms":{"type":"integer","description":"End, in milliseconds from the beginning of the recording."},"turn_ids":{"type":"array","items":{"type":"string"}}}},"Activity":{"type":"object","properties":{"speaker_id":{"type":"string"},"start_ms":{"type":"integer","description":"Start, in milliseconds from the beginning of the recording."},"end_ms":{"type":"integer","description":"End, in milliseconds from the beginning of the recording."}}}}},"webhooks":{"transcriptEvent":{"post":{"summary":"Transcript status changed","description":"Sent when a transcript is queued, starts processing, or finishes, and when its generated add-ons (insights, speaker names, sentiment) are ready or could not be generated. Verify the Maybloc-Signature header: sha256= followed by the hex HMAC-SHA256 of {timestamp}.{raw body} with your endpoint secret.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Event id."},"type":{"type":"string","enum":["transcript.queued","transcript.processing","transcript.completed","transcript.failed","transcript.canceled","transcript.addons.completed","transcript.addons.failed"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"object":{"type":"string","const":"transcript"},"model":{"type":"string"},"status":{"type":"string"},"error":{"type":"string"}}}}}}}},"responses":{"200":{"description":"Return any 2xx to acknowledge."}}}}}}