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

# Look Up a Contact by Email

> Find a contact by email address instead of by id

Returns the contact holding an email address, if that contact is scoped to your organization.

Matching is case-insensitive, because contact email is stored normalised. `Example@Test.com` and `example@test.com` are the same address.

<Warning>
  An address that exists on Turris but belongs to another agency returns **404**, exactly as an unknown address does. This endpoint cannot be used to test whether an address is known to the platform.
</Warning>


## OpenAPI

````yaml openapi/v2.json GET /v2/downstream/contacts/by-email
openapi: 3.0.0
info:
  title: Turris Public API
  description: API for managing insurance compliance data
  version: 2.0.0
  contact: {}
servers:
  - url: https://public.api.live.turrisfi.com
    description: Production
  - url: https://public.api.sandbox.turrisfi.com
    description: Sandbox
security: []
tags: []
paths:
  /v2/downstream/contacts/by-email:
    get:
      tags:
        - downstream/contacts
      summary: Look up a contact by email
      description: >-
        Returns the single contact in your organization with this email address.
        Email addresses are unique across the whole platform, so an address
        belonging to another agency exists but is not yours: that returns 404,
        exactly as an unknown address does.
      operationId: ContactsController_getContactByEmail_v2
      parameters:
        - name: email
          required: true
          in: query
          description: >-
            The email address to look up. Matching is case-insensitive. Returns
            404 when no contact in your organization has this address, including
            when the address belongs to another agency.
          schema:
            example: example@test.com
            type: string
      responses:
        '200':
          description: Contact details
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/DownstreamContactResponse'
                  requestId:
                    type: string
                    description: Unique request identifier
                    example: dev-2c5e7cf2-9acf-4c8c-ab2f-b81f39d775a8
                  timestamp:
                    type: string
                    description: Response timestamp
                    example: '2025-11-12T20:49:03.293Z'
                required:
                  - data
                  - requestId
                  - timestamp
        '400':
          description: Missing or malformed email address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '401':
          description: Invalid or missing auth token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '403':
          description: Your organization is not entitled to the public API
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '404':
          description: Contact not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
components:
  schemas:
    DownstreamContactResponse:
      type: object
      properties:
        contactId:
          type: string
          description: Unique identifier of the contact
          example: 6627f2b5c2e0a51b8c0d4e7c
        firstName:
          type: string
          description: Given name
          example: Jon
        lastName:
          type: string
          description: Surname
          example: Doe
        email:
          type: string
          description: Email address
          example: example@test.com
        isDeliverable:
          type: boolean
          description: Whether the email address is deliverable
          example: true
        scopes:
          description: >-
            The scopes inside your organization. Scopes belonging to other
            agencies are not returned.
          type: array
          items:
            $ref: '#/components/schemas/DownstreamContactScopeResponse'
        createdAt:
          type: string
          description: ISO 8601 creation timestamp
          example: '2025-01-15T10:30:00.000Z'
        updatedAt:
          type: string
          description: ISO 8601 last-update timestamp
          example: '2025-06-02T08:12:44.000Z'
      required:
        - contactId
        - firstName
        - lastName
        - email
        - isDeliverable
        - scopes
    ErrorResponseDto:
      type: object
      properties:
        statusCode:
          type: number
          description: HTTP status code
        requestId:
          type: string
          description: Unique request identifier for debugging
        errorType:
          type: string
          description: >-
            Machine-readable error classification. Branch on this rather than on
            `errorMessage`, which is prose and may change. Authentication
            failures returned by our identity provider are forwarded verbatim,
            so a 401 can carry a code outside this list; treat an unrecognised
            value as a generic failure of its HTTP status.
          enum:
            - conflict
            - contact_not_authorized
            - document_exceeds_page_limit
            - downstream_entity_member_exists
            - duplicate_external_id_error
            - duplicate_member_email
            - duplicate_producer_code_error
            - forbidden
            - gateway_timeout
            - inactive_email
            - internal_server_error
            - invalid_email
            - invalid_email_for_invites
            - invalid_organization_category
            - invalid_organization_slug
            - invalid_phone_number
            - invalid_token
            - invite_limit_reached
            - jwt_invalid
            - m2m_client_not_found
            - not_found
            - organization_already_exists
            - organization_slug_already_used
            - payment_required
            - producer_agreement_required
            - product_feature_subscription_required
            - service_unavailable
            - session_authorization_error
            - some_custom_error_string
            - throttled
            - too_many_requests
            - unauthorized
            - unauthorized_client
            - unexpected_400_stytch_error
            - unexpected_403_stytch_error
            - unexpected_404_stytch_error
            - unexpected_error
            - unexpected_stytch_error
            - unprocessable_entity
            - validation_error
          example: validation_error
        errorMessage:
          description: Array of error messages
          type: array
          items:
            type: string
        timestamp:
          type: string
          description: ISO timestamp when the error occurred
        details:
          type: object
          description: Additional error context
      required:
        - statusCode
        - requestId
        - errorType
        - errorMessage
        - timestamp
    DownstreamContactScopeResponse:
      type: object
      properties:
        downstreamEntityId:
          type: string
          description: The entity this scope belongs to
          example: 6610b3d2c2e0a51b8c0d1f02
        upstreamDownstreamAssociationId:
          type: string
          description: >-
            The market relationship this scope is confined to. Absent means the
            contact is visible to every market that entity deals with, which is
            how agency-created contacts are stored.
          example: 6627f1a9c2e0a51b8c0d4e3a
        businessRoles:
          type: array
          description: Business roles this contact holds under this scope
          example:
            - Finance Manager
          items:
            type: string
            enum:
              - Compliance Officer
              - Principal Owner
              - Account Manager
              - Finance Manager
              - Support Staff
              - Contract Signatory
              - Accounts Payable
              - Policy Maintenance
        isPrimary:
          type: boolean
          description: Whether this contact is a primary contact under this scope
          example: true
      required:
        - downstreamEntityId
        - businessRoles
        - isPrimary

````

## Related topics

- [Validate NPNs](/api-reference/v1/tools/validate-npns.md)
- [Changelog](/changelog.md)
- [Compliance Data Synchronized](/guides/webhooks/compliance-data-synchronized.md)
