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

# Get a contact consent report

> Returns the current read-only consent report for one contact. Requires an authenticated account administrator; the account and contact are resolved within the authenticated account. Ordinary account reads follow the inherited login-block decision, including its open-suspension value and account-status fallback. Authorized own-account read-only staff impersonation may read a suspended account; membership, administrator authorization, and contact scoping still apply. No query parameters change the report. This report does not write consent state and is not proof that sends are enforced against it.



## OpenAPI

````yaml /api-reference/openapi.json get /api/v1/accounts/{account_id}/contacts/{contact_id}/consent
openapi: 3.0.4
info:
  title: Tied API
  description: >-
    The Tied REST API. Three families of endpoint, each with its own credential:
    **Application** for everything inside an account, **Platform** for
    provisioning accounts and users, and **Client** for acting as a contact from
    your own surface.
  version: 1.1.0
  termsOfService: https://tied.com/legal
  contact:
    email: hello@tied.com
  license:
    name: MIT License
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://app.tied.com
    description: Tied cloud
security: []
tags:
  - name: Account AgentBots
    description: Account-specific Agent Bots
  - name: Agents
    description: Agent management APIs
  - name: Canned Responses
    description: Pre-defined responses for common queries
  - name: Contacts
    description: Contact management APIs
  - name: Contact Labels
    description: Manage contact labels
  - name: Conversation Assignments
    description: Manage conversation assignments
  - name: Conversation Labels
    description: Manage conversation labels
  - name: Conversations
    description: Conversation management APIs
  - name: Custom Attributes
    description: Custom fields for contacts and conversations
  - name: Custom Filters
    description: Saved filters for conversations
  - name: Inboxes
    description: Communication channels setup
  - name: Integrations
    description: Third-party integrations
  - name: Messages
    description: Message management APIs
  - name: Profile
    description: User profile APIs
  - name: Reports
    description: Analytics and reporting APIs
  - name: Teams
    description: Team management APIs
  - name: Webhooks
    description: Event notification webhooks
  - name: Automation Rule
    description: Workflow automation rules
  - name: Help Center
    description: Knowledge base management
  - name: Contacts API
    description: Public contact APIs
  - name: Conversations API
    description: Public conversation APIs
  - name: Messages API
    description: Public message APIs
  - name: CSAT Survey Page
    description: Customer satisfaction survey
  - name: Account
    description: >-
      The authenticated user's own account — read and update account settings.
      Distinct from the Platform family's **Accounts**, which provisions
      accounts across an installation.
  - name: Audit Logs
    description: Read the account's audit trail
  - name: Inbox API
    description: Public inbox lookup by channel identifier
  - name: Labels
    description: >-
      Create and manage the account's labels. Applying one to a conversation or
      contact is a separate endpoint under those resources.
  - name: Macros
    description: >-
      Saved multi-step actions an agent — or an integration — can run against
      one or more conversations.
  - name: Campaigns
    description: Ongoing website campaigns and one-off SMS and WhatsApp sends.
  - name: Contact Notes
    description: Internal notes on a contact. Never visible to the contact.
  - name: Help Center Categories
    description: Categories group a portal's articles, one tree per allowed locale.
  - name: Help Center Articles
    description: The articles a portal publishes, and their draft and archived states.
  - name: Summary Reports
    description: Per-agent, per-team, per-inbox and per-label totals for a period, as JSON.
  - name: Live Reports
    description: Right-now queue counts. No date range — these describe the present.
  - name: CSAT
    description: >-
      The satisfaction ratings contacts have submitted, and the metrics computed
      from them.
  - name: Notifications
    description: >-
      The per-user notification feed, its read and snooze state, and the
      settings that decide what lands in it.
  - name: Conversation Participants
    description: >-
      The agents watching a conversation. Participants get notified about it
      without being assigned to it.
  - name: Draft Messages
    description: >-
      The unsent reply held for a conversation. Stored in Redis, one per
      conversation.
  - name: Search
    description: >-
      One search service across conversations, contacts, messages and Help
      Center articles.
  - name: Dashboard Apps
    description: Embedded pages that appear as a tab beside a conversation.
  - name: Assignment Policies
    description: How conversations are handed out, and which inbox uses which policy.
  - name: Files
    description: Storing a file so another endpoint can attach it.
  - name: Bot Flows
    description: >-
      Scripted conversation flows, their versions, and the publish and rollback
      that move between them.
  - name: Billing
    description: >-
      Credit balance, usage, invoices, spend controls and the provider-hosted
      payment flows.
  - name: AMB Templates
    description: >-
      Saved Apple Messages primitive payloads an agent can reuse from the
      composer.
  - name: AMB Onboarding
    description: The in-flight Apple Messages for Business registration for an account.
  - name: Widget Session
    description: Starting a widget session and reading the visitor it belongs to.
  - name: Widget Conversation
    description: The visitor's conversation and its messages.
  - name: Widget Context
    description: Campaigns, agents, labels, events and uploads for a widget session.
  - name: CSAT Survey
    description: The public, unauthenticated survey a contact answers from a link.
  - name: Workspace
    description: Scheduling and cancelling deletion of the whole workspace.
  - name: Widget Integrations
    description: Provider actions available to a visitor session in its own conversation.
  - name: Orchestration Studio
    description: >-
      Administrator-only read APIs for Orchestration Studio cases and knowledge
      sources.
  - name: Topic Analytics
    description: Account Topics readiness, labeling health and usage aggregates.
  - name: Analytics V2
    description: >-
      Account-scoped metrics, anonymized benchmarks and audited conversation
      drilldown.
  - name: Knowledge proposals
    description: Administrator-only proposal review and revision decisions.
  - name: Model settings
    description: Administrator-only routing profiles and Tied-hosted catalogue.
  - name: Quality Review
    description: Current quality review queue metadata and manual work state.
