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

# Read a donor unified interaction timeline

> Requires current donor visibility. Email/calendar and manual sections are enabled independently by their flags; imported CRM relationship activities remain available. Legacy and connected-source email rows retain metadata under their current body policy. Legacy local_body/snippet can be null and can_view_body false when current mailbox, program or owner access does not permit reading the body. Authorized message-center legacy rows can resolve the original message body even after it was scrubbed from the activity log. Returns up to ten upcoming calendar events plus recent events, at most 25 combined. Email filters do not filter the separate manual/CRM pagination.



## OpenAPI

````yaml get /donors/{donor_id}/interactions
openapi: 3.0.0
info:
  title: Gratona API
  description: >-
    REST API for the Gratona fundraising platform, including donor, donation,
    sponsorship, program, event, and integration workflows. Endpoints are
    organized by tag. Most endpoints require either a Passport bearer token or
    an issued API key — see the Security Schemes section.
  contact:
    name: Gratona Engineering
    url: https://gratona.com
    email: devs@gratona.com
  version: 1.0.0
servers:
  - url: https://api.gratona.com/v1
    description: Server Version 1.0.0
security: []
tags:
  - name: Auth
    description: >-
      Login, signup, logout, password reset, and email verification for admin
      users and donors.
  - name: Donors
    description: >-
      Donor records: CRUD, profile fields, household linkage, search, filters,
      merge, and duplicate detection.
  - name: Donations
    description: >-
      Individual donation records, recurring commitments, soft credits, refunds,
      designations, and exports.
  - name: Sponsorships
    description: >-
      Donor-to-entity commitment relationships, lifecycle transitions, and
      commitment-specific filters.
  - name: Entities
    description: >-
      Recipient records (children, families, projects, animals, etc.), their
      status, and entity-level fields.
  - name: Programs
    description: >-
      Program / campaign configuration: hierarchy, settings, and program-level
      metadata.
  - name: Forms
    description: >-
      Custom form builder (HysForm), form fields, standardized donor fields, and
      field migrations.
  - name: Trips
    description: >-
      Mission-trip management: trips, participants, budgets, tasks,
      e-signatures, fundraising milestones, and background checks.
  - name: Communications
    description: >-
      Email templates, SMS, newsletters, donor email manager, and per-donor
      notes.
  - name: Payments
    description: >-
      Payment-gateway management (Stripe, PayPal, Flutterwave, QuickBooks).
      Excludes inbound webhooks — see the Webhooks tag.
  - name: Reports
    description: Dashboards, analytics, scheduled reports, and exports.
  - name: Admin
    description: >-
      Client-account administration: users, groups/permissions, settings,
      integrations, and account lifecycle.
  - name: Donor Portal
    description: >-
      Endpoints consumed by the donor-facing portal (donor login, dashboard,
      donation history, messages).
  - name: Recipient Portal
    description: Endpoints consumed by the recipient-facing portal.
  - name: Public
    description: >-
      Unauthenticated public endpoints: donor signup, public trip pages,
      peer-to-peer campaigns, public checkout.
  - name: Webhooks
    description: >-
      Inbound webhooks from third parties (Stripe, PayPal, Flutterwave, Checkr,
      DropboxSign). Annotated minimally for reference; payload shapes are owned
      by the upstream provider.
  - name: Events
    description: >-
      Event setup, invitations, registration, ticketing, attendance and event
      reporting.
  - name: Journeys
    description: >-
      Journey graphs, activation, enrollment, message templates and event
      follow-up automations.
  - name: Tasks
    description: Workspace tasks, assignments, saved task views and record collaboration.
  - name: Fundraising
    description: >-
      Fundraising portfolios, stewardship plans, giving anniversaries and
      personal donor follow-up.
  - name: Impact Stories
    description: Story intake, review, assets, consent and publication workflows.
  - name: Integrations
    description: Workspace integration connections, mappings, synchronization and recovery.
  - name: Email Calendar
    description: Connected email/calendar accounts and donor interactions.
  - name: Spaces
    description: Workspace Spaces and collaborative Pages.
  - name: Library
    description: Workspace documents, source connections, files and analysis.
  - name: Intelligence
    description: Donor intelligence and Tali workspace workflows.
  - name: Automation
    description: >-
      V3 automation primitive discovery, input validation, invocation and Zapier
      contracts.
  - name: Schema
    description: V3 model, enum, capability and scope discovery.
  - name: Zapier
    description: Zapier automation connections, polling feeds and actions.
  - name: Files
    description: Files
  - name: Client
    description: Client
  - name: Payment Gateways
    description: Payment Gateways
  - name: Email Settings
    description: Email Settings
  - name: Admin Dashboard
    description: Admin Dashboard
  - name: Recipients
    description: Recipients
  - name: Historical Archived Updates
    description: Historical Archived Updates
  - name: Team & access
    description: Team & access
  - name: Settings
    description: Settings
  - name: Notifications
    description: Notifications
  - name: Participation
    description: Participation
  - name: Users
    description: Users
  - name: Wrapped
    description: Wrapped
  - name: Donor SignUp
    description: Donor SignUp
  - name: Frontend
    description: Frontend
  - name: User
    description: User
  - name: Workspace
    description: Workspace
