# Search Conversations

Search the sales conversations recorded by Lusha Conversations for your account. Returns each conversation's metadata, AI summary, action items, risks, objections, competitor mentions, coaching analysis, and chapters. Transcripts are not included — fetch those from Get Conversation Transcript.

Two modes on the same contract:
- Keyword mode — supply query to rank conversations by transcript content. All other filters are ignored.
- Filter mode — omit query and supply the structural filters.

Both modes return the same response shape. An empty body is valid and returns the first page of the account's conversations.

Validation notes:
- companyDomains matches on domain, not display name. Resolve a company name to a domain first (e.g. via Search Companies).
- dateFrom / dateTo accept date-only YYYY-MM-DD values. Datetimes, reduced precision (2026, 2026-01), basic format (20260101), and impossible dates (2026-02-31) are rejected with 400.
- pageSize above 100 is rejected with 400 — it is not silently clamped.
- conversationIds that don't exist, are still processing, or belong to another account are omitted from the response rather than erroring.

> Billing: 1 credit per block of up to 25 conversations returned (1–25 = 1, 26–50 = 2, 51–75 = 3, 76–100 = 4), via ci_meeting_data_export. Charged on results returned, not the page size requested. A request that returns nothing is free. While ci_meeting_data_export isn't seeded on your account's pricebook, the endpoint stays free (billing.creditsCharged is 0).

> Note: summary, coaching, and chapters come from an asynchronous post-call pipeline. A null summary on a recent conversation means analysis isn't ready yet, not "nothing found". A null severity on a risk or objection means the pipeline didn't assess it — do not read it as "low".

Endpoint: POST /v3/account/conversations/search
Security: ApiKeyAuth

## Request fields (application/json):

  - `query` (string)
    Free-text search over transcript content. When present, the structural filters below are ignored.
    Example: "pricing objection"

  - `conversationIds` (array)
    Return only these conversations. IDs that don't exist, are still processing, or belong to another account are omitted from the response rather than erroring.

  - `dateFrom` (string)
    Earliest meeting date, inclusive (YYYY-MM-DD).
    Example: "2026-01-01"

  - `dateTo` (string)
    Latest meeting date, inclusive (YYYY-MM-DD).
    Example: "2026-03-31"

  - `contactNames` (array)
    Partial, case-insensitive match on participant names. Multiple values are ORed.
    Example: ["Jane Doe"]

  - `companyDomains` (array)
    Company domains of the external participants (e.g. acme.com). Matches on domain, not display name. Multiple values are ORed.
    Example: ["acme.com"]

  - `meetingTitles` (array)
    Partial, case-insensitive match on the meeting title. Multiple values are ORed.
    Example: ["Quarterly review"]

  - `page` (integer)
    Page number, starting at 1.
    Example: 1

  - `pageSize` (integer)
    Conversations per page. Values above 100 are rejected with 400 (not silently clamped).
    Example: 25

