> ## Documentation Index
> Fetch the complete documentation index at: https://docs.letterdrop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List contacts

> One row per person who engaged a competitor: the person, their signals, and their account flattened alongside, as the webhook sends it. Takes the same filters as /accounts. Best fit first unless sorted.



## OpenAPI

````yaml /openapi.json get /contacts
openapi: 3.1.0
info:
  title: Letterdrop Competitor Monitoring API
  version: 2.0.0
  license:
    name: Proprietary
    url: https://letterdrop.com/terms
  description: >-
    Read your workspace's Competitor Monitoring data: the accounts where people
    engaged your competitors, the contacts and signals behind each, their CRM
    context, your outreach, and the dashboard metrics.


    The API speaks the same language as the New Competitor Deal webhook (payload
    version v2): a field has the same name and the same values in both, so
    whatever you build on one reads the other.


    **Versioning.** The major version is in the path (/api/v2). Within v2
    changes are additive only (new optional fields, filters, endpoints), so
    ignore fields you do not recognise. The v1 competitor-monitoring endpoints
    keep working unchanged.


    **Rate limits.** Per workspace: 10 requests/second and 600/minute, plus 20
    uncached computations/minute (analytics count as 4). Cached reads
    (meta.cache = hit), including every later page of a list you already
    started, use no computation budget. Every response carries RateLimit-Limit /
    RateLimit-Remaining / RateLimit-Reset; a 429 carries Retry-After.


    **Freshness.** Results are cached for a few minutes (analytics and filter
    options a little longer); meta.data_as_of says when the data was computed.
    Signals are collected daily, so polling faster than every few minutes
    returns the same data.
servers:
  - url: https://api.letterdrop.com/api/v2
security: []
tags:
  - name: Accounts
    description: Companies with competitor signals, and what we know about each.
  - name: Contacts
    description: The people behind the signals.
  - name: Analytics
    description: The dashboard metrics, one endpoint each.
  - name: Filters
    description: Every key of every object, and how to select and filter on it.
externalDocs:
  description: Developer reference
  url: https://api.letterdrop.com/api/v2/docs
