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

# Get contact engagement score

> Returns the contact's current engagement score (0–100) and tier. The score is computed from opens, clicks, and negative signals (bounces, complaints) in the last 90 days. Returns 204 when no send history exists yet.

### Requirements

- **Permission:** `contacts:read`.
- **Project access:** the path project must match the API key's project.
- **HTTP rate limit:** 200 requests per 60 seconds per API key.



## OpenAPI

````yaml /signal/api-reference/openapi.json get /v1/projects/{projectId}/contacts/{contactId}/engagement
openapi: 3.1.0
info:
  title: Apollo Signal API
  version: 1.0.0
  description: >-
    Public REST API for transactional email, contacts, audiences, webhooks,
    metrics, projects, and sending domains.
servers:
  - url: https://api.signal.apollodeploy.com
    description: Production
security: []
tags:
  - name: Emails
    description: Send, inspect, cancel, validate, and stream transactional email activity.
  - name: Metrics
    description: Read project, topic, message, and deliverability analytics.
  - name: Suppressions
    description: Manage addresses that Apollo Signal must not send to.
  - name: Segments
    description: Create dynamic contact groups and inspect their membership.
  - name: Topics
    description: Manage subscription topics and topic membership.
  - name: Contact properties
    description: Define the custom fields available on project contacts.
  - name: Contacts
    description: >-
      Manage contacts, audience membership, images, activity, and engagement
      data.
  - name: Webhooks
    description: Manage webhook endpoints, deliveries, tests, and replays.
  - name: API key usage
    description: Inspect API key metadata and request usage without exposing raw keys.
  - name: Projects
    description: Inspect projects and project-scoped email logs.
  - name: Sending domains
    description: >-
      Register, verify, inspect, and remove sending domains and BIMI
      configuration.
