Integrations·Updated Mar 7, 2026
Push API
Programmatically submit calls for analysis via API.
Overview
The Push API lets you programmatically submit calls for analysis. This is useful when:
You have recordings in your own systems
You're building custom integrations
You need to process calls from unsupported platforms
You want to automate bulk uploads
Authentication
API authentication requires a Push API key generated from Integrations > Push API.
Pass your key using any of these methods (use whichever your tool or platform supports):
X-API-Key header (preferred): X-API-Key: pk_your_key_here
Authorization header: Authorization: Bearer pk_your_key_here
Query parameter: append ?apiKey=pk_your_key_here to the endpoint URL
Request body field: include "apiKey": "pk_your_key_here" in your JSON payload
The query parameter and body field options are useful when your platform (e.g. HubSpot workflows) does not support custom HTTP headers.
Your team is inferred from the API key, so you do not need to pass a team ID in the body.
Keys are shown once when generated. Store them securely and rotate if exposed.
Submitting a Call
- Basic workflow:
- 1. Generate an API key from Integrations > Push API
- 2. Prepare your call recording and metadata
- 3. Make a POST request to /api/integrations/push-api/ingest
- 4. Include at least one of transcript or audioUrl
- 5. Add optional fields like repName, repEmail, callTitle, duration, callDate, metadata, and title-control flags
- 6. Receive call ID in response
- 7. Wait for analysis to complete in call history
Request Format
Required:
- transcript or audioUrl (at least one is required)
Optional (camelCase or snake_case supported):
- repName / rep_name
- repEmail / rep_email
- callTitle / call_title
- disableAiTitleGeneration / disable_ai_title_generation (boolean, default false)
- useAiCallTitle / use_ai_call_title (boolean alias; inverse of disableAiTitleGeneration)
- callDate / call_date (ISO date)
- audioUrl / audio_url
- duration (minutes, seconds, or ms; normalized automatically)
- metadata (flat key/value object)
Endpoint and Example
Endpoint: POST https://app.kendo.ai/api/integrations/push-api/ingest
Header auth example (X-API-Key or Authorization: Bearer):
- Content-Type: application/json
- X-API-Key: pk_your_key_here
Query parameter auth example (useful for platforms without custom header support):
- POST https://app.kendo.ai/api/integrations/push-api/ingest?apiKey=pk_your_key_here
Example body:
{ "transcript": "Rep: Thanks for joining.", "callTitle": "Demo Call", "disableAiTitleGeneration": true, "repEmail": "rep@company.com", "duration": 18, "metadata": { "source": "hubspot", "recordId": "12345" } }
Rate Limits
API rate limits:
- 30 requests per minute per API key
- Request body max size is 5 MB
- Handle 429 responses with retry/backoff
- Handle 401 for missing/invalid API keys
Each submitted call uses call analysis capacity in your workspace.
Processing Behavior
If you send audioUrl, Kendo starts audio transcription and analysis.
If you send only transcript, Kendo starts transcript-only analysis.
If both are sent, audio is prioritized for transcription and the inline transcript is not persisted as the primary transcript.
Successful ingestion returns 201 with a callId that you can store for auditing.
Response data includes status context fields like processingTriggered, processingError, and statusReason.
Push API calls that remain pending beyond the processing timeout are automatically marked failed with a clear timeout reason.
Title Selection Rules
If disableAiTitleGeneration=true (or useAiCallTitle=false), downstream processing should prefer your provided callTitle.
If title flags are omitted, behavior remains backward compatible and existing AI title generation flow is used.
For best results when disabling AI title generation, always send a non-empty callTitle.