## Response 200 fields (application/json):

  - `requestId` (string)
    Correlation / request id for support and tracing.
    Example: "3f1a9c2e-7b4d-4a8e-9f10-2c5d6e7a8b90"

  - `conversations` (array)
    Matching conversations. In keyword mode they are ordered by content relevance.

  - `conversations.id` (string)
    Conversation identifier. Pass this to Get Conversation Transcript.
    Example: "8f2c9b1e-4a7d-4f3b-9c2e-1d6a5b8c7e90"

  - `conversations.title` (string)
    Meeting title.
    Example: "Acme <> Lusha - Quarterly review"

  - `conversations.date` (string)
    Meeting date (YYYY-MM-DD).
    Example: "2026-03-12"

  - `conversations.startTime` (string)
    Meeting start time (ISO 8601).
    Example: "2026-03-12T14:00:00Z"

  - `conversations.durationSeconds` (number)
    Meeting length in seconds.
    Example: 1830

  - `conversations.durationFormatted` (string)
    Human readable length, e.g. 30m 30s.
    Example: "30m 30s"

  - `conversations.meetingType` (string,null)
    Meeting type as classified by the analysis pipeline.
    Example: "discovery"

  - `conversations.isExternal` (boolean,null)
    true when at least one participant is outside your account.
    Example: true

  - `conversations.company` (object)
    External participants' company. Either field may be null.

  - `conversations.company.name` (string,null)
    Example: "Acme Inc"

  - `conversations.company.domain` (string,null)
    Example: "acme.com"

  - `conversations.participants` (array)

  - `conversations.participants.name` (string)
    Example: "Jane Doe"

  - `conversations.participants.email` (string)
    Example: "jane@acme.com"

  - `conversations.participants.role` (string)
    Example: "VP Sales"

  - `conversations.participants.isInternal` (boolean)

  - `conversations.topicLabels` (array)
    Topics detected in the conversation.
    Example: ["pricing","security"]

  - `conversations.summary` (object,null)
    Post-call analysis, or null while it is still being produced.

  - `conversations.summary.text` (string)
    Narrative summary.
    Example: "The team walked through the pricing tiers."

  - `conversations.summary.keyHighlights` (array)
    Notable moments.
    Example: ["Budget confirmed for Q3"]

  - `conversations.summary.actionItems` (array)

  - `conversations.summary.actionItems.text` (string)
    Example: "Send the revised pricing sheet"

  - `conversations.summary.actionItems.owner` (string)
    Example: "Sam Rep"

  - `conversations.summary.actionItems.dueDate` (string,null)
    May be null.
    Example: "2026-03-19"

  - `conversations.summary.nextSteps` (array)
    Example: ["Schedule a technical deep dive"]

  - `conversations.summary.risks` (array)

  - `conversations.summary.risks.text` (string)
    Example: "Budget approval is still pending"

  - `conversations.summary.risks.severity` (string,null)
    Null means the pipeline did not assess severity. Do not read it as "low".
    Example: "high"

  - `conversations.summary.objections` (array)

  - `conversations.summary.competition` (array)

  - `conversations.summary.competition.name` (string)
    Example: "Competitor Inc"

  - `conversations.summary.competition.context` (string)
    Example: "Mentioned as incumbent"

  - `conversations.summary.competition.sentiment` (string,null)
    May be null.
    Example: "negative"

  - `conversations.coaching` (object,null)
    Coaching analysis, or null while it is still being produced.

  - `conversations.coaching.overallScore` (number)
    Overall coaching score, 0–100.
    Example: 68

  - `conversations.coaching.likelihoodOfSale` (number,null)
    Predicted likelihood of closing, 0–100. May be null.
    Example: 45

  - `conversations.coaching.sections` (array)

  - `conversations.coaching.sections.section` (string)
    Example: "discovery"

  - `conversations.coaching.sections.score` (number,null)
    May be null.
    Example: 72

  - `conversations.coaching.sections.whatHappened` (string)
    Example: "The rep opened with a clear agenda."

  - `conversations.coaching.sections.whatToKeep` (array)
    Example: ["Strong discovery questions"]

  - `conversations.coaching.sections.whatToImprove` (array)
    Example: ["Confirm the decision process earlier"]

  - `conversations.coaching.notes` (string)
    Free-text coaching notes.
    Example: "Focus on quantifying impact."

  - `conversations.chapters` (array)
    Timestamped chapters. Empty until the analysis pipeline has run.

  - `conversations.chapters.index` (integer)

  - `conversations.chapters.title` (string)
    Example: "Introductions"

  - `conversations.chapters.startTime` (string)
    Offset from the start of the recording.
    Example: "00:00:00"

  - `conversations.chapters.endTime` (string)
    Offset from the start of the recording.
    Example: "00:04:12"

  - `conversations.chapters.summary` (string)
    Example: "Participants introduced themselves."

  - `page` (object)
    Paging envelope for Search Conversations.

  - `page.page` (integer)
    Example: 1

  - `page.pageSize` (integer)
    Example: 25

  - `page.totalItems` (integer)
    Example: 137

  - `page.totalPages` (integer)
    Example: 6

  - `billing` (object)
    Credit usage summary for a V3 API request

  - `billing.creditsCharged` (integer)
    Total credits charged for this request
    Example: 3

  - `billing.resultsReturned` (integer)
    Number of successful results returned
    Example: 1

## Response 400 fields (application/json):

  - `statusCode` (integer, required)
    HTTP status code
    Example: 400

  - `message` (string, required)
    Error message
    Example: "Validation failed"

  - `errors` (array)
    Detailed error messages (optional, only for validation errors)
    Example: ["entityType must be one of: contact, company"]