paths:
  /v1/projects/{projectId}/contacts/{contactId}/engagement:
    get:
      tags:
        - Contacts
      summary: Get contact engagement score
      description: >-
        Returns the contact's current engagement score (0–100) and tier. The
        score is computed from opens, clicks, and negative signals (bounces,
        complaints) in the last 90 days. Returns 204 when no send history exists
        yet.


        ### Requirements


        - **Permission:** `contacts:read`.

        - **Project access:** the path project must match the API key's project.

        - **HTTP rate limit:** 200 requests per 60 seconds per API key.
      operationId: getContactEngagementScore
      parameters:
        - name: projectId
          in: path
          required: true
          deprecated: false
          explode: false
          schema:
            type: string
            title: String
          description: >-
            Project identifier. For API-key authentication, it must match the
            project bound to the key.
        - name: contactId
          in: path
          required: true
          deprecated: false
          explode: false
          schema:
            type: string
            title: String
          description: Contact identifier in this project.
      responses:
        '200':
          description: Engagement score and tier.
          headers: {}
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/com.apollodeploy.signal.feature.contact.api.model.EngagementScoreResponse
        '204':
          description: No send history yet.
          headers: {}
        '401':
          headers: {}
          content:
            application/problem+json:
              schema:
                $ref: >-
                  #/components/schemas/com.apollodeploy.commons.core.error.ApiProblem
          description: >-
            The API key or stream token is missing, invalid, expired, or
            inactive.
        '403':
          description: >-
            The credential lacks the required permission or cannot access this
            project.
          headers: {}
          content:
            application/problem+json:
              schema:
                $ref: >-
                  #/components/schemas/com.apollodeploy.commons.core.error.ApiProblem
        '404':
          headers: {}
          content:
            application/problem+json:
              schema:
                $ref: >-
                  #/components/schemas/com.apollodeploy.commons.core.error.ApiProblem
          description: The requested resource was not found in the authenticated project.
        '429':
          description: >-
            The endpoint rate limit was exceeded. Wait for the `Retry-After`
            interval before retrying.
          headers:
            Retry-After:
              description: Whole seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
          content:
            application/problem+json:
              schema:
                $ref: >-
                  #/components/schemas/com.apollodeploy.commons.core.error.ApiProblem
      deprecated: false
      security:
        - bearerAuth: []
      x-codeSamples:
        - lang: TypeScript
          label: TypeScript
          source: >-
            import { createApolloSignalApiClient } from
            "@apollo-deploy/signal-sdk";


            const signal = createApolloSignalApiClient({ apiKey: "ap_signal_..."
            });


            const result = await signal.contacts.getContactEngagementScore(/*
            params */);


            console.log(result);
        - lang: Python
          label: Python
          source: |-
            from apollo_signal import SignalClient

            signal = SignalClient(api_key="ap_signal_...")

            result = signal.contacts.getContactEngagementScore(# params)

            print(result)
        - lang: Go
          label: Go
          source: >-
            import signal "github.com/apollo-deploy/signal-sdk-go"


            client := signal.NewClient("ap_signal_...")


            result, err :=
            client.Contacts.GetContactEngagementScore(context.Background() /*
            params */)

            if err != nil {
                log.Fatal(err)
            }

            fmt.Println(result)
        - lang: Java
          label: Java
          source: >-
            import com.apollodeploy.signal.SignalClient;


            SignalClient signal = new SignalClient("ap_signal_...");


            var result = signal.contacts().getContactEngagementScore(/* params
            */);

            System.out.println(result);
        - lang: Kotlin
          label: Kotlin
          source: |-
            import com.apollodeploy.signal.SignalClient

            val signal = SignalClient("ap_signal_...")

            val result = signal.contacts.getContactEngagementScore(/* params */)
            println(result)
        - lang: Ruby
          label: Ruby
          source: |-
            require "apollo_signal"

            signal = ApolloSignal::Client.new(api_key: "ap_signal_...")

            result = signal.contacts.getContactEngagementScore(# params)
            puts result
        - lang: PHP
          label: PHP
          source: >-
            use ApolloSignal\SignalClient;


            $signal = new SignalClient("ap_signal_...");


            $result = $signal->contacts->getContactEngagementScore(/* params
            */);

            var_dump($result);
        - lang: Rust
          label: Rust
          source: >-
            use apollo_signal::SignalClient;


            let signal = SignalClient::new("ap_signal_...");


            let result = signal.contacts.getContactEngagementScore(/* params
            */).await?;

            println!("{:?}", result);
        - lang: C#
          label: .NET
          source: >-
            using ApolloSignal;


            var signal = new SignalClient("ap_signal_...");


            var result = await signal.Contacts.GetContactEngagementScoreAsync(/*
            params */);

            Console.WriteLine(result);
components:
  schemas:
    com.apollodeploy.signal.feature.contact.api.model.EngagementScoreResponse:
      type: object
      properties:
        object:
          type: string
          title: String
        score:
          type: integer
          format: int32
          title: Int
        scoredAt:
          type: string
          title: String
        tier:
          type: string
          title: String
      required:
        - object
        - score
        - scoredAt
        - tier
      title: EngagementScoreResponse
    com.apollodeploy.commons.core.error.ApiProblem:
      type: object
      properties:
        code:
          type: string
          title: ErrorCode
        detail:
          type: string
          title: String
        errors:
          type: array
          items:
            $ref: >-
              #/components/schemas/com.apollodeploy.commons.core.error.FieldProblem
          title: List<FieldProblem>
        instance:
          type: string
          title: ProblemInstance
        requestId:
          type: string
          title: String
        status:
          type: integer
          format: int32
          title: Int
        title:
          type: string
          title: String
        type:
          type: string
          title: ProblemType
      required:
        - code
        - status
        - title
        - type
      title: ApiProblem
    com.apollodeploy.commons.core.error.FieldProblem:
      type: object
      properties:
        detail:
          type: string
          title: String
        pointer:
          type: string
          title: String
      required:
        - detail
        - pointer
      title: FieldProblem
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Project-bound Apollo Signal API key. Keys begin with `ap_signal_` and
        must carry the permission shown on the operation.

````