Import a call from another platform
Need AskElephant to handle your import? Contact support@askelephant.ai to get started. AskElephant-managed imports are approximately $0.99 per hour of recorded calls.
Overview
You can import a call from any platform that can make an HTTPS request to the AskElephant public API. Use POST /v2/engagements to create the engagement and include the call metadata, recording URL, and transcript timeline.
The basic flow is:
- Collect the call’s metadata, recording URL, and transcript from the source platform.
- Convert the transcript into AskElephant’s structured
transcript_timelineformat. - Submit the call with
POST /v2/engagements. - Use the returned engagement ID to retrieve the engagement and its AI-generated insights.
Billing warning: Please include a transcript_timeline with every imported call. Without one, AskElephant will process the call through its transcription process, which may result in a transcription charge on your next invoice at a rate of $0.50 per hour of transcription handled by AskElephant.
Choose your import mode
You may provide both media_url and transcript_timeline. The recording is retained for playback, while the supplied timeline is used as the call transcript. If you do not have recording media, you can submit a transcript-only import with transcript_timeline.
transcript_text is deprecated and should not be used for new imports. It does not replace transcript_timeline for a structured import.
Prerequisites
- An AskElephant API key with the
engagements:writescope. Addengagements:readif you want to retrieve the imported engagement and its insights; private engagements also requireengagements:private:read. - A recording URL that AskElephant can access over HTTPS, if importing media
- A transcript with speaker attribution and timestamps, if you want to avoid transcription charges
See Authentication and scopes for API key details.
Decide who owns the engagement
The engagement owner is the AskElephant user responsible for the imported call. Ownership affects attribution in AskElephant and determines the user used as the engagement’s owner and host during downstream processing. It is separate from the list of attendees.
Mark the owner in the participants array:
AskElephant resolves an owner participant in this order:
- Match the participant’s
emailto an active AskElephant user in the authenticated workspace. - If there is no email match, match the participant’s
phonenumber. - Use the matched user as both the engagement owner and host.
The matched user must be active and invited to the workspace. Users with INACTIVE or NOT_INVITED roles cannot be selected as the owner.
If no participant is marked as the owner
When no participant has is_owner: true, ownership defaults to the user associated with the API key or OAuth credential. This is usually the right choice when the credential belongs to the person or service account responsible for the import.
An API key or OAuth credential without an associated user can still create an engagement, but only if one participant is marked as is_owner: true and resolves to an active workspace user.
Owner validation rules
- At most one participant can have
is_owner: true. - The owner participant must resolve by email or phone to an active workspace user.
- A name alone is not enough to resolve ownership; include the user’s email or E.164 phone number.
- If there are multiple owners, or the owner cannot be resolved, the API returns
400. - Owner validation happens before media ingestion, engagement persistence, or processing events, so a failed owner claim does not create a partial import.
Attendees and contacts
Use participants to send the people who attended the call. Each participant can include a name, email, and/or E.164 phone number. Include the same identifying details in the transcript timeline’s speakers when you want AskElephant to match transcript speakers to participants.
If you already have AskElephant contact IDs and want to link those existing contacts after creation, replace the engagement’s managed contacts with:
This endpoint also requires engagements:write. Private engagements additionally require engagements:private:write. Use contacts:read only when you need to read expanded contact details in a response.
Create the import
The following request imports a call with its recording and existing transcript:
Required fields
Workflow and processing controls
run_workflows controls downstream automations, not core engagement processing:
Transcription, summarization, and tagging continue to run regardless of run_workflows. Suppressing workflows does not suppress core AI processing or remove a transcription charge when no transcript timeline is supplied.
Prevent workflows and attendee emails
For historical imports, set run_workflows to false before creating the engagement:
This prevents workflow triggers and automated meeting summary or recap emails from being sent to people marked as attendees in participants. In other words, run_workflows: false is the API setting to use when you want run_automations turned off for an imported call.
The engagement can still be transcribed, summarized, and tagged. Setting run_workflows to false only suppresses downstream workflow automation and its related emails.
Recording URL requirements
When media_url is included, it must be a publicly accessible HTTPS URL that serves an audio or video content type. AskElephant fetches the media during request processing, so the URL must be available at the time of the request. Private URLs, internal IP addresses, HTTP URLs, and non-media content types are rejected.
Transcript timeline format
The timeline has two parts:
speakersdeclares each speaker. Each speaker needs a unique numericindexand a non-emptyname; email and phone are optional but help match the speaker to an AskElephant participant.entriescontains the transcript turns. Each entry references a speaker withspeaker_index, and includes offsets in seconds plus one or moresentences.
All timestamps are offsets from the start of the engagement, not absolute timestamps. Every speaker_index must match a declared speaker, and sentence timestamps must fall within their parent entry.
Idempotency and retries
external_id is the idempotency key within the workspace. Repeating a request with the same external_id returns the existing engagement instead of creating a duplicate, so it is safe to retry a timed-out request. If IDs can overlap across source systems, prefix them, for example my-crm:call_12345.
The idempotency key is scoped to the workspace, not to source_system. The same external_id can therefore collide across two platforms unless you include the source in the ID. A new import returns 201; an idempotent match returns 200 when the engagement can be returned, or 204 when the credential can write but not read it. If the matching engagement is inaccessible, the API returns 404. If the matching engagement was deleted, the ID can be reused for a new import.
Timestamps and engagement duration
Set start_at to the original call start time as an ISO 8601 timestamp. If you omit it, AskElephant uses the current server time.
When transcript_timeline is supplied, the engagement end time is derived from the largest end_seconds value in the timeline, even when media_url is also present. For media-only imports, the end time is derived from the recording duration during processing. Timeline offsets are relative to the engagement start, not absolute timestamps.
Response and next steps
On a new import, the API returns 201 and an engagement object containing its AskElephant ID. Save the id from the response:
Use the ID to retrieve the engagement after processing:
For reliable integrations, subscribe to v1.engagement.transcript_timeline.completed to know when the transcript is available, then poll the engagement until processing_status is COMPLETED before retrieving AI-generated insights. The transcript webhook can arrive while analysis and enrichment are still running. See Webhooks and the Engagements API reference.
Import checklist
- Create or use an API key with
engagements:writeandengagements:read; addengagements:private:readwhen retrieving private engagements. - Choose the import mode: media only, media plus transcript timeline, or transcript only.
- Use a stable, source-prefixed
external_id. - Set
start_atto the original call time when available. - Add every attendee to
participants. - Mark exactly one attendee as
is_owner: truewhen ownership should differ from the API-key user, or when the credential has no associated user. - Include
transcript_timelinewhenever possible to avoid transcription charges. - Save the returned engagement ID and wait for processing to complete before retrieving insights.