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

# Get an internal transaction timeline

> Returns internal transaction activity over time, bucketed by the `mode` query parameter, which takes `1d`, `1w`, `1m`, `3m`, `1y` or `all`. The response `data` echoes the `mode` applied and carries a `data` array of points to chart. Call it for an activity graph rather than paging the transaction list yourself. Returns 404 when the tenant behind the API key cannot be found.



## OpenAPI

````yaml /openapi/kintra-gateway.json get /gateway/customers/analytics/internal-transactions/timeline
openapi: 3.0.0
info:
  description: >-
    Server-to-server API for the Kintra loyalty platform. Requests are
    authenticated with a tenant API key and a request signature; the tenant
    comes from the key.
  title: Kintra Gateway API
  version: 1.0.0
servers:
  - description: Production environment
    url: https://api.kintra.io/api/v1
security: []
paths:
  /gateway/customers/analytics/internal-transactions/timeline:
    get:
      tags:
        - Analytics
      summary: Get an internal transaction timeline
      description: >-
        Returns internal transaction activity over time, bucketed by the `mode`
        query parameter, which takes `1d`, `1w`, `1m`, `3m`, `1y` or `all`. The
        response `data` echoes the `mode` applied and carries a `data` array of
        points to chart. Call it for an activity graph rather than paging the
        transaction list yourself. Returns 404 when the tenant behind the API
        key cannot be found.
      operationId: GetTenantInternalTransactionsTimeline
      parameters:
        - in: query
          name: mode
          required: false
          schema:
            $ref: '#/components/schemas/InternalTransactionsTimelineMode'
        - description: >-
            Hex HMAC-SHA256 of the timestamp, the uppercase method, the url as
            sent and the request body, keyed by the signing secret.
          in: header
          name: X-Tenant-Signature
          required: true
          schema:
            type: string
        - description: Unix seconds. Checked before the signature.
          in: header
          name: X-Tenant-Timestamp
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/ApiResponse_IInternalTransactionsTimelineResponseDto_
          description: ''
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse_null_'
          description: Unauthorized
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse_null_'
          description: Tenant not found
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse_null_'
          description: Internal server error
      security:
        - tenant_api_key: []
      x-codeSamples:
        - label: cURL
          lang: bash
          source: >
            # Export KINTRA_API for your environment first; the base URL is on
            the introduction page.

            KEY="YOUR_TENANT_KEY_ID"

            SECRET="YOUR_SIGNING_SECRET"


            # The signature covers the path and query exactly as sent, so both
            are split

            # off the base URL and reused for the request line below.

            API_PATH="/${KINTRA_API#*://*/}"

            API_HOST="${KINTRA_API%"$API_PATH"}"

            METHOD="GET"

            PATH_AND_QUERY="$API_PATH/gateway/customers/analytics/internal-transactions/timeline"


            # No body on this method, so the signature covers an empty body
            string.

            BODY=''


            TIMESTAMP="$(date +%s)"

            SIGNATURE="$(printf '%s' "$TIMESTAMP$METHOD$PATH_AND_QUERY$BODY" \
              | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $NF}')"

            curl -sS -w '\n%{http_code}' -X "$METHOD" "$API_HOST$PATH_AND_QUERY"
            \
              -H "X-Tenant-Key: $KEY" \
              -H "X-Tenant-Timestamp: $TIMESTAMP" \
              -H "X-Tenant-Signature: $SIGNATURE"
        - label: TypeScript
          lang: typescript
          source: >
            import { createHmac } from 'node:crypto'


            // Export KINTRA_API for your environment first; the base URL is on
            the introduction page.

            const { origin, pathname } = new URL(process.env.KINTRA_API ?? '')

            const key = 'YOUR_TENANT_KEY_ID'

            const secret = 'YOUR_SIGNING_SECRET'


            const method = 'GET'

            // The signature covers the path and query as sent, starting at the
            API prefix.

            const pathAndQuery =
            `${pathname}/gateway/customers/analytics/internal-transactions/timeline`


            // No body on this method, so the signature covers an empty body
            string.

            const body = ''


            const timestamp = Math.floor(Date.now() / 1000).toString()

            const signature = createHmac('sha256',
            secret).update(`${timestamp}${method}${pathAndQuery}${body}`).digest('hex')


            const response = await fetch(`${origin}${pathAndQuery}`, {
              method,
              headers: {
                'X-Tenant-Key': key,
                'X-Tenant-Timestamp': timestamp,
                'X-Tenant-Signature': signature
              }
            })


            console.log(response.status, await response.json())
components:
  schemas:
    InternalTransactionsTimelineMode:
      enum:
        - 1d
        - 1w
        - 1m
        - 3m
        - 1y
        - all
      type: string
    ApiResponse_IInternalTransactionsTimelineResponseDto_:
      additionalProperties: false
      properties:
        data:
          $ref: '#/components/schemas/IInternalTransactionsTimelineResponseDto'
        errors:
          items:
            properties:
              message:
                type: string
              path:
                type: string
            required:
              - path
              - message
            type: object
          type: array
        message:
          type: string
        success:
          type: boolean
      required:
        - success
      type: object
    ApiResponse_null_:
      additionalProperties: false
      properties:
        data:
          enum:
            - null
          nullable: true
          type: number
        errors:
          items:
            properties:
              message:
                type: string
              path:
                type: string
            required:
              - path
              - message
            type: object
          type: array
        message:
          type: string
        success:
          type: boolean
      required:
        - success
      type: object
    IInternalTransactionsTimelineResponseDto:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/IInternalTransactionsTimelinePointDto'
          type: array
        mode:
          $ref: '#/components/schemas/InternalTransactionsTimelineMode'
      required:
        - mode
        - data
      type: object
    IInternalTransactionsTimelinePointDto:
      additionalProperties: false
      properties:
        period_start:
          description: UTC start of bucket (ISO 8601).
          type: string
        total_transactions:
          format: double
          type: number
      required:
        - period_start
        - total_transactions
      type: object
  securitySchemes:
    tenant_api_key:
      description: Tenant API key
      in: header
      name: x-tenant-key
      type: apiKey

````