Push API
Programmatically submit calls for analysis via API.
Last updated: Mar 4, 2026
Overview
The Push API lets you programmatically submit calls for analysis. This is useful when:
Authentication
API authentication requires a Push API key generated from Integrations > Push API.
Include your key in the request header: X-API-Key: pk_...
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, and metadata
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
- 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
Headers:
- Content-Type: application/json
- X-API-Key: pk_your_key_here
Example body:
{ "transcript": "Rep: Thanks for joining.", "callTitle": "Demo Call", "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.