paths:
  /donors/{donor_id}/interactions:
    get:
      tags:
        - Email Calendar
      summary: Read a donor unified interaction timeline
      description: >-
        Requires current donor visibility. Email/calendar and manual sections
        are enabled independently by their flags; imported CRM relationship
        activities remain available. Legacy and connected-source email rows
        retain metadata under their current body policy. Legacy
        local_body/snippet can be null and can_view_body false when current
        mailbox, program or owner access does not permit reading the body.
        Authorized message-center legacy rows can resolve the original message
        body even after it was scrubbed from the activity log. Returns up to ten
        upcoming calendar events plus recent events, at most 25 combined. Email
        filters do not filter the separate manual/CRM pagination.
      operationId: docEmailCalendarAdminDonorInteractionsGET
      parameters:
        - name: donor_id
          in: path
          description: Donor id.
          required: true
          schema:
            type: integer
          example: 123
        - name: page
          in: query
          description: Page.
          required: false
          schema:
            type: integer
            minimum: 1
          example: 1
        - name: per_page
          in: query
          description: Per page.
          required: false
          schema:
            type: integer
            default: 25
            maximum: 50
            minimum: 1
          example: 25
        - name: manual_page
          in: query
          description: Manual page.
          required: false
          schema:
            type: integer
            minimum: 1
          example: 1
        - name: manual_per_page
          in: query
          description: Manual per page.
          required: false
          schema:
            type: integer
            default: 50
            maximum: 50
            minimum: 1
          example: 50
        - name: search
          in: query
          description: Search.
          required: false
          schema:
            type: string
          example: Meeting
        - name: direction
          in: query
          description: Direction.
          required: false
          schema:
            type: string
            enum:
              - all
              - sent
              - outbound
              - received
              - inbound
          example: all
        - name: source
          in: query
          description: all, google, microsoft, bcc, system or a source substring.
          required: false
          schema:
            type: string
          example: google
        - name: visibility
          in: query
          description: Visibility.
          required: false
          schema:
            type: string
            enum:
              - all
              - shared
              - private
              - team
              - metadata
          example: all
        - name: owner_user_id
          in: query
          description: Owner user id.
          required: false
          schema:
            oneOf:
              - type: integer
              - type: string
                enum:
                  - all
          example: all
        - name: account_id
          in: query
          description: Account id.
          required: false
          schema:
            oneOf:
              - type: integer
              - type: string
                enum:
                  - all
          example: all
        - name: attachments
          in: query
          description: Attachments.
          required: false
          schema:
            type: string
            enum:
              - all
              - with
              - without
          example: with
        - name: subtype
          in: query
          description: Subtype.
          required: false
          schema:
            type: string
          example: all
      responses:
        '200':
          description: Read a donor unified interaction timeline response.
          content:
            application/json:
              schema:
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/CalendarEmailInteractionDoc'
                  manual_interactions:
                    type: array
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/CalendarManualInteractionDoc'
                        - $ref: '#/components/schemas/CalendarCrmInteractionDoc'
                  relationship_activities:
                    type: array
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/CalendarManualInteractionDoc'
                        - $ref: '#/components/schemas/CalendarCrmInteractionDoc'
                  manual_pagination:
                    properties:
                      current_page:
                        type: integer
                      last_page:
                        type: integer
                      per_page:
                        type: integer
                      total:
                        type: integer
                    type: object
                  calendar_events:
                    type: array
                    items:
                      $ref: '#/components/schemas/CalendarProviderEventDoc'
                  rollup:
                    properties:
                      last_interaction_at:
                        type: string
                        format: date-time
                        nullable: true
                      last_email_at:
                        type: string
                        format: date-time
                        nullable: true
                      last_meeting_at:
                        type: string
                        format: date-time
                        nullable: true
                      next_meeting_at:
                        type: string
                        format: date-time
                        nullable: true
                      relationship_owner_user_id:
                        type: integer
                        nullable: true
                      unanswered_inbound_count:
                        type: integer
                    type: object
                    nullable: true
                  pagination:
                    properties:
                      current_page:
                        type: integer
                      last_page:
                        type: integer
                      per_page:
                        type: integer
                      total:
                        type: integer
                    type: object
                  filters:
                    properties:
                      accounts:
                        type: array
                        items:
                          properties:
                            id:
                              type: integer
                            total:
                              type: integer
                          type: object
                      owners:
                        type: array
                        items:
                          properties:
                            id:
                              type: integer
                            label:
                              type: string
                            total:
                              type: integer
                          type: object
                      attachment_count:
                        type: integer
                    type: object
                type: object
        '401':
          description: Missing or invalid bearer token or API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
        '403':
          description: >-
            The caller lacks the required permission, resource access or feature
            availability.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >-
            The organization-owned resource or parent was not found or is not
            available for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundResponse'
      security:
        - bearerAuth: []
        - apiKeyAuth: []