paths:
  /api/v1/accounts/{account_id}/contacts/{contact_id}/consent:
    get:
      tags:
        - Contacts
      summary: Get a contact consent report
      description: >-
        Returns the current read-only consent report for one contact. Requires
        an authenticated account administrator; the account and contact are
        resolved within the authenticated account. Ordinary account reads follow
        the inherited login-block decision, including its open-suspension value
        and account-status fallback. Authorized own-account read-only staff
        impersonation may read a suspended account; membership, administrator
        authorization, and contact scoping still apply. No query parameters
        change the report. This report does not write consent state and is not
        proof that sends are enforced against it.
      operationId: get_contact_consent_report
      parameters:
        - name: account_id
          in: path
          required: true
          schema:
            type: integer
          description: Account containing the authenticated administrator and contact.
        - name: contact_id
          in: path
          required: true
          schema:
            type: integer
          description: Contact ID scoped through the authenticated account.
      responses:
        '200':
          description: >-
            Current report. Empty inboxes mean no ledger events, not proof of
            consent or that sends are allowed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/contact_consent_report'
              examples:
                empty:
                  summary: 'Actual synthetic response: empty'
                  value:
                    contact_id: 50
                    generated_at: '2026-10-22T16:59:53.674Z'
                    history_limit: 100
                    merged_contact_ids: []
                    legacy_opt_outs:
                      amb: []
                      rcs: []
                    inboxes: []
                populated:
                  summary: 'Actual synthetic response: populated'
                  value:
                    contact_id: 51
                    generated_at: '2026-10-22T16:59:56.576Z'
                    history_limit: 100
                    merged_contact_ids:
                      - 53
                    legacy_opt_outs:
                      amb: []
                      rcs: []
                    inboxes:
                      - inbox_id: 12
                        channel: Channel::Amb
                        purposes:
                          - purpose: marketing
                            state_now:
                              allowed: false
                              reason: opted_out
                            evidence_event_id: 216
                            evidence_event:
                              id: 216
                              captured_contact_id: 53
                              state: opted_out
                              purpose: marketing
                              mechanism: sms_keyword_opt_out
                              actor_type: contact
                              actor_id: null
                              surface: null
                              effective_at: '2026-09-12T17:59:56.000Z'
                              recorded_at: '2026-10-22T16:59:56.240Z'
                              source_ref: null
                              conversation_id: null
                              source_message_id: null
                              evidence: {}
                            truncated: false
                            history:
                              - id: 215
                                captured_contact_id: 51
                                state: opted_in
                                purpose: marketing
                                mechanism: web_form
                                actor_type: contact
                                actor_id: null
                                surface: null
                                effective_at: '2026-10-24T16:59:56.211Z'
                                recorded_at: '2026-10-22T16:59:56.212Z'
                                source_ref: null
                                conversation_id: null
                                source_message_id: null
                                evidence: {}
                              - id: 216
                                captured_contact_id: 53
                                state: opted_out
                                purpose: marketing
                                mechanism: sms_keyword_opt_out
                                actor_type: contact
                                actor_id: null
                                surface: null
                                effective_at: '2026-09-12T17:59:56.000Z'
                                recorded_at: '2026-10-22T16:59:56.240Z'
                                source_ref: null
                                conversation_id: null
                                source_message_id: null
                                evidence: {}
                              - id: 214
                                captured_contact_id: 51
                                state: opted_in
                                purpose: marketing
                                mechanism: import
                                actor_type: import
                                actor_id: '42'
                                surface: null
                                effective_at: '2026-09-12T17:29:56.000Z'
                                recorded_at: '2026-10-22T16:59:56.176Z'
                                source_ref: synthetic-import
                                conversation_id: null
                                source_message_id: null
                                evidence: {}
                                voided: true
                              - id: 213
                                captured_contact_id: 51
                                state: opted_in
                                purpose: marketing
                                mechanism: web_form
                                actor_type: contact
                                actor_id: '42'
                                surface: web
                                effective_at: '2026-09-12T16:59:56.000Z'
                                recorded_at: '2026-10-22T16:59:56.165Z'
                                source_ref: synthetic-signup
                                conversation_id: 4
                                source_message_id: 11
                                evidence:
                                  disclosure_version: v1
                                  form_ref: form/example
                          - purpose: transactional
                            state_now:
                              allowed: false
                              reason: carrier_stop
                            evidence_event_id: 216
                            evidence_event:
                              id: 216
                              captured_contact_id: 53
                              state: opted_out
                              purpose: marketing
                              mechanism: sms_keyword_opt_out
                              actor_type: contact
                              actor_id: null
                              surface: null
                              effective_at: '2026-09-12T17:59:56.000Z'
                              recorded_at: '2026-10-22T16:59:56.240Z'
                              source_ref: null
                              conversation_id: null
                              source_message_id: null
                              evidence: {}
                            truncated: false
                            history: []
                legacy-only:
                  summary: 'Actual synthetic response: legacy only'
                  value:
                    contact_id: 56
                    generated_at: '2026-10-22T16:59:59.267Z'
                    history_limit: 100
                    merged_contact_ids: []
                    legacy_opt_outs:
                      amb:
                        - 15
                      rcs:
                        - 16
                    inboxes: []
        '400':
          description: Conflicting credential methods were supplied.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/orchestration_studio_credential_conflict'
              examples:
                multiple-credentials:
                  summary: 'Actual synthetic response: multiple credentials'
                  value:
                    error:
                      code: multiple_credentials
        '401':
          description: >-
            Authentication failed, the inherited account login-block decision
            refused access, or an impersonation session ended.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/account_api_unauthorized'
              examples:
                unauthenticated:
                  summary: 'Actual synthetic response: unauthenticated'
                  value:
                    errors:
                      - You need to sign in or sign up before continuing.
                impersonation-ended:
                  summary: 'Actual synthetic response: impersonation ended'
                  value:
                    error:
                      code: impersonation_ended
        '403':
          description: >-
            The user lacks the account administrator role or impersonation
            access is refused.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/studio_quality_authorization_error'
              examples:
                agent:
                  summary: 'Actual synthetic response: agent'
                  value:
                    error: You are not authorized to do this action
                impersonation-wrong-account:
                  summary: 'Actual synthetic response: impersonation wrong account'
                  value:
                    error:
                      code: impersonation_wrong_account
        '404':
          description: Contact is not found within the authenticated account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_message'
              examples:
                foreign-contact:
                  summary: 'Actual synthetic response: foreign contact'
                  value:
                    error: Resource could not be found
      security:
        - userApiKey: []
