{"openapi":"3.0.0","paths":{"/v1/calls":{"post":{"description":"Uploading a call to Modjo takes 2 steps, with two possible use cases:\n\n  1. **Use Case 1: Providing a Recording URL**\n     - Send a POST request to this endpoint with the metadata you want to attach to the call in Modjo, including the recording URL.\n     - You will receive an acknowledgement response with <code>{success: true}</code>.\n     - Modjo will download the recording from the provided URL within 30 minutes, typically within 5 minutes.\n\n  2. **Use Case 2: Receiving a Signed URL for Upload**\n     - Send a POST request to this endpoint with the metadata you want to attach to the call in Modjo.\n     - You will receive a signed URL to upload the recording file.\n     - Use this URL to upload your recording file with a PUT request.\n\n  In both use cases, the metadata about the call you sent in the first request will be automatically attached to the recording file in Modjo.\n  ","operationId":"upload-call","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCallUploadDto"}}}},"responses":{"200":{"description":"Your request has been accepted. Please refer to the description of each possible response to understand the next steps","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ApiCallUploadDtoResponse","description":"You should now use the URL returned in the response to upload the recording file assiocated to the call to Modjo. The metadata about the call that you sent in the request body will be attached to the recording you will upload using the signed URL."},{"$ref":"#/components/schemas/ApiCallUploadAcknowledgementResponse","description":"Modjo will download the recording within 30 minutes, typically within 5 minutes. The metadata about the call you sent in the request body will be attached to the recording in Modjo."}]}}}},"400":{"description":"The request body you sent was not valid. Look in the response body for hints about what is incorrect."},"401":{"description":"API key is missing or invalid."}},"security":[{"apiKey":[]}],"summary":"Upload a call to Modjo.","tags":["calls"]}},"/v1/calls/exports":{"post":{"description":"This endpoint allows users to list their calls and load related data such as transcripts and summaries. Users can apply filters to tailor the call list according to their requirements and selectively load additional related data such as transcripts, summaries, contacts, users, tags, etc. <strong>Currently in beta: Some changes can be made to the model without upstream communication.</strong>","operationId":"export-calls","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiV1CallExportDto"}}}},"responses":{"201":{"description":"The request has been successfully processed and the response includes a paginated result. Each entry in the result set corresponds to the specified filters and relations for the call export. The pagination details and the actual call data are included in the response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiV1CallExportPaginationResult"}}}},"400":{"description":"The request body is invalid. Refer to the response body for details on the error."},"401":{"description":"The API key provided is either missing or invalid."}},"security":[{"apiKey":[]}],"summary":"BETA - Export Call Data from Modjo.","tags":["calls"]}},"/v1/teams":{"get":{"description":"Retrieve modjo teams paginated.","operationId":"get-teams","parameters":[{"name":"page","required":true,"in":"query","description":"The page number to retrieve. Starts at 1.","schema":{"minimum":1,"type":"number"}},{"name":"perPage","required":true,"in":"query","description":"The number of items per page.","schema":{"maximum":100,"type":"number"}}],"responses":{"400":{"description":"The request query you sent was not valid. Look in the response body for hints about what is incorrect."},"401":{"description":"API key is missing or invalid."}},"security":[{"apiKey":[]}],"summary":"Get Modjo teams.","tags":["teams"]}},"/v1/users":{"get":{"description":"Retrieve modjo users paginated.","operationId":"get-users","parameters":[{"name":"page","required":true,"in":"query","description":"The page number to retrieve. Starts at 1.","schema":{"minimum":1,"type":"number"}},{"name":"perPage","required":true,"in":"query","description":"The number of items per page.","schema":{"maximum":100,"type":"number"}}],"responses":{"200":{"description":"The request has been successfully processed and the response includes a paginated result. Each entry in the result set corresponds to a user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiV1PublicGetUserPaginationResult"}}}},"400":{"description":"The request query you sent was not valid. Look in the response body for hints about what is incorrect."},"401":{"description":"API key is missing or invalid."}},"security":[{"apiKey":[]}],"summary":"Get Modjo users.","tags":["users"]},"delete":{"description":"Delete Modjo users from their ids.","operationId":"delete-users","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiV1PublicDeleteUsersDto"}}}},"responses":{"400":{"description":"The request body you sent was not valid. Look in the response body for hints about what is incorrect."},"401":{"description":"API key is missing or invalid."}},"security":[{"apiKey":[]}],"summary":"Delete Modjo users.","tags":["users"]}},"/v1/users/bulk":{"post":{"description":"Create a list of Modjo users from a list of email addresses. Additional properties can be defined for each user according to their information and usage.<br/>\n    <u>Some points of attention:</u>\n    <ul>\n    <li>All team ids specified must exist on Modjo.</li>\n    <li>All licenses specified must be available on Modjo.</li>\n    <li>A user cannot be updated through this endpoint</li>\n    </ul>","operationId":"v1-post-bulk-users","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBulkUsersDto"}}}},"responses":{"400":{"description":"The request query you sent was not valid. Look in the response body for hints about what is incorrect."},"401":{"description":"API key is missing or invalid."}},"security":[{"apiKey":[]}],"summary":"Create Modjo users","tags":["users"]}}},"info":{"title":"Modjo API V1","description":"\n<div style=\"border: 2px solid #b91c1c; border-left: 8px solid #b91c1c; background-color: #fee2e2; color: #7f1d1d; padding: 20px 24px; border-radius: 8px; margin-bottom: 16px; font-size: 16px; line-height: 1.5;\">\n  <div style=\"font-size: 20px; font-weight: 800; letter-spacing: 0.5px; margin-bottom: 8px;\">⚠️ Modjo API V1 is deprecated</div>\n  <div>\n    We recommend migrating to the latest version. Check out the\n    <a href=\"https://api.modjo.ai/v2/docs\" style=\"color: #b91c1c; font-weight: 800; text-decoration: underline;\">Modjo API V2 documentation →</a>\n  </div>\n</div>\n","version":"1.0","contact":{},"x-logo":{"url":"https://app.modjo.ai/plain-modjo-logo.png","backgroundColor":"#FFF","altText":"MODJO Logo"}},"tags":[{"name":"Authentication","description":"Modjo API authentication is based on an API key that must be included in the request headers.\n\nTo authenticate, add your API key to the `X-API-KEY` header as follows:\n\n```\nX-API-KEY: YOUR_API_KEY\n```\n\n### How to Retrieve Your API Key\n\nBefore generating a new API key, you must have **Administrator** or **Manager** permissions.\n\nFollow these steps to create your API key:\n\n1. **[Log in to Modjo](https://app.modjo.ai)**\n2. **[Go to Settings](https://app.modjo.ai/settings/?utm_source=api-doc)**\n3. **[Access the Integrations section](https://app.modjo.ai/settings/integrations?utm_source=api-doc)**\n4. **[Find the Public API card](https://app.modjo.ai/settings/integrations/modjo_api_key?utm_source=api-doc)**\n5. Create a new API key.\n\nMake sure to keep your API key **secure** and do not share it with unauthorized parties."},{"name":"Webhook","description":"\nWebhooks allow you to receive real-time notifications when specific events occur in Modjo.\nInstead of polling the API for changes, you can configure webhooks to automatically receive relevant data when an event is triggered.\n\n### How to Configure Webhooks\nBefore setting up a webhook, you must have **Administrator** or **Manager** permissions.\n\nFollow these steps to create and manage your webhooks:\n1. **[Log in to Modjo](https://app.modjo.ai)**\n2. **[Go to Settings](https://app.modjo.ai/settings/?utm_source=api-doc)**\n3. **[Access the Integrations section](https://app.modjo.ai/settings/integrations?utm_source=api-doc)**\n4. **[Find the Webhook card](https://app.modjo.ai/settings/integrations/modjo_webhook?utm_source=api-doc)**\n5. **Create a new webhook** by specifying the target URL that will receive event notifications.\n\nOnce your webhook is created, **you will receive a security token**.\nThis token is unique and must be used to verify the authenticity of incoming webhook requests.\n\n---\n\n### Default Webhook Body\nEach webhook request sent by Modjo contains a default structure, which includes metadata about the event.\nOnly the `payload` field is **cryptographically signed**.\n\n**Example Webhook Request Body:**\n```json\n{\n  \"timestamp\": \"2025-01-27T14:30:00.000Z\",\n  \"payloadSignature\": \"a1b2c3d4e5...\",\n  \"webhookUuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"webhookUrl\": \"https://your-webhook-url.com/receive\",\n  \"tenantName\": \"customer_123\",\n  \"eventName\": \"call_event\",\n  \"payload\": { \"foo\": \"bar\" }\n}\n```\n\n---\n### How to Verify a Webhook Request\nTo ensure that webhook requests are coming from Modjo and have not been tampered with, you should verify the **HMAC-SHA256** signature included in the `x-modjo-payload-signature` header.\n\n#### **Signature Generation Process**\nWhen Modjo sends a webhook request, it generates a signature using the following steps:\n1. **Concatenate the request components**:\n   - The **timestamp** from the `x-modjo-timestamp` header and also included in the request body.\n   - The **JSON-encoded payload** (contained in the `\"payload\"` field of the request body).\n   - The **secret token** assigned to your webhook (provided when you created it).\n\n   This results in the following string:\n   ```\n   SIGNED_DATA = TIMESTAMP + JSON.stringify(PAYLOAD) + SECRET_TOKEN\n   ```\n\n2. **Hash the concatenated string using SHA-256**:\n   - This produces a **hex-encoded hash**, which is included in the `x-modjo-payload-signature` header as well as in the request body (`\"payloadSignature\"` field).\n\n---\n\n#### **Where to Find the Signature and Timestamp**\nEach webhook request includes both the **timestamp** and **signature** in **two places**:\n- **Headers**:\n  - `x-modjo-timestamp` → Timestamp of when the request was sent.\n  - `x-modjo-payload-signature` → The cryptographic signature of the payload.\n\n- **Request Body**:\n  - `\"timestamp\"` → The same timestamp as in the header.\n  - `\"payloadSignature\"` → The same signature as in the header.\n\nSince only the `\"payload\"` field is signed, you can **recompute the signature using only the payload from the body, along with the timestamp and your secret token**.\n\n---\n\n#### **Verifying the Webhook Request**\nTo verify the authenticity of an incoming webhook request, follow these steps:\n\n1. **Retrieve the necessary values** from either the headers or the body:\n   - Use `x-modjo-payload-signature` from the header **or** `\"payloadSignature\"` from the body.\n   - Use `x-modjo-timestamp` from the header **or** `\"timestamp\"` from the body.\n   - Extract the `\"payload\"` field from the request body.\n   - Use your **secret token** (provided when you created the webhook).\n\n2. **Recompute the signature** using the same method Modjo uses:\n   - Concatenate the **timestamp**, **payload**, and **secret token**.\n   - Hash the result using **SHA-256**.\n   - Compare your computed hash with the one received in `x-modjo-payload-signature` or `\"payloadSignature\"`.\n\n3. **If the computed signature matches the received signature, the request is valid**.\n   Otherwise, the request should be rejected.\n\n---\n\n#### **Example: Signature Verification Code (Node.js)**\n```typescript\nimport { createHash } from 'crypto';\n\nfunction verifyWebhookSignature(secretToken, timestamp, payload, receivedSignature) {\n    // Step 1: Concatenate the timestamp, payload, and secret token\n    const data = timestamp + JSON.stringify(payload) + secretToken;\n\n    // Step 2: Compute the SHA-256 hash of the concatenated string\n    const expectedSignature = createHash('sha256').update(data).digest('hex');\n\n    // Step 3: Compare the computed signature with the received one\n    return expectedSignature === receivedSignature;\n}\n```\n"}],"servers":[],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-KEY","description":"To retrieve your API key please refer to the [Authentication](#tag/Authentication) section of this documentation."}},"schemas":{"ApiCallUploadExternalTagDto":{"type":"object","properties":{"name":{"type":"string","minLength":3,"maxLength":128,"description":"The label you'll see displayed within the app, also serving as a searchable keyword."},"providerTagId":{"type":"string","minLength":1,"description":"A unique identifier for your call tags. Use this ID for the ability to retroactively update the tag name or color across all imported calls.\n<ul>\n    <li>If you don't need this level of control, simply input the tag name.</li>\n    <li><i>Caution:</i> Generating a new unique ID for each call will result in the creation of a new tag.</li>\n</ul>"},"color":{"type":"string","default":"4CD598","description":"Tag Color: Specifies the color of the tag in the web application. Enter a 3 or 6 character hexadecimal color code, but omit the '#' symbol."}},"required":["name","providerTagId"]},"ApiCallUploadInternalTagDto":{"type":"object","properties":{"modjoTagId":{"type":"number","minimum":1,"description":"Internal Modjo tag identifier"}},"required":["modjoTagId"]},"ApiCallUploadCrmContactDto":{"type":"object","properties":{"crmId":{"type":"string","description":"Unique identifier for the CRM contact."},"crm":{"type":"string","enum":["hubspot","pipedrive","salesforce","zoho","sellsy","microsoft_dynamics"],"description":"The CRM provider (e.g., Salesforce, Hubspot)."},"email":{"type":"string","description":"The contact's email address."},"phoneNumber":{"type":"string","description":"The contact's phone number."},"name":{"type":"string","description":"The contact's full name."}},"required":["crmId","crm"]},"ApiCallUploadDtoResponse":{"type":"object","properties":{"uploadTo":{"type":"string","description":"Signed url to upload your call to. This URL is for single-use only, and remains valid for only 20 minutes.","readOnly":true}},"required":["uploadTo"]},"ApiCallUploadAcknowledgementResponse":{"type":"object","properties":{"success":{"type":"boolean","description":"Acknowledgement of your call upload request. If you provided a URL, we will download the recording within 30 minutes. Typically, this process is completed within 5 minutes.","readOnly":true,"default":true}},"required":["success"]},"ApiCallUploadCrmAccountDto":{"type":"object","properties":{"crmId":{"type":"string","description":"Unique identifier for the CRM account."},"crm":{"type":"string","enum":["hubspot","pipedrive","salesforce","zoho","sellsy","microsoft_dynamics"],"description":"The CRM provider (e.g., Salesforce, Hubspot)."}},"required":["crmId","crm"]},"ApiCallUploadCrmDealDto":{"type":"object","properties":{"crmId":{"type":"string","description":"Unique identifier for the CRM Deal."},"crm":{"type":"string","enum":["hubspot","pipedrive","salesforce","zoho","sellsy","microsoft_dynamics"],"description":"The CRM provider (e.g., Salesforce, Hubspot)."}},"required":["crmId","crm"]},"ApiCallUploadDto":{"type":"object","properties":{"recordingUrl":{"type":"string","description":"URL containing your recording:\n  <ul>\n    <li>Providing a URL here will change the response behavior. Instead of sending a response body with a special URL for upload, we will acknowledge your request with <code>{success: true}</code>.</li>\n    <li>If you wish to provide a pre-signed URL, you can do so, but please ensure that Modjo will be able to access and download the recording. <strong>Warning:</strong> The download process can take up to 30 minutes, although it is typically completed within 5 minutes.</li>\n  </ul>"},"contacts":{"type":"array","description":"List of contact identifiers you want to map the call to. Identifiers can be either integer, string, or an object representing a CRM contact.","minItems":1,"example":[1,"email@external.com","+33606060606",{"crm":"salesforce","crmId":"0035g00000KZcZ4AAL"}],"items":{"anyOf":[{"type":"integer","description":"An integer will be interpreted as an existing Modjo contactId."},{"type":"string","description":"A string will be interpreted as a contact email or phone number."},{"$ref":"#/components/schemas/ApiCallUploadCrmContactDto","description":"Schema for uploading CRM contact data."}]}},"users":{"type":"array","description":"List of users identifiers you want to map the call to. Identifiers can be of type integer or string.\n  Important: until a next release, a call can only be associated to one user. Thus, this array must only one value for now.","minItems":1,"items":{"anyOf":[{"type":"integer","description":"A number will be interpreted as a Modjo existing user Id."},{"type":"string","description":"A string will be interpreted as a user email"}]},"examples":[[2],["user@internal.com"]]},"date":{"format":"date-time","type":"string","description":"ISO string"},"provider":{"type":"string","description":"Call provider name displayed on Modjo. Default value: manual.\nIf you are a Call company & you want your company name being displayed on Modjo, please contact us.","enum":["manual","alcatel","demodesk","modjo_physical_recorder","mobile_field_recorder","onoff","sipsim","modjo_batch_imports","webapp_manual_import"]},"name":{"type":"string","description":"The name you want to give to this call on Modjo"},"fileExtension":{"type":"string","enum":["wav","mp3","mpeg","m4a","mp4","webm"],"description":"File extension of the recording file you will associate to this call. Supported values are listed below."},"direction":{"type":"string","enum":["inbound","outbound"],"default":"inbound","description":"Call direction, whether it's an inbound or outbound call. Leave blank if not relevant (for a meeting for instance)."},"duration":{"type":"number","description":"Duration in seconds of the call.\n<ul>\n  <li>\n    If the duration is specified (not 0), it must be greater than the minimum duration defined for the tenant.<br />\n    If not modified, the minimum duration is set to 120 seconds\n  </li>\n  <li><i>Note:</i> The actual audio file length will overwrite this value if they don't match.</li>\n</ul>","minimum":0,"default":0},"tags":{"type":"array","description":"Call Tags: An array of tags associated with the call, conforming to the ApiCallUploadTagDto structure.","minItems":1,"nullable":true,"items":{"anyOf":[{"$ref":"#/components/schemas/ApiCallUploadExternalTagDto","description":"<ul>\n  <li>Each tag must be an object that includes a 'name', 'providerTagId', and an optional 'color'.</li>\n  <li>The 'name' should be a string between 3 and 128 characters in length.</li>\n  <li>The 'providerTagId' is a unique identifier for the tag and should be at least 1 character long.</li>\n  <li>The 'color' should be a 3 or 6 character hexadecimal code, without the '#' symbol.</li>\n  <li><i>Note:</i> This field is optional. If left blank, it defaults to an empty array.</li>\n</ul>"},{"$ref":"#/components/schemas/ApiCallUploadInternalTagDto","description":"Internal Modjo tag identifier"}]}},"account":{"description":"CRM Account Identifier: The unique identifier of the account in your CRM system.\n\n  <ul>\n    <li><strong>Direct CRM Integration:</strong> This value must be a valid account identifier in your CRM. When provided, Modjo will use this identifier directly instead of performing an automatic search.</li>\n    <li><strong>Priority Over Modjo’s Search:</strong> If this field is set, Modjo will not attempt to find a better matching account. Ensure the provided ID is accurate and corresponds to the intended CRM account.</li>\n    <li><strong>Data Retrieval:</strong> Modjo will fetch account details directly from the CRM using this identifier.</li>\n  </ul>","example":{"crm":"salesforce","crmId":"0015g00002KZcZ5AAL"},"allOf":[{"$ref":"#/components/schemas/ApiCallUploadCrmAccountDto"}]},"deal":{"description":"CRM Deal Identifier: The unique identifier of the deal (opportunity) in your CRM system.\n\n  <ul>\n    <li><strong>Direct CRM Integration:</strong> This value must be a valid deal identifier in your CRM. If provided, Modjo will use this identifier directly instead of attempting to find the associated deal.</li>\n    <li><strong>Priority Over Modjo’s Search:</strong> If this field is set, Modjo will not try to identify a better matching deal. Make sure the provided deal ID is correct and corresponds to the intended CRM opportunity.</li>\n    <li><strong>Data Retrieval:</strong> Modjo will fetch deal details directly from the CRM using this identifier.</li>\n  </ul>","example":{"crm":"hubspot","crmId":"123456789"},"allOf":[{"$ref":"#/components/schemas/ApiCallUploadCrmDealDto"}]}},"required":["contacts","users","date","fileExtension","tags"]},"ApiV1CallExportSpeakerUserResult":{"type":"object","properties":{"userId":{"type":"number","description":"Unique identifier of the user."},"userCrmId":{"type":"object","description":"CRM identifier of the user.","nullable":true},"email":{"type":"string","description":"Email of the user."},"name":{"type":"string","description":"Name of the user."},"speakerId":{"type":"number","description":"Unique identifier of the speaker. "},"type":{"type":"string","description":"Type of the speaker (user)","default":"user"}},"required":["userId","email","name","speakerId","type"]},"ApiV1CallExportSpeakerContactResult":{"type":"object","properties":{"contactId":{"type":"number","description":"Unique identifier of the contact."},"name":{"type":"string","description":"Name of the contact."},"phoneNumber":{"type":"object","description":"Phone number of the contact."},"email":{"type":"object","description":"Email of the contact."},"contactCrmId":{"type":"object","description":"CRM identifier of the contact."},"speakerId":{"type":"number","description":"Unique identifier of the speaker. "},"type":{"type":"string","description":"Type of the speaker (contact)","default":"contact"}},"required":["contactId","name","speakerId","type"]},"ApiV1CallPaginationDto":{"type":"object","properties":{"page":{"type":"number","description":"The page number to retrieve. Starts at 1.","minimum":1},"perPage":{"type":"number","description":"The number of calls per page.","maximum":50}},"required":["page","perPage"]},"RangeDateDTO":{"type":"object","properties":{"start":{"format":"date-time","type":"string","description":"Start date in ISO format","examples":["YYYY-MM-DDTHH:mm:ss.sssZ","YYYY-MM-DD"]},"end":{"format":"date-time","type":"string","description":"End date in ISO format, which must be later than the start date","examples":["YYYY-MM-DDTHH:mm:ss.sssZ","YYYY-MM-DD"]}},"required":["start","end"]},"ApiV1CallExportFiltersDTO":{"type":"object","properties":{"callStartDateRange":{"description":"Specifies a date range (start and end) for filtering calls, determining which calls <b>start date</b> fall within this specified timeframe.","allOf":[{"$ref":"#/components/schemas/RangeDateDTO"}]},"minimumCallDuration":{"type":"number","description":"Minimum duration (in seconds) for calls to be included in the results.Calls with a duration greater than or equal to this value will be considered.This parameter is optional."},"callTitle":{"type":"string","description":"The title of the call, used for search queries. Providing a call title enables filtering the list of calls by their respective titles. This field is optional and requires a minimum length of 3 characters if specified.","minLength":3},"callIds":{"description":"Specifies a list of call IDs for filtering. Only calls with IDs in this list will be included in the results. This parameter is optional.","minItems":1,"items":{"type":"array"},"type":"array"},"deletedRecording":{"type":"boolean","description":"Retrieve all calls where the recording has been deleted.","default":false}}},"ApiV1CallExportRelationsDTO":{"type":"object","properties":{"recording":{"type":"boolean","description":"Load recordings. Optional, defaults to false.","default":false},"contacts":{"type":"boolean","description":"Load contacts. Optional, defaults to false.","default":false},"account":{"type":"boolean","description":"Load account related to the call. Optional, defaults to false.","default":false},"deal":{"type":"boolean","description":"Load deal related to the call. Optional, defaults to false.","default":false},"users":{"type":"boolean","description":"Load users. Optional, defaults to false.","default":false},"libraries":{"type":"boolean","description":"Load libraries. Optional, defaults to false.","default":false},"tags":{"type":"boolean","description":"Load tags. Optional, defaults to false.","default":false},"transcript":{"type":"boolean","description":"Load transcript. Use this in order to perform a mass extract of calls with their transcript. Optional, defaults to false.","default":false},"topics":{"type":"boolean","description":"Load topics. Optional, defaults to false.","default":false},"speakers":{"type":"boolean","description":"<p>Load speaker data: This option represents individuals who have spoken during a call. Speakers are typically a subset of users and contacts. However, there are two key scenarios:</p>\n        <ul>\n          <li>\n            <em>Less Speakers Detected:</em> The actual number of speakers may be less than the combined total of users and contacts, as our AI selectively identifies speakers based on the conversation's context.\n          </li>\n          <li>\n            <em>Additional Speakers Identified:</em> In cases where the AI identifies more speakers than the known users and contacts, \"unknown speaker\" contacts are created to account for these additional voices. This ensures that the total number of speakers does not exceed the sum of users, contacts, and these additional \"unknown speaker\" entities.\n          </li>\n        </ul>","default":false},"aiSummary":{"type":"boolean","description":"Load AI summary. Use this if you want to export call summaries that are generated by Modjo's AI alongside with the calls. Optional, defaults to false.\nDeprecated use \"highlights\" field instead","default":false,"deprecated":true},"summary":{"type":"boolean","description":"Load AI summary. Use this if you want to export call summaries that are generated by Modjo's AI alongside with the calls. Optional, defaults to false.","default":false},"highlights":{"type":"boolean","description":"Load Highlights. Use this if you want to export call highlights that are generated by Modjo's AI alongside with the calls. Optional, defaults to false.","default":false},"reviews":{"type":"boolean","description":"Load call reviews. Optional, defaults to false.","default":false},"aiScoringResults":{"type":"boolean","description":"Load AI scoring results. Optional, defaults to false.","default":false}}},"ApiV1CallExportDto":{"type":"object","properties":{"pagination":{"description":"Pagination","default":{"page":1,"perPage":10},"allOf":[{"$ref":"#/components/schemas/ApiV1CallPaginationDto"}]},"filters":{"description":"The filters to apply to the export","default":{},"example":{"callStartDateRange":{"start":"2024-01-01T00:00:00.000Z","end":"2026-07-03T00:00:00.000Z"},"minimumCallDuration":60},"allOf":[{"$ref":"#/components/schemas/ApiV1CallExportFiltersDTO"}]},"relations":{"description":"Defines a set of boolean flags to specify which related data should be included in the export. Each option is optional and defaults to false, allowing for flexible and selective data inclusion in the export.","default":{},"example":{"recording":true,"aiSummary":true,"transcript":true,"speakers":true},"allOf":[{"$ref":"#/components/schemas/ApiV1CallExportRelationsDTO"}]}}},"PaginationData":{"type":"object","properties":{"page":{"type":"number","description":"The page number to retrieve. Starts at 1.","minimum":1},"perPage":{"type":"number","description":"The number of items per page.","maximum":100},"nextPage":{"type":"number","description":"The page number of the next set of results, if available. Undefined if there is no subsequent page."},"totalValues":{"type":"number","description":"The total number of values available across all pages."},"lastPage":{"type":"number","description":"The page number of the last set of results, indicating the total number of pages available."}},"required":["page","perPage","totalValues","lastPage"]},"ApiV1CallExportPaginationResult":{"type":"object","properties":{"pagination":{"description":"Pagination data including the current, next, and last page information, along with the total number of items across all pages.","allOf":[{"$ref":"#/components/schemas/PaginationData"}]},"values":{"description":"Array of values for the current page. The type of values depends on the specific use case (e.g., calls, contacts).","type":"array","items":{"type":"array"}}},"required":["pagination","values"]},"ApiV1PublicGetUserDto":{"type":"object","properties":{"id":{"type":"number","description":"Id of the user"},"email":{"type":"string","description":"Email of the user"},"firstName":{"type":"string","description":"First name of the user"},"lastName":{"type":"string","description":"Last name of the user"},"hasLicense":{"type":"boolean","description":"true when the user has a license, false otherwise"},"role":{"type":"string","enum":["user","manager","admin"],"description":"Role of the user"},"teamIds":{"description":"An array of all teams the user is in. If you want more details about those teams, use the Get Modjo teams API.","type":"array","items":{"type":"array"}},"language":{"type":"string","description":"Considered language code of the user"}},"required":["id","email","hasLicense","role"]},"ApiV1PublicGetUserPaginationResult":{"type":"object","properties":{"pagination":{"description":"Pagination data including the current, next, and last page information, along with the total number of items across all pages.","allOf":[{"$ref":"#/components/schemas/PaginationData"}]},"values":{"description":"Array of users for the current page.","type":"array","items":{"$ref":"#/components/schemas/ApiV1PublicGetUserDto"}}},"required":["pagination","values"]},"ApiV1PublicDeleteUsersDto":{"type":"object","properties":{"userIds":{"description":"Ids for the users to delete","example":[1,2],"type":"array","items":{"type":"number"}}},"required":["userIds"]},"CreateBulkUserDto":{"type":"object","properties":{"email":{"type":"string","description":"Email of the user to create","example":"john.doe@modjo.ai"},"firstName":{"type":"string","description":"First name of the user to create, if none is specified, the user will have to define one during his onboarding procedure","example":"John"},"lastName":{"type":"string","description":"Last name of the user to create, if none is specified, the user will have to define one during his onboarding procedure","example":"Doe"},"hasLicense":{"type":"boolean","description":"Assign a recording license to the user (the tenant must have an available license)","default":false,"example":true},"role":{"type":"string","description":"The role of the user","default":"user","enum":["user","manager","admin"],"example":"user"},"teamIds":{"description":"The Modjo team ids of the user","default":[],"example":[1,2,3],"type":"array","items":{"type":"number"}},"language":{"type":"string","description":"Language used to send onboarding emails","default":"en-US","enum":["en-US","fr-FR"],"example":"fr-FR"},"sendOnboardingEmail":{"type":"boolean","description":"Send an onboarding email to the user","default":true,"example":true}},"required":["email"]},"CreateBulkUsersDto":{"type":"object","properties":{"users":{"description":"User list to create","type":"array","items":{"$ref":"#/components/schemas/CreateBulkUserDto"}}},"required":["users"]}}},"x-webhooks":{"call_summarized":{"post":{"tags":["Webhook"],"summary":"Call Summarized","operationId":"webhook_call_summarized","description":"Triggered when a call summary is generated.","parameters":[{"in":"header","name":"x-modjo-payload-signature","description":"HMAC-SHA256 signature of the payload for request verification."},{"in":"header","name":"x-modjo-timestamp","description":"Timestamp indicating when the request was sent (ISO 8601 format)."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the webhook was sent.","example":"2026-07-03T17:32:50.135Z"},"payloadSignature":{"type":"string","format":"hex","description":"HMAC-SHA256 signature used to verify the request authenticity.","example":"a1b2c3d4e5..."},"webhookUuid":{"type":"string","format":"uuid","description":"Unique identifier of the webhook.","example":"550e8400-e29b-41d4-a716-446655440000"},"webhookUrl":{"type":"string","format":"uri","description":"The URL where the webhook was sent.","example":"https://your-webhook-url.com/receive"},"tenantName":{"type":"string","description":"Unique identifier of the client.","example":"customer_123"},"eventName":{"type":"string","enum":["call_summarized"],"description":"The event type that triggered the webhook. This value is always set to the specific event name.","example":"call_summarized"},"payload":{"type":["object"],"properties":{"callId":{"type":["number"],"description":"Unique identifier of the call."},"title":{"type":["string"],"description":"Name of the call."},"startDate":{"type":["string","null"],"description":"Start date of the call in ISO 8601 format."},"duration":{"default":0,"type":["number"],"description":"Duration of the call in seconds."},"provider":{"type":["string"],"enum":["3cx","aircall","amazon-service-cloud-voice","apizee","cloudtalk","diabolocom-v2","five9","google","google_recording_bot","google_user_flow","hubspot","justcall","keyyo","manual","microsoft_recording_bot","microsoft","microsoft_user_flow","outreach","ringover","salesloft","talkdesk","vocalcom-v2","zoom","zoom_phone"],"description":"The telephony provider used for the call."},"language":{"type":["string","null"],"enum":["af-ZA","ar-AE","zh-CN","da-DK","nl-NL","en-US","fa-IR","fr-FR","de-DE","he-IL","hi-IN","id-ID","it-IT","ja-JP","ko-KR","ms-MY","pt-PT","ru-RU","es-ES","sv-SE","ta-IN","te-IN","th-TH","tl-TLG","tr-TR","fi-FI","ca-ES","pl-PL","ro-RO","hu-HU","el-GR","bg-BG","sl-SL","sr-RS","cs-CZ","lt-LT","hr-HR","cy-GB","nn-NO","gl-ES","ml-IN","si-LK","km-KH","sn-ZW","bs-BA","ur-IN","vi-VN","bn-BD","uk-UA","bo-CN","mi-NZ","sk-SK","lv-LV","az-AZ","kn-IN","et-EE","mk-MK","br-FR","eu-ES","is-IS","hy-AM","ne-NP","mn-MN","kk-KZ","sq-AL","sw-KE","mr-IN","pa-IN","yo-BJ","so-SO","oc-FR","ka-GE","be-BY","sd-PK","gu-IN","am-ET","lo-LA","uz-UZ","fo-FO","ps-PK","tk-TM","mt-MT","sa-IN","lb-LU","my-MM","mg-MG","as-IN","tt-RU","ln-AO","ha-GH","ba-RU"],"description":"Language of the call transcript. Can be null if language is unknown."},"callCrmId":{"type":["string","null"],"description":"CRM activity ID linked to the call."},"relations":{"type":["object"],"properties":{"activity":{"type":["object"],"properties":{"activityCrmId":{"type":["string","null"],"description":"Unique identifier of the CRM activity associated with the call. This ID allows for tracking and linking the activity within the CRM system. Refer to the `activityCrmType` description for more details on its classification."},"activityCrmType":{"type":["string","null"],"enum":["call","calendarEvent","email"],"description":"Type of CRM activity:\n\n- If the call is linked to a calendar event and it is found, the crmType will be **\"calendarEvent\"**.\n- Otherwise, it will be **\"call\"**.\n- For meeting providers such as Google, Microsoft, or Zoom, there is generally a calendar event.\n- For phone providers, the default type is \"call\"."},"crmDealId":{"type":["string","null"],"description":"CRM deal ID associated with the call activity. Can be null if not available."},"crmAccountId":{"type":["string","null"],"description":"CRM account ID associated with the call activity. Can be null if not available."}},"required":["activityCrmId","activityCrmType","crmDealId","crmAccountId"]},"summary":{"type":["object"],"properties":{"content":{"type":["string","null"],"description":"Summary content generated for the call."},"templateUuid":{"type":["string"],"format":"uuid","description":"UUID of the summary template used."},"summaryCrmId":{"type":["string","null"],"description":"CRM note ID where the summary was stored."}},"required":["content","templateUuid","summaryCrmId"]},"contacts":{"type":["array"],"items":{"type":["object"],"properties":{"contactId":{"type":["number"],"description":"Unique identifier of the contact."},"contactCrmId":{"type":["string","null"],"description":"CRM person ID linked to the contact. Can be null if not available."},"contactCrmType":{"default":"Contact","type":["string"],"description":"CRM entity type for the contact (e.g., \"Lead\" or \"Contact\")."},"contactEmail":{"type":["string","null"],"description":"Email address of the contact. Can be null if not available."},"contactPhoneNumber":{"type":["string","null"],"description":"Phone number of the contact. Can be null if not available."}},"required":["contactId","contactCrmId","contactEmail","contactPhoneNumber"]},"description":"List of contacts associated with the call."},"callUsers":{"type":["array"],"items":{"type":["object"],"properties":{"userId":{"type":["number"],"minimum":0,"description":"Internal unique identifier for the system user who participated in the call."},"userEmail":{"type":["string"],"format":"email","description":"Email address of the system user, used for identification and communication."}},"required":["userId","userEmail"]},"description":"Collection of system users who participated in or are associated with this call session."}},"required":["activity","summary","contacts","callUsers"]}},"required":["callId","title","startDate","provider","language","callCrmId","relations"],"description":"Triggered when a call summary is generated."}}}}}},"responses":{"200":{"description":"Successful operation"},"default":{"description":"Other response codes are ignored"}}}},"call_transcript_deleted":{"post":{"tags":["Webhook"],"summary":"Call Transcript Deleted","operationId":"webhook_call_transcript_deleted","description":"Triggered when a call transcript is deleted.","parameters":[{"in":"header","name":"x-modjo-payload-signature","description":"HMAC-SHA256 signature of the payload for request verification."},{"in":"header","name":"x-modjo-timestamp","description":"Timestamp indicating when the request was sent (ISO 8601 format)."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the webhook was sent.","example":"2026-07-03T17:32:50.135Z"},"payloadSignature":{"type":"string","format":"hex","description":"HMAC-SHA256 signature used to verify the request authenticity.","example":"a1b2c3d4e5..."},"webhookUuid":{"type":"string","format":"uuid","description":"Unique identifier of the webhook.","example":"550e8400-e29b-41d4-a716-446655440000"},"webhookUrl":{"type":"string","format":"uri","description":"The URL where the webhook was sent.","example":"https://your-webhook-url.com/receive"},"tenantName":{"type":"string","description":"Unique identifier of the client.","example":"customer_123"},"eventName":{"type":"string","enum":["call_transcript_deleted"],"description":"The event type that triggered the webhook. This value is always set to the specific event name.","example":"call_transcript_deleted"},"payload":{"type":["object"],"properties":{"callCrmId":{"type":["string","null"],"description":"CRM activity ID linked to the call."},"callId":{"type":["number"],"description":"Unique identifier of the call."},"duration":{"default":0,"type":["number"],"description":"Duration of the call in seconds."},"language":{"type":["string","null"],"description":"Language of the call transcript. Can be null if language is unknown."},"provider":{"type":["string"],"description":"The telephony provider used for the call."},"providerCallId":{"type":["string"],"description":"The call ID provided by the telephony provider."},"startDate":{"type":["string","null"],"description":"Start date of the call in ISO 8601 format."},"title":{"type":["string"],"description":"Name of the call."}},"required":["callCrmId","callId","language","provider","providerCallId","startDate","title"]}}}}}},"responses":{"200":{"description":"Successful operation"},"default":{"description":"Other response codes are ignored"}}}},"call_recording_deleted":{"post":{"tags":["Webhook"],"summary":"Call Recording Deleted","operationId":"webhook_call_recording_deleted","description":"Triggered when a call recording is deleted.","parameters":[{"in":"header","name":"x-modjo-payload-signature","description":"HMAC-SHA256 signature of the payload for request verification."},{"in":"header","name":"x-modjo-timestamp","description":"Timestamp indicating when the request was sent (ISO 8601 format)."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the webhook was sent.","example":"2026-07-03T17:32:50.135Z"},"payloadSignature":{"type":"string","format":"hex","description":"HMAC-SHA256 signature used to verify the request authenticity.","example":"a1b2c3d4e5..."},"webhookUuid":{"type":"string","format":"uuid","description":"Unique identifier of the webhook.","example":"550e8400-e29b-41d4-a716-446655440000"},"webhookUrl":{"type":"string","format":"uri","description":"The URL where the webhook was sent.","example":"https://your-webhook-url.com/receive"},"tenantName":{"type":"string","description":"Unique identifier of the client.","example":"customer_123"},"eventName":{"type":"string","enum":["call_recording_deleted"],"description":"The event type that triggered the webhook. This value is always set to the specific event name.","example":"call_recording_deleted"},"payload":{"type":["object"],"properties":{"callCrmId":{"type":["string","null"],"description":"CRM activity ID linked to the call."},"callId":{"type":["number"],"description":"Unique identifier of the call."},"duration":{"default":0,"type":["number"],"description":"Duration of the call in seconds."},"language":{"type":["string","null"],"description":"Language of the call transcript. Can be null if language is unknown."},"provider":{"type":["string"],"description":"The telephony provider used for the call."},"providerCallId":{"type":["string"],"description":"The call ID provided by the telephony provider."},"startDate":{"type":["string","null"],"description":"Start date of the call in ISO 8601 format."},"title":{"type":["string"],"description":"Name of the call."}},"required":["callCrmId","callId","language","provider","providerCallId","startDate","title"]}}}}}},"responses":{"200":{"description":"Successful operation"},"default":{"description":"Other response codes are ignored"}}}}}}