components:
  schemas:
    CalendarEmailInteractionDoc:
      properties:
        local_body:
          description: >-
            Legacy email body disclosed under current mailbox/program/owner
            access; null when unavailable or not permitted.
          type: string
          nullable: true
        delivery_state:
          description: Legacy email delivery state derived from the recorded action.
          type: string
        legacy_action:
          description: Original action for a legacy activity-log email row.
          type: string
        kind:
          type: string
        type:
          type: string
        client_id:
          type: integer
        donor_id:
          type: integer
          nullable: true
        email_calendar_account_id:
          type: integer
          nullable: true
        account_email:
          type: string
          nullable: true
        account_provider:
          type: string
          nullable: true
        owner_user_id:
          type: integer
          nullable: true
        owner_name:
          type: string
          nullable: true
        source:
          type: string
        subject:
          type: string
          nullable: true
        from_address:
          type: string
          nullable: true
        email_direction:
          type: string
          nullable: true
        body_visibility:
          type: string
          nullable: true
        match_status:
          type: string
          nullable: true
        matched_by:
          type: string
          nullable: true
        matched_email:
          type: string
          nullable: true
        classification_class:
          type: string
          nullable: true
        metadata_visibility:
          type: string
        occurred_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
          nullable: true
        snippet:
          type: string
          nullable: true
        provider_message_id:
          type: string
          nullable: true
        provider_thread_id:
          type: string
          nullable: true
        attachment_count:
          type: integer
        subtype:
          type: string
          nullable: true
        can_view_body:
          type: boolean
        can_view_metadata:
          type: boolean
        can_correct_relationship:
          type: boolean
        source_deleted:
          type: boolean
        provider_deleted_at:
          type: string
          format: date-time
          nullable: true
        body_plain:
          type: string
          nullable: true
        body_html:
          type: string
          nullable: true
        body_fetch_status:
          type: string
          nullable: true
        id:
          oneOf:
            - type: integer
            - description: Legacy activity-log IDs use legacy-<id>.
              type: string
        to_addresses:
          type: array
          items:
            type: string
        cc_addresses:
          type: array
          items:
            type: string
        classification_reasons:
          type: array
          items:
            type: string
      type: object
    CalendarManualInteractionDoc:
      properties:
        id:
          type: integer
        kind:
          type: string
        type:
          type: string
        client_id:
          type: integer
        donor_id:
          type: integer
          nullable: true
        owner_user_id:
          type: integer
          nullable: true
        owner_name:
          type: string
          nullable: true
        source:
          type: string
        subject:
          type: string
          nullable: true
        body_visibility:
          type: string
        shared_group_id:
          type: integer
          nullable: true
        occurred_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
          nullable: true
        updated_at:
          type: string
          format: date-time
          nullable: true
        direction:
          type: string
        outcome:
          type: string
          nullable: true
        duration_minutes:
          type: integer
          nullable: true
        follow_up_at:
          type: string
          format: date-time
          nullable: true
        counts_as_touch:
          type: boolean
        external_reference:
          type: string
          nullable: true
        snippet:
          type: string
          nullable: true
        attachment_count:
          type: integer
        can_view_body:
          type: boolean
        body_plain:
          type: string
          nullable: true
        ai_summary:
          type: object
          nullable: true
          additionalProperties: true
        import:
          type: object
          nullable: true
          additionalProperties: true
        attachments:
          type: array
          items:
            properties:
              id:
                type: integer
              filename:
                type: string
              original_filename:
                type: string
              mime_type:
                type: string
              file_size:
                type: integer
              file_path:
                type: string
              download_url:
                type: string
                nullable: true
              storage_url:
                type: string
              created_at:
                type: string
                format: date-time
                nullable: true
            type: object
        related_event:
          properties:
            id:
              type: integer
            name:
              type: string
            status:
              type: string
            starts_at:
              type: string
              format: date-time
              nullable: true
          type: object
          nullable: true
        related_tasks:
          type: array
          items:
            properties:
              id:
                type: integer
              title:
                type: string
              status:
                type: string
              due_date:
                type: string
                format: date
                nullable: true
              version:
                type: integer
            type: object
        version:
          type: string
          format: date-time
          nullable: true
      type: object
    CalendarCrmInteractionDoc:
      properties:
        id:
          type: integer
        kind:
          type: string
        type:
          type: string
        client_id:
          type: integer
        donor_id:
          type: integer
          nullable: true
        owner_user_id:
          type: integer
          nullable: true
        owner_name:
          type: string
          nullable: true
        source:
          type: string
        provider:
          type: string
        provider_label:
          type: string
        actor_name:
          type: string
        provider_object_id:
          type: string
          nullable: true
        subject:
          type: string
          nullable: true
        body_visibility:
          type: string
        occurred_at:
          type: string
          format: date-time
          nullable: true
        occurred_on:
          type: string
          format: date
          nullable: true
        temporal_precision:
          type: string
        provider_created_at:
          type: string
          format: date-time
          nullable: true
        provider_last_modified_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
          nullable: true
        updated_at:
          type: string
          format: date-time
          nullable: true
        snippet:
          type: string
          nullable: true
        can_view_body:
          type: boolean
        local_body:
          type: string
          nullable: true
        body_plain:
          type: string
          nullable: true
        body_html:
          type: string
          nullable: true
        version:
          type: string
          format: date-time
          nullable: true
        origin:
          properties:
            type:
              type: string
            provider:
              type: string
            label:
              type: string
          type: object
        actor:
          properties:
            type:
              type: string
            display_name:
              type: string
          type: object
        imported_by:
          type: object
          nullable: true
          additionalProperties: true
        related_event:
          properties:
            id:
              type: integer
            name:
              type: string
            status:
              type: string
            starts_at:
              type: string
              format: date-time
              nullable: true
          type: object
          nullable: true
        related_tasks:
          type: array
          items:
            properties:
              id:
                type: integer
              title:
                type: string
              status:
                type: string
              due_date:
                type: string
                format: date
                nullable: true
              version:
                type: integer
            type: object
      type: object
    CalendarProviderEventDoc:
      properties:
        id:
          type: integer
        email_calendar_account_id:
          type: integer
        provider:
          type: string
        provider_event_id:
          type: string
        title:
          type: string
        description_plain:
          type: string
          nullable: true
        location:
          type: string
          nullable: true
        organizer_email:
          type: string
          nullable: true
        organizer_name:
          type: string
          nullable: true
        meeting_url:
          type: string
          nullable: true
        start_at:
          type: string
          format: date-time
          nullable: true
        end_at:
          type: string
          format: date-time
          nullable: true
        timezone:
          type: string
          nullable: true
        status:
          type: string
          nullable: true
        visibility:
          type: string
          nullable: true
        can_update:
          type: boolean
        attendees:
          type: array
          items:
            description: Provider attendee identity/response data.
            type: object
            additionalProperties: true
        provider_metadata:
          description: Provider event metadata, including Gratona creation provenance.
          type: object
          additionalProperties: true
      type: object
    UnauthorizedResponse:
      title: UnauthorizedResponse
      description: >-
        Returned with HTTP 401 when the request lacks a valid Passport bearer
        token, a valid `X-HYS-API-Key`, or a valid session. The body is the
        simple `{message, status}` envelope emitted by `AuthenticateApiOrKey`.
      required:
        - message
        - status
      properties:
        message:
          description: >-
            Always the literal string `Unauthorized` from the `auth.api_or_key`
            middleware. Login endpoints return `Invalid Credentials` instead.
          type: string
          example: Unauthorized
        status:
          type: string
          example: error
      type: object
    ErrorResponse:
      title: ErrorResponse
      description: >-
        Generic error envelope used by most controllers. Most error responses
        pair a human-readable `message` with `status: error`. Some endpoints
        additionally include `errors` (validator errors), `error` (legacy
        single-error string), `code`, or domain-specific context fields.
      required:
        - message
      properties:
        message:
          description: Human-readable error message.
          type: string
          example: Something went wrong. Please try again.
        status:
          description: >-
            Always the literal string `error` for failures. Some endpoints omit
            this field.
          type: string
          example: error
        error:
          description: Legacy single error code/string used by older endpoints.
          type: string
          example: invalid_request
          nullable: true
        code:
          description: >-
            Optional application-level error code (not all endpoints populate
            this).
          type: string
          example: DONOR_NOT_FOUND
          nullable: true
      type: object
    NotFoundResponse:
      title: NotFoundResponse
      description: >-
        Returned with HTTP 404 when a resource lookup misses (typically because
        the id doesn't exist OR is scoped to a different `client_id`). Note:
        many endpoints intentionally collapse 'not found' and 'forbidden' into a
        single 404 to avoid leaking which records exist in another tenant.
      required:
        - message
      properties:
        message:
          description: >-
            Human-readable message. Often a more specific string like `Donor not
            found` or `Trip not found`.
          type: string
          example: Not Found
        status:
          type: string
          example: error
      type: object
  securitySchemes:
    bearerAuth:
      type: http
      description: Passport bearer token authentication for legacy admin sessions.
      scheme: bearer
      bearerFormat: JWT
    apiKeyAuth:
      type: apiKey
      description: Gratona API key sent with the compatibility header X-HYS-API-Key.
      name: X-HYS-API-Key
      in: header

````

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