{"openapi":"3.1.0","info":{"title":"Callio tenant API","version":"1","description":"For a tenant's backend: orders, users and app tokens, recordings, reporting, privacy requests. Authenticate with an API key from the admin console."},"servers":[{"url":"https://193-203-163-231.sslip.io"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"cio_<id>_<secret>"}}},"paths":{"/api/v1/orders":{"post":{"tags":["Orders"],"summary":"Create an order","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"customer":{"type":"string"},"agent":{"type":"string"},"label":{"type":"string"}},"required":["id","customer"]}}}}},"get":{"tags":["Orders"],"summary":"List orders","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["active","closed"]}},{"name":"user","in":"query","schema":{"type":"string"}}]}},"/api/v1/orders/{id}":{"get":{"tags":["Orders"],"summary":"Read one order","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"tags":["Orders"],"summary":"Reassign, unassign, close or reopen an order","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent":{"type":["string","null"]},"customer":{"type":"string"},"status":{"type":"string","enum":["active","closed"]},"label":{"type":"string"}},"required":[]}}}}}},"/api/v1/users":{"get":{"tags":["Users"],"summary":"Search users","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"type","in":"query","schema":{"type":"string","enum":["customer","agent"]}},{"name":"status","in":"query","schema":{"type":"string","enum":["active","disabled"]}}]},"post":{"tags":["Users"],"summary":"Create a user (returns the extension; a random initialPassword once if none is given)","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"displayName":{"type":"string"},"userType":{"type":"string","enum":["customer","agent"]},"loginPassword":{"type":"string"}},"required":["username"]}}}}}},"/api/v1/users/{username}":{"get":{"tags":["Users"],"summary":"Read one user","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"tags":["Users"],"summary":"Update a user; changing the type or disabling ends their sessions","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"type":"string"},"userType":{"type":"string","enum":["customer","agent"]},"disabled":{"type":"boolean"}},"required":[]}}}}},"delete":{"tags":["Privacy"],"summary":"PDPL erasure","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}},"required":["reason"]}}}}}},"/api/v1/users/{username}/sign-out":{"post":{"tags":["Users"],"summary":"End every session the user has open","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/users/{username}/export":{"get":{"tags":["Privacy"],"summary":"PDPL access request: everything held about a user","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/tokens":{"post":{"tags":["Users"],"summary":"A short-lived app token for a user (60–3600 s, default 900)","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"ttlSec":{"type":"integer"}},"required":["username"]}}}}}},"/api/v1/recordings":{"get":{"tags":["Recordings"],"summary":"Search recordings","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"from","in":"query","schema":{"type":"string"},"description":"ISO date"},{"name":"to","in":"query","schema":{"type":"string"},"description":"ISO date"},{"name":"user","in":"query","schema":{"type":"string"},"description":"extension"},{"name":"callId","in":"query","schema":{"type":"string"}},{"name":"orderId","in":"query","schema":{"type":"string"}},{"name":"minDuration","in":"query","schema":{"type":"integer"},"description":"seconds"},{"name":"maxDuration","in":"query","schema":{"type":"integer"},"description":"seconds"}]}},"/api/v1/recordings/{rid}":{"get":{"tags":["Recordings"],"summary":"Recording metadata","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/recordings/{rid}/audio":{"get":{"tags":["Recordings"],"summary":"The audio (stereo Ogg/Opus, caller left); every download is in the access trail","responses":{"200":{"description":"audio/ogg"}},"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}},{"name":"reason","in":"query","schema":{"type":"string"},"required":true}]}},"/api/v1/recordings/{rid}/transcript":{"get":{"tags":["Recordings"],"summary":"The transcript (text, language, timed segments); every read is in the access trail","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string"}},{"name":"reason","in":"query","schema":{"type":"string"},"required":true}]}},"/api/v1/groups":{"post":{"tags":["Groups"],"summary":"Create a group chat (2–50 members)","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"members":{"type":"array","items":{"type":"string"}}},"required":["id","name","members"]}}}}},"get":{"tags":["Groups"],"summary":"List group chats","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}}}},"/api/v1/groups/{id}":{"get":{"tags":["Groups"],"summary":"One group chat with its members","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"tags":["Groups"],"summary":"Rename, add or remove members (new members see messages from when they join)","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"add":{"type":"array","items":{"type":"string"}},"remove":{"type":"array","items":{"type":"string"}}},"required":[]}}}}},"delete":{"tags":["Groups"],"summary":"Delete a group chat and its messages","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/events":{"get":{"tags":["Reporting"],"summary":"Event feed for BI, in order; pass the returned next as after","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"after","in":"query","schema":{"type":"integer"}},{"name":"limit","in":"query","schema":{"type":"integer"}},{"name":"types","in":"query","schema":{"type":"string"},"description":"prefixes, e.g. call.,chat."}]}},"/api/v1/cdr":{"get":{"tags":["Reporting"],"summary":"Call records: one row per call","responses":{"200":{"description":"OK"},"401":{"description":"missing or bad API key"}},"parameters":[{"name":"days","in":"query","schema":{"type":"integer"}},{"name":"type","in":"query","schema":{"type":"string","enum":["customer","agent"]}}]}}}}