paths:
  /contacts:
    get:
      tags:
        - Contacts
      summary: List contacts
      description: >-
        One row per person who engaged a competitor: the person, their signals,
        and their account flattened alongside, as the webhook sends it. Takes
        the same filters as /accounts. Best fit first unless sorted.
      operationId: listContacts
      parameters:
        - $ref: '#/components/parameters/search'
        - $ref: '#/components/parameters/account_competitors'
        - $ref: '#/components/parameters/account_competitor_cycle_stage'
        - $ref: '#/components/parameters/account_priority'
        - $ref: '#/components/parameters/account_icp_fit'
        - $ref: '#/components/parameters/account_signal_freshness'
        - $ref: '#/components/parameters/latest_signal_within_days'
        - $ref: '#/components/parameters/latest_signal_after'
        - $ref: '#/components/parameters/latest_signal_before'
        - $ref: '#/components/parameters/company_size'
        - $ref: '#/components/parameters/company_hq_country'
        - $ref: '#/components/parameters/crm_has_account'
        - $ref: '#/components/parameters/crm_is_customer'
        - $ref: '#/components/parameters/crm_has_opp'
        - $ref: '#/components/parameters/crm_latest_opp_stage'
        - $ref: '#/components/parameters/crm_latest_opp_owner_email'
        - $ref: '#/components/parameters/crm_account_owner_name'
        - $ref: '#/components/parameters/crm_account_owner_email'
        - $ref: '#/components/parameters/crm_latest_opp_date_within_days'
        - $ref: '#/components/parameters/crm_latest_opp_date_older_than_days'
        - $ref: '#/components/parameters/crm_latest_opp_date_after'
        - $ref: '#/components/parameters/crm_latest_opp_date_before'
        - $ref: '#/components/parameters/outreach_status'
        - $ref: '#/components/parameters/outreach_attribution'
        - $ref: '#/components/parameters/preset'
        - $ref: '#/components/parameters/crm_custom_fields'
        - name: sort
          in: query
          required: false
          description: Sort field. Default latest_signal_date.
          schema:
            type: string
            enum:
              - latest_signal_date
              - account_priority
              - crm_latest_opp_created_date
              - crm_latest_opp_close_date
        - name: order
          in: query
          required: false
          description: Sort order. Default desc.
          schema:
            type: string
            enum:
              - asc
              - desc
        - name: include
          in: query
          required: false
          description: contact_info adds contact_work_email and contact_phone_number.
          schema:
            type: string
        - name: fields
          in: query
          required: false
          description: >-
            Comma-separated Contact row fields to return; omit for all. Reach
            into a list with a dot (contacts.contact_name,
            contacts.signals.signal_date). account_id and signal_id always ship.
          schema:
            type: string
            maxLength: 4000
        - name: filter
          in: query
          required: false
          description: >-
            Filter on any Contact row key GET /fields lists:
            filter[<key>]=<value> (repeat for any of several values) or
            filter[<key>][<operator>]=<value> with eq, ne, contains, gt, gte,
            lt, lte, exists. Keys inside a list (contacts.contact_job_title,
            signals.signal_freshness) match when any element matches. Combines
            with the dedicated filters; all of them must hold.
          style: deepObject
          explode: true
          schema:
            type: object
            propertyNames:
              type: string
              minLength: 1
              maxLength: 200
            additionalProperties:
              anyOf:
                - anyOf:
                    - type: string
                      maxLength: 500
                    - maxItems: 200
                      type: array
                      items:
                        type: string
                        maxLength: 500
                - type: object
                  propertyNames:
                    type: string
                    minLength: 1
                    maxLength: 20
                  additionalProperties:
                    anyOf:
                      - type: string
                        maxLength: 500
                      - maxItems: 200
                        type: array
                        items:
                          type: string
                          maxLength: 500
        - name: page_size
          in: query
          required: false
          description: Rows per page, 1-500. Default 25.
          schema:
            type: integer
            minimum: 1
            maximum: 500
        - name: offset
          in: query
          required: false
          description: Rows to skip, to jump to a position. Cannot be combined with cursor.
          schema:
            type: integer
            minimum: 0
            maximum: 100000
        - name: cursor
          in: query
          required: false
          description: >-
            pagination.next_cursor from the previous page. Send only cursor
            (plus page_size or fields): the query travels inside it.
          schema:
            type: string
            minLength: 1
            maxLength: 8192
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - meta
                properties:
                  data:
                    type: object
                    properties:
                      contacts:
                        type: array
                        items:
                          $ref: '#/components/schemas/ContactRow'
                  meta:
                    $ref: '#/components/schemas/Meta'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
              example:
                data:
                  contacts:
                    - account_id: domain:acme.com
                      contact_name: Jane Doe
                      contact_job_title: VP Marketing
                      contact_linkedin_url: https://example.com/in/jane-doe
                      contact_type: Engaged Contact
                      contact_role: champion
                      contact_bucket: strong
                      contact_buying_committee_role: business_evaluator
                      contact_first_signal_date: '2026-10-02'
                      contact_latest_signal_date: '2026-10-28'
                      signal_freshness: Recent
                      recommended_channels: Email + Call
                      recommended_email: true
                      recommended_linkedin: false
                      recommended_call: true
                      outreach_contacted: true
                      outreach_replied: false
                      outreach_contacted_by_name: Alex Owner
                      outreach_contacted_by_email: alex@example.com
                      signals:
                        - signal_id: 6aa5558899db31a0da3c9465
                          signal_summary: Engaged with a Vice President of Sales at HubSpot
                          signal_post_url: https://example.com/posts/7392000000000000000
                          signal_freshness: Recent
                          signal_date: '2026-10-28'
                          signal_collected_date: '2026-10-28'
                          competitor_name: HubSpot
                          competitor_rep_title: Vice President of Sales
                        - signal_id: 6aa5558899db31a0da3c9411
                          signal_summary: Engaged with an Account Executive at HubSpot
                          signal_post_url: ''
                          signal_freshness: Recent
                          signal_date: '2026-10-02'
                          signal_collected_date: '2026-10-02'
                          competitor_name: HubSpot
                          competitor_rep_title: Account Executive
                      company_name: Acme
                      company_domain: acme.com
                      company_size: 1001-5000
                      company_industry: Software Development
                      company_hq_country: US
                      company_hq_location: San Francisco, California
                      company_description: Acme makes workflow software for finance teams.
                      company_logo_url: https://cdn.letterdrop.co/logos/acme.png
                      account_competitors: HubSpot, Salesforce
                      account_competitor_cycle_stage: Early Stage
                      account_competitor_cycle_reason: >-
                        Three decision makers engaged HubSpot sales reps in the
                        last 30 days; no deal activity yet.
                      account_priority: High
                      account_icp_fit: true
                      account_icp_fit_reason: >-
                        Matches the industries and company sizes of your
                        closed-won customers.
                      account_confirmed_competitor: >-
                        HubSpot - Source:
                        https://jobs.example.com/acme/marketing-ops-manager
                      account_confirmed_project: ''
                      account_estimated_renewal_date: '2027-03-01'
                      account_optimal_outreach_date: ''
                      account_evaluating_vendors_confirmed: false
                      account_signal_freshness: Recent
                      first_signal_date: '2026-10-02'
                      first_signal_date_approximate: false
                      latest_signal_date: '2026-10-28'
                      latest_signal_summary: >-
                        Jane Doe engaged with a Vice President of Sales at
                        HubSpot.
                      crm_account_url: >-
                        https://app.hubspot.com/contacts/12345678/company/17598685516
                      crm_account_owner_name: Alex Owner
                      crm_account_owner_email: alex@example.com
                      crm_is_customer: false
                      crm_has_open_opp: true
                      crm_opp_count: 1
                      crm_latest_opp_id: '64931875364'
                      crm_latest_opp_stage: 'S1: Discover (SAO)'
                      crm_latest_opp_amount: 24000
                      crm_latest_opp_pipeline: New Business
                      crm_latest_opp_created_date: '2026-10-29'
                      crm_latest_opp_close_date: '2026-12-15'
                      crm_latest_opp_owner_name: Alex Owner
                      crm_latest_opp_owner_email: alex@example.com
                      crm_latest_opp_is_renewal: false
                      crm_custom_fields:
                        hubspot:company:Tier:
                          - A
                      outreach_status: reached_out_after_signal
                      outreach_started: true
                      outreach_any_replied: true
                      outreach_attribution: direct_reply
                      outreach_attribution_reason: >-
                        The meeting was booked after Jane replied to the Oct 24
                        outreach.
                      outreach_summary: >-
                        First touch four days after the signal; a meeting was
                        booked a week later.
                      outreach_before_signal: false
                      outreach_lead_source: outbound
                      outreach_last_date: '2026-10-24'
                      outreach_last_before_signal_date: ''
                      outreach_first_after_signal_date: '2026-10-24'
                      outreach_meeting_booked_date: '2026-10-30'
                pagination:
                  total: 713
                  has_more: true
                  next_cursor: eyJ2IjoyLC4uLn0.c2lnbmF0dXJl
                meta:
                  api_version: '2'
                  data_as_of: '2026-11-02T09:36:28.016Z'
                  cache: hit
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '410':
          $ref: '#/components/responses/Gone'
        '422':
          $ref: '#/components/responses/Unprocessable'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/ServerError'
      security:
        - WorkspaceKey: []
        - BearerAuth:
            - mcp.read