components:
  schemas:
    contact_consent_report:
      type: object
      additionalProperties: false
      description: Current output of Consent::Report for one account-owned contact.
      required:
        - contact_id
        - generated_at
        - history_limit
        - merged_contact_ids
        - legacy_opt_outs
        - inboxes
      properties:
        contact_id:
          type: integer
          description: Account-owned contact identifier.
        generated_at:
          type: string
          format: date-time
          description: UTC time at which the report policy answers were evaluated.
        history_limit:
          type: integer
          description: >-
            Current maximum number of newest history events returned per inbox
            and purpose.
          enum:
            - 100
        merged_contact_ids:
          type: array
          items:
            type: integer
          description: >-
            Original contact IDs represented by ledger events moved into this
            contact.
        legacy_opt_outs:
          $ref: '#/components/schemas/contact_consent_legacy_opt_outs'
          description: Opt-out IDs from the existing AMB and RCS legacy readers.
        inboxes:
          type: array
          items:
            $ref: '#/components/schemas/contact_consent_inbox'
          description: Inboxes with at least one ledger event for this contact.
    orchestration_studio_credential_conflict:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - multiple_credentials
              description: Conflicting credential types were supplied.
          required:
            - code
          description: The authentication error.
      required:
        - error
    account_api_unauthorized:
      description: >-
        Unauthenticated and ended-impersonation response shapes from inherited
        account API guards.
      oneOf:
        - $ref: '#/components/schemas/error_unauthenticated'
        - $ref: '#/components/schemas/studio_quality_error'
        - $ref: '#/components/schemas/impersonation_ended_error'
    studio_quality_authorization_error:
      description: Ordinary role refusal or structured inherited impersonation refusal.
      oneOf:
        - $ref: '#/components/schemas/studio_quality_error'
        - $ref: '#/components/schemas/impersonation_forbidden_error'
    error_message:
      type: object
      description: >-
        The shape returned by `render_unauthorized`, `render_not_found_error`
        and `render_could_not_create_error`.
      properties:
        error:
          type: string
          description: A single human-readable message.
          example: Resource could not be found
      required:
        - error
    contact_consent_legacy_opt_outs:
      type: object
      additionalProperties: false
      required:
        - amb
        - rcs
      description: Legacy opt-out readers by AMB and RCS inbox. There is no SMS key.
      properties:
        amb:
          type: array
          items:
            type: integer
          description: AMB inbox IDs whose legacy reader reports an opt-out.
        rcs:
          type: array
          items:
            type: integer
          description: RCS inbox IDs whose legacy reader reports an opt-out.
    contact_consent_inbox:
      type: object
      additionalProperties: false
      required:
        - inbox_id
        - channel
        - purposes
      properties:
        inbox_id:
          type: integer
          description: Inbox identifier scoped to the account.
        channel:
          type: string
          description: Runtime channel class for this inbox.
        purposes:
          type: array
          items:
            $ref: '#/components/schemas/contact_consent_purpose'
          description: Both purpose policy entries for this inbox.
          minItems: 2
          maxItems: 2
    error_unauthenticated:
      type: object
      description: >-
        Returned by Devise when the `api_access_token` header is absent
        entirely, before the token check runs. Note `errors` holds plain
        strings, not objects.
      properties:
        errors:
          type: array
          items:
            type: string
          example:
            - You need to sign in or sign up before continuing.
          description: >-
            One or more messages explaining why the request was not
            authenticated.
      required:
        - errors
    studio_quality_error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Error message or refusal code returned by the controller.
      additionalProperties: false
    impersonation_ended_error:
      type: object
      required:
        - error
      additionalProperties: false
      description: Structured 401 refusal returned for an ended impersonation session.
      properties:
        error:
          type: object
          required:
            - code
          additionalProperties: false
          description: Structured inherited impersonation refusal details.
          properties:
            code:
              type: string
              enum:
                - impersonation_ended
              description: Current impersonation refusal code.
    impersonation_forbidden_error:
      type: object
      required:
        - error
      additionalProperties: false
      description: >-
        Structured 403 refusal returned by the inherited account API
        impersonation guard.
      properties:
        error:
          type: object
          required:
            - code
          additionalProperties: false
          description: Structured inherited impersonation refusal details.
          properties:
            code:
              type: string
              enum:
                - impersonation_read_only
                - impersonation_wrong_account
                - impersonation_blocked_action
              description: Current impersonation refusal code.
    contact_consent_purpose:
      type: object
      additionalProperties: false
      required:
        - purpose
        - state_now
        - evidence_event_id
        - evidence_event
        - truncated
        - history
      properties:
        purpose:
          type: string
          description: Consent purpose evaluated by the existing policy.
          enum:
            - marketing
            - transactional
        state_now:
          $ref: '#/components/schemas/contact_consent_state_now'
          description: Existing consent ledger policy answer at generated_at.
        evidence_event_id:
          type: integer
          nullable: true
          description: ID of the ledger event cited by the policy answer, or null.
        evidence_event:
          $ref: '#/components/schemas/contact_consent_nullable_event'
          description: >-
            The deciding event, loaded independently of the bounded history, or
            null when no ledger event decides.
        truncated:
          type: boolean
          description: Whether this purpose has more events than the returned history.
        history:
          type: array
          items:
            $ref: '#/components/schemas/contact_consent_event'
          description: Newest-first events, bounded to the current history limit of 100.
          maxItems: 100
    contact_consent_state_now:
      type: object
      additionalProperties: false
      required:
        - allowed
        - reason
      description: >-
        Existing ledger policy answer, not a guarantee that all send paths
        enforce it.
      properties:
        allowed:
          type: boolean
          description: Boolean returned by the existing ledger policy.
        reason:
          type: string
          description: Current policy reason; runtime policy can add values.
    contact_consent_nullable_event:
      type: object
      additionalProperties: false
      required:
        - id
        - captured_contact_id
        - state
        - purpose
        - mechanism
        - actor_type
        - actor_id
        - surface
        - effective_at
        - recorded_at
        - source_ref
        - conversation_id
        - source_message_id
        - evidence
      description: >-
        Ledger event. The optional voided key appears only when true; evidence
        exposes only string values of the allowlisted keys.
      properties:
        id:
          type: integer
          description: Ledger event identifier.
        captured_contact_id:
          type: integer
          description: >-
            Contact ID that was the original subject when this event was
            captured.
        state:
          type: string
          description: Recorded event state.
        purpose:
          type: string
          description: Purpose attached to this event.
        mechanism:
          type: string
          description: Runtime mechanism recorded for this event.
        actor_type:
          type: string
          description: Runtime actor type recorded for this event.
        actor_id:
          type: string
          nullable: true
          description: Nullable actor identifier.
        surface:
          type: string
          nullable: true
          description: Nullable source surface.
        effective_at:
          type: string
          format: date-time
          description: UTC time the event is effective.
        recorded_at:
          type: string
          format: date-time
          description: UTC time the event was stored.
        source_ref:
          type: string
          nullable: true
          description: Nullable source reference.
        conversation_id:
          type: integer
          nullable: true
          description: Nullable conversation identifier.
        source_message_id:
          type: integer
          nullable: true
          description: Nullable source message identifier.
        evidence:
          $ref: '#/components/schemas/contact_consent_evidence'
          description: Allowlisted string-valued evidence identifiers.
        voided:
          type: boolean
          enum:
            - true
          description: Included only as true when the event has a void row.
      nullable: true
    contact_consent_event:
      type: object
      additionalProperties: false
      required:
        - id
        - captured_contact_id
        - state
        - purpose
        - mechanism
        - actor_type
        - actor_id
        - surface
        - effective_at
        - recorded_at
        - source_ref
        - conversation_id
        - source_message_id
        - evidence
      description: >-
        Ledger event. The optional voided key appears only when true; evidence
        exposes only string values of the allowlisted keys.
      properties:
        id:
          type: integer
          description: Ledger event identifier.
        captured_contact_id:
          type: integer
          description: >-
            Contact ID that was the original subject when this event was
            captured.
        state:
          type: string
          description: Recorded event state.
        purpose:
          type: string
          description: Purpose attached to this event.
        mechanism:
          type: string
          description: Runtime mechanism recorded for this event.
        actor_type:
          type: string
          description: Runtime actor type recorded for this event.
        actor_id:
          type: string
          nullable: true
          description: Nullable actor identifier.
        surface:
          type: string
          nullable: true
          description: Nullable source surface.
        effective_at:
          type: string
          format: date-time
          description: UTC time the event is effective.
        recorded_at:
          type: string
          format: date-time
          description: UTC time the event was stored.
        source_ref:
          type: string
          nullable: true
          description: Nullable source reference.
        conversation_id:
          type: integer
          nullable: true
          description: Nullable conversation identifier.
        source_message_id:
          type: integer
          nullable: true
          description: Nullable source message identifier.
        evidence:
          $ref: '#/components/schemas/contact_consent_evidence'
          description: Allowlisted string-valued evidence identifiers.
        voided:
          type: boolean
          enum:
            - true
          description: Included only as true when the event has a void row.
    contact_consent_evidence:
      type: object
      additionalProperties: false
      description: >-
        Only string-valued disclosure_version, disclosure_sha256, and form_ref
        are returned; text and other stored keys are omitted.
      properties:
        disclosure_version:
          type: string
          description: String disclosure version, when stored.
        disclosure_sha256:
          type: string
          description: String disclosure digest, when stored.
        form_ref:
          type: string
          description: String form reference, when stored.
  securitySchemes:
    userApiKey:
      type: apiKey
      in: header
      name: api_access_token
      description: >-
        This token can be obtained by visiting the profile page or via rails
        console. Provides access to  endpoints based on the user permissions
        levels. This token can be saved by an external system when user is
        created via API, to perform activities on behalf of the user.

````

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