components:
  parameters:
    search:
      name: search
      in: query
      required: false
      description: Free-text match on company and contact names.
      schema:
        type: string
        maxLength: 200
      x-filter: true
    account_competitors:
      name: account_competitors
      in: query
      required: false
      description: >-
        Accounts with signals for any of these competitors (names from GET
        /fields?object=account).
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          minLength: 1
          maxLength: 500
      x-filter: true
    account_competitor_cycle_stage:
      name: account_competitor_cycle_stage
      in: query
      required: false
      description: Inferred competitor buying-cycle stage.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          enum:
            - Aware of Competitor
            - Historical
            - Prospecting
            - Early Stage
            - Late Stage
      x-filter: true
    account_priority:
      name: account_priority
      in: query
      required: false
      description: Priority.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          enum:
            - High
            - Medium
            - Nurture
      x-filter: true
    account_icp_fit:
      name: account_icp_fit
      in: query
      required: false
      description: true = only ICP-fit accounts, false = only the rest.
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
      x-filter: true
    account_signal_freshness:
      name: account_signal_freshness
      in: query
      required: false
      description: >-
        Stale alone = only stale accounts; Recent and Historic together =
        exclude stale accounts. Other combinations are rejected: Recent and
        Historic cannot be filtered apart yet.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          enum:
            - Recent
            - Historic
            - Stale
      x-filter: true
    latest_signal_within_days:
      name: latest_signal_within_days
      in: query
      required: false
      description: Accounts whose latest signal was within the last N days.
      schema:
        type: integer
        minimum: 1
        maximum: 3650
      x-filter: true
    latest_signal_after:
      name: latest_signal_after
      in: query
      required: false
      description: Latest signal on or after this date.
      schema:
        type: string
      x-filter: true
    latest_signal_before:
      name: latest_signal_before
      in: query
      required: false
      description: Latest signal on or before this date.
      schema:
        type: string
      x-filter: true
    company_size:
      name: company_size
      in: query
      required: false
      description: Employee bands, e.g. "51-200".
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          minLength: 1
          maxLength: 500
      x-filter: true
    company_hq_country:
      name: company_hq_country
      in: query
      required: false
      description: >-
        Headquarters country, ISO 3166-1 alpha-2 (e.g. "US"); a country name
        ("United States") is accepted too.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          minLength: 2
          maxLength: 100
      x-filter: true
    crm_has_account:
      name: crm_has_account
      in: query
      required: false
      description: >-
        true = the account was already in your CRM when we found it, false = net
        new (it was not). An account added to the CRM later can have
        crm_account_url set and still be net new.
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
      x-filter: true
    crm_is_customer:
      name: crm_is_customer
      in: query
      required: false
      description: true = your customers only, false = exclude them.
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
      x-filter: true
    crm_has_opp:
      name: crm_has_opp
      in: query
      required: false
      description: >-
        false = accounts with no CRM opportunity. true is the same as listing
        every crm_latest_opp_stage.
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
      x-filter: true
    crm_latest_opp_stage:
      name: crm_latest_opp_stage
      in: query
      required: false
      description: >-
        Latest opportunity's stage, as your CRM labels it (values from GET
        /fields?object=account).
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          minLength: 1
          maxLength: 500
      x-filter: true
    crm_latest_opp_owner_email:
      name: crm_latest_opp_owner_email
      in: query
      required: false
      description: Latest opportunity owner's email.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          format: email
          pattern: >-
            ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
      x-filter: true
    crm_account_owner_name:
      name: crm_account_owner_name
      in: query
      required: false
      description: CRM account owner's name (values from GET /fields?object=account).
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          minLength: 1
          maxLength: 500
      x-filter: true
    crm_account_owner_email:
      name: crm_account_owner_email
      in: query
      required: false
      description: CRM account owner's email.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          format: email
          pattern: >-
            ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
      x-filter: true
    crm_latest_opp_date_within_days:
      name: crm_latest_opp_date_within_days
      in: query
      required: false
      description: Latest opportunity created or closed within the last N days.
      schema:
        type: integer
        minimum: 1
        maximum: 3650
      x-filter: true
    crm_latest_opp_date_older_than_days:
      name: crm_latest_opp_date_older_than_days
      in: query
      required: false
      description: Latest opportunity created or closed more than N days ago.
      schema:
        type: integer
        minimum: 1
        maximum: 3650
      x-filter: true
    crm_latest_opp_date_after:
      name: crm_latest_opp_date_after
      in: query
      required: false
      description: Latest opportunity created or closed on or after this date.
      schema:
        type: string
      x-filter: true
    crm_latest_opp_date_before:
      name: crm_latest_opp_date_before
      in: query
      required: false
      description: Latest opportunity created or closed on or before this date.
      schema:
        type: string
      x-filter: true
    outreach_status:
      name: outreach_status
      in: query
      required: false
      description: >-
        Where outreach stands. *_after_signal values count only outreach after
        the first signal.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          enum:
            - reached_out
            - replied
            - opportunity_created
            - not_reached_out
            - reached_out_after_signal
            - replied_after_signal
            - opportunity_created_after_signal
      x-filter: true
    outreach_attribution:
      name: outreach_attribution
      in: query
      required: false
      description: Attribution verdict.
      style: form
      explode: true
      schema:
        minItems: 1
        maxItems: 200
        type: array
        items:
          type: string
          enum:
            - direct_reply
            - driven
            - assisted
            - detected
            - competitive_deal
            - not_attributed
      x-filter: true
    preset:
      name: preset
      in: query
      required: false
      description: >-
        A prebuilt view of the table. CRM presets replace crm_latest_opp_stage
        with their own rule.
      schema:
        type: string
        enum:
          - pilot
          - advertising
          - capacity_based_outbound
          - sell_now
          - competitor_aware_tam
          - customers_at_risk
          - competitive_deals
      x-filter: true
    crm_custom_fields:
      name: crm_custom_fields
      in: query
      required: false
      description: >-
        Custom CRM fields, as crm_custom_fields[<crm>:<object>:<field>]=<value>
        (e.g. crm_custom_fields[hubspot:company:Tier]=A). Fields AND together;
        values of one field OR.
      style: deepObject
      explode: true
      schema:
        type: object
        propertyNames:
          type: string
          minLength: 1
          maxLength: 300
        additionalProperties:
          minItems: 1
          maxItems: 200
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 500
      x-filter: true
  schemas:
    ContactRow:
      type: object
      description: >-
        A /contacts row: the Contact, then their Account's fields flattened
        alongside, the way the webhook sends a signal.
      x-field-groups:
        - Account
        - Company
        - Contact
        - Signal
        - CRM
        - Outreach
        - Recommended
      properties:
        account_id:
          type: string
          description: >-
            Stable id of the account, e.g. "domain:acme.com". Use it in
            /accounts/{account_id} paths (URL-encoded).
          x-group: Account
        contact_name:
          type: string
          description: Full name.
          x-group: Contact
        contact_job_title:
          type: string
          description: Current job title.
          x-group: Contact
        contact_linkedin_url:
          type: string
          description: Social profile URL.
          x-group: Contact
        contact_work_email:
          type: string
          description: >-
            Work email this workspace already enriched. Only with
            include=contact_info; empty means not enriched yet.
          x-group: Contact
        contact_phone_number:
          type: string
          description: >-
            Phone this workspace already enriched. Only with
            include=contact_info.
          x-group: Contact
        contact_type:
          type: string
          x-values:
            - Engaged Contact
            - Buying Committee
          description: >-
            Engaged Contact: this person produced signals. Buying Committee: a
            decision-maker at the account who has NOT engaged a competitor.
          x-group: Contact
        contact_role:
          type:
            - string
            - 'null'
          description: >-
            Role in a purchase (e.g. champion, decision_maker). Null when not
            classified.
          x-group: Contact
        contact_bucket:
          type:
            - string
            - 'null'
          description: >-
            How strong a fit the person is (strong, potential, weak). Null when
            not classified.
          x-group: Contact
        contact_buying_committee_role:
          type: string
          description: >-
            Seniority classification of the person (e.g. business_evaluator).
            Not committee membership.
          x-group: Contact
        contact_first_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: >-
            This person's first dated signal. Empty when all their signals are
            Historic.
          x-group: Signal
        contact_latest_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: >-
            This person's latest dated signal. Empty when all their signals are
            Historic.
          x-group: Signal
        signal_freshness:
          type: string
          x-values:
            - Recent
            - Historic
            - Stale
          description: Freshness of this person's latest signal.
          x-group: Signal
        recommended_channels:
          type: string
          description: >-
            The recommended outreach as one label, e.g. "Email + Call". Empty
            when there is no recommendation.
          x-group: Recommended
        recommended_email:
          type: boolean
          description: Email is recommended.
          x-group: Recommended
        recommended_linkedin:
          type: boolean
          description: Social outreach is recommended.
          x-group: Recommended
        recommended_call:
          type: boolean
          description: A call is recommended.
          x-group: Recommended
        outreach_contacted:
          type: boolean
          description: Your team has reached out to this person (CRM).
          x-group: Outreach
        outreach_replied:
          type: boolean
          description: This person replied (CRM).
          x-group: Outreach
        outreach_contacted_by_name:
          type: string
          description: Who on your team reached out.
          x-group: Outreach
        outreach_contacted_by_email:
          type: string
          description: Their email.
          x-group: Outreach
        signals:
          type: array
          items:
            $ref: '#/components/schemas/Signal'
          description: >-
            This person's signals, newest first. Empty for a Buying Committee
            member.
          x-group: Signal
        company_name:
          type: string
          description: Company name.
          x-group: Company
        company_domain:
          type: string
          description: Website domain.
          x-group: Company
        company_size:
          type: string
          description: Employee band, e.g. "1001-5000".
          x-group: Company
        company_industry:
          type: string
          description: Industry.
          x-group: Company
        company_hq_country:
          type: string
          description: Headquarters country, ISO 3166-1 alpha-2 (e.g. "US").
          x-group: Company
        company_hq_location:
          type: string
          description: Headquarters location as listed, e.g. "San Francisco, California".
          x-group: Company
        company_description:
          type: string
          description: Company description.
          x-group: Company
        company_logo_url:
          type: string
          description: Logo image URL.
          x-group: Company
        account_competitors:
          type: string
          description: >-
            Every competitor with signals at this account, comma-joined ("Common
            Room, G2"), as the webhook sends it.
          x-group: Account
        account_competitor_cycle_stage:
          type: string
          x-values:
            - Aware of Competitor
            - Historical
            - Prospecting
            - Early Stage
            - Late Stage
          description: >-
            Where we infer the account is in a buying cycle with a competitor.
            An inference from signals, not CRM data.
          x-group: Account
        account_competitor_cycle_reason:
          type: string
          description: Why we inferred that stage.
          x-group: Account
        account_priority:
          type: string
          x-values:
            - High
            - Medium
            - Nurture
          description: >-
            How soon to act, as the Competitor Monitoring table shows it. The
            webhook sends this as signal_priority.
          x-group: Account
        account_icp_fit:
          type: boolean
          description: The account matches your ideal customer profile.
          x-group: Account
        account_icp_fit_reason:
          type: string
          description: Why it fits. Empty when account_icp_fit is false.
          x-group: Account
        account_confirmed_competitor:
          type: string
          description: >-
            A competitor the account's own job posts or filings say it uses,
            with the source: "<name> - Source: <url>". Empty when none.
          x-group: Account
        account_confirmed_project:
          type: string
          description: >-
            A project in the account's job posts or filings that what you sell
            would help: "<summary> - Source: <url>". Empty when none.
          x-group: Account
        account_estimated_renewal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: >-
            Estimated renewal date of the competitor contract. Empty when
            unknown.
          x-group: Account
        account_optimal_outreach_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: Suggested date to reach out. Empty when unknown.
          x-group: Account
        account_signal_freshness:
          type: string
          x-values:
            - Recent
            - Historic
            - Stale
          description: >-
            Stale when the account's signals aged past your sales cycle,
            Historic when every signal is Historic, Recent otherwise.
          x-group: Signal
        first_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: The account's first dated signal.
          x-group: Signal
        first_signal_date_approximate:
          type: boolean
          description: first_signal_date was inferred from a scan rather than observed.
          x-group: Signal
        latest_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: The account's latest dated signal.
          x-group: Signal
        latest_signal_summary:
          type: string
          description: >-
            The latest signal in one sentence, e.g. "Jane Doe engaged with a VP
            of Sales at HubSpot."
          x-group: Signal
        account_evaluating_vendors_confirmed:
          type: boolean
          description: Someone on your team confirmed the account is evaluating vendors.
          x-group: Account
        crm_account_url:
          type: string
          description: >-
            Link to the account's own CRM record. Empty when it is not in your
            CRM.
          x-group: CRM
        crm_account_owner_name:
          type: string
          description: CRM account owner.
          x-group: CRM
        crm_account_owner_email:
          type: string
          description: Their email.
          x-group: CRM
        crm_is_customer:
          type: boolean
          description: The account is your customer now.
          x-group: CRM
        crm_has_open_opp:
          type:
            - boolean
            - 'null'
          description: >-
            The latest opportunity is open. Null when the latest is closed and
            an older one might be open.
          x-group: CRM
        crm_opp_count:
          type: integer
          description: Opportunities on the account.
          x-group: CRM
        crm_latest_opp_id:
          type: string
          description: CRM id of the latest opportunity.
          x-group: CRM
        crm_latest_opp_stage:
          type: string
          description: 'Its stage as your CRM labels it, e.g. "S1: Discover (SAO)".'
          x-group: CRM
        crm_latest_opp_amount:
          type:
            - number
            - 'null'
          description: Its amount.
          x-group: CRM
        crm_latest_opp_pipeline:
          type: string
          description: Its pipeline.
          x-group: CRM
        crm_latest_opp_created_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: When it was created.
          x-group: CRM
        crm_latest_opp_close_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: Its close date (expected close while open).
          x-group: CRM
        crm_latest_opp_owner_name:
          type: string
          description: Its owner.
          x-group: CRM
        crm_latest_opp_owner_email:
          type: string
          description: Their email.
          x-group: CRM
        crm_latest_opp_is_renewal:
          type: boolean
          description: It is a renewal, so not new pipeline even while open.
          x-group: CRM
        crm_custom_fields:
          type: object
          additionalProperties: true
          description: >-
            The CRM columns you added to the table, keyed
            "<crm>:<object>:<field>" (e.g. "hubspot:company:Tier"), each a list
            of values.
          x-group: CRM
        outreach_status:
          type: string
          x-values:
            - opportunity_created
            - replied
            - reached_out
          description: >-
            Where outreach to the account stands. *_after_signal values count
            only outreach after the first signal.
          x-group: Outreach
        outreach_started:
          type: boolean
          description: Anyone at the account has been contacted (CRM).
          x-group: Outreach
        outreach_any_replied:
          type: boolean
          description: Anyone at the account replied (CRM).
          x-group: Outreach
        outreach_attribution:
          type: string
          x-values:
            - direct_reply
            - driven
            - assisted
            - detected
            - competitive_deal
            - pending_analysis
            - none
          description: >-
            Our verdict on whether the signal led to the meeting or deal. Empty
            when we make no claim.
          x-group: Outreach
        outreach_attribution_reason:
          type: string
          description: Why we reached that verdict.
          x-group: Outreach
        outreach_summary:
          type: string
          description: A short summary of the CRM outreach.
          x-group: Outreach
        outreach_before_signal:
          type:
            - boolean
            - 'null'
          description: >-
            Your team reached out in the 30 days before the first signal. Null
            when that window was not observed, which is not the same as no
            outreach.
          x-group: Outreach
        outreach_lead_source:
          type: string
          description: Lead source category (outbound, inbound, …).
          x-group: Outreach
        outreach_last_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: Latest outreach.
          x-group: Outreach
        outreach_last_before_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: Latest outreach before the first signal.
          x-group: Outreach
        outreach_first_after_signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: First outreach after the first signal.
          x-group: Outreach
        outreach_meeting_booked_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: When a meeting was booked.
          x-group: Outreach
    Meta:
      type: object
      required:
        - api_version
        - data_as_of
        - cache
      properties:
        api_version:
          type: string
          const: '2'
        data_as_of:
          type: string
          format: date-time
          description: >-
            When the data in this response was computed. Responses are cached
            for a few minutes; this tells you how fresh they are.
        cache:
          type: string
          enum:
            - hit
            - miss
            - shared
            - 'off'
          description: >-
            hit = served from cache; miss = computed for this request; shared =
            joined a computation already running for the same query.
    Pagination:
      type: object
      required:
        - total
        - has_more
        - next_cursor
      properties:
        total:
          type: integer
          description: Rows matching the query.
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
          description: Send as cursor to get the next page. Valid for 6 hours.
    Signal:
      type: object
      description: One interaction between a contact and a competitor's employee.
      x-field-groups:
        - Signal
        - Competitor
      properties:
        signal_id:
          type: string
          description: Stable id of this signal. The webhook sends the same id.
          x-group: Signal
        signal_summary:
          type: string
          description: >-
            One sentence: who did what with whom, e.g. "Engaged with a VP of
            Sales at HubSpot".
          x-group: Signal
        signal_post_url:
          type: string
          description: The post the interaction was on, when there is one. Empty otherwise.
          x-group: Signal
        signal_freshness:
          type: string
          x-values:
            - Recent
            - Historic
            - Stale
          description: >-
            Recent: observed since monitoring began. Historic: a relationship
            that existed before monitoring began. Stale: the account's signals
            have aged past your sales cycle.
          x-group: Signal
        signal_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: >-
            When the signal happened. Empty for a Historic signal, whose real
            date is unknown.
          x-group: Signal
        signal_collected_date:
          type: string
          x-format: YYYY-MM-DD, or empty
          description: >-
            When Letterdrop recorded the signal. For a Historic signal this is
            the only date there is.
          x-group: Signal
        competitor_name:
          type: string
          description: The competitor the signal involves.
          x-group: Competitor
        competitor_rep_title:
          type: string
          description: >-
            Job title of the competitor's employee in the signal. Names are not
            published.
          x-group: Competitor
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - invalid_request
                - invalid_json
                - invalid_cursor
                - cursor_expired
                - unauthorized
                - forbidden
                - account_not_found
                - not_found
                - rate_limited
                - internal_error
            message:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  path:
                    type: string
                  message:
                    type: string
              description: 'For invalid_request: one entry per parameter that failed.'
  responses:
    BadRequest:
      description: Malformed request or cursor.
      x-status: 400
      x-codes:
        - invalid_json
        - invalid_cursor
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing or invalid credential.
      x-status: 401
      x-codes:
        - unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The credential lacks the mcp.read scope.
      x-status: 403
      x-codes:
        - forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Gone:
      description: The cursor expired; start the list again.
      x-status: 410
      x-codes:
        - cursor_expired
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unprocessable:
      description: A parameter failed validation; details lists each one.
      x-status: 422
      x-codes:
        - invalid_request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    TooManyRequests:
      description: Rate limited; wait Retry-After seconds.
      x-status: 429
      x-codes:
        - rate_limited
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait.
    ServerError:
      description: Our fault; retry, and contact support if it persists.
      x-status: 500
      x-codes:
        - internal_error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    WorkspaceKey:
      type: apiKey
      in: header
      name: api-key
    BearerAuth:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.