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

# Get the team activity per member

> Activity of each member of the organization over a date range, owner included, with the breakdown per campaign: the same figures as the Team activity page of the app. Only organization owners and admins can call it. Figures come from daily snapshots: each UTC day is computed at 04:30 UTC the next day, so today is not included yet.



## OpenAPI

````yaml GET /v1/team-activity/members
openapi: 3.0.0
info:
  title: Gojiberry AI - External API
  description: >-

    # Gojiberry AI External API


    This API allows you to programmatically access your Gojiberry AI data and
    integrate it with your applications.


    ## How it works


    Gojiberry runs your outreach as a pipeline of three building blocks:


    1. **Source agent — the lead finder.** A source agent continuously sources
    leads matching your targeting criteria (job titles, industries, locations,
    signals, ...) and scores them with AI.

    2. **List — where the leads land.** Every source agent is linked to a list
    (`listId` is required when creating an agent): the leads it finds are
    imported as contacts into that list. Lists can also be filled by importing
    contacts yourself.

    3. **Campaign — the outreach.** A campaign uses one or more lists as its
    lead source (`listIds` is required when creating a campaign) and runs its
    steps (LinkedIn invitations, messages, emails, ...) on the contacts of those
    lists, sending through your LinkedIn and/or email seats. Once activated, the
    campaign runs the outreach automatically on a daily basis.


    **Terminology.** In the Gojiberry platform, an **Agent** is a *campaign
    agent* — the campaign that performs the outreach. A **source agent** is the
    lead finder that sources the leads. The two are linked through a **list**:
    the source agent imports the leads it finds into the list, and the campaign
    agent reaches out to the contacts of that list.


    **Best practice: create a Full Cycle agent.** Always create the three
    resources in this order — first the list, then the source agent that fills
    it, then the campaign that reaches out to it. Together, the list + source
    agent + campaign agent form a **Full Cycle agent**: leads are sourced and
    outreached automatically, end to end. If you create a source agent without a
    campaign agent, it shows up as a **legacy agent** in the platform: it only
    sources leads and does **no outreach**. So it's best practice to always
    create all three.


    A typical setup through the API:


    ```text

    POST /v1/list                  # 1. create the list

    POST /v1/agent                 # 2. create the source agent (lead finder)
    linked to that list (listId)

    POST /v1/campaign              # 3. create the campaign agent using that
    list as lead source (listIds)

    GET  /v1/campaign/{id}/logs    # 4. follow the outreach activity

    ```


    ## Authentication


    All API requests require authentication using a Bearer token. To get your
    API key:


    1. **Log in to your Gojiberry AI account** at
    [https://app.gojiberry.ai](https://app.gojiberry.ai)

    2. **Navigate to Settings** → **API** section

    3. **Click "Create API Key"** to generate a new token

    4. **Copy the API key** when it's displayed (you won't be able to see it
    again)

    5. **Use the token** in your requests by adding the header: `Authorization:
    Bearer YOUR_API_KEY`


    ## Impersonation (organization owners)


    If your API key belongs to the **owner of an organization**, you can perform
    any API call on behalf of another member of your organization by adding the
    `x-impersonate-user-id` header with the member's user ID:


    ```bash

    # Get the contacts of the organization member with user ID 123

    curl -H "Authorization: Bearer YOUR_API_KEY" \
         -H "x-impersonate-user-id: 123" \
         https://ext.gojiberry.ai/v1/contact
    ```


    When impersonating, the request behaves exactly as if it was made by that
    member: you read and write their data (contacts, campaigns, lists, unibox,
    etc.).


    Rules:

    - Your API key must belong to the **organization owner**; other members
    cannot impersonate.

    - The impersonated user must belong to the **same organization** as the API
    key user.

    - Requests that don't meet these rules are rejected with a `401
    Unauthorized`.


    Tip: use `GET /v1/organization/members` to list the members of your
    organization and their user IDs, and `GET /v1/user/me` to verify which user
    the current request acts as.


    ## Rate Limits


    - **100 requests per minute** per account. Short bursts above this are
    tolerated.

    - **100,000 requests per day** per account.

    - Limits are shared by all API keys and AI app (MCP) connections of the same
    user, including calls made on behalf of organization members with
    `x-impersonate-user-id`.

    - Requests over a limit return `429 Too Many Requests` with a `Retry-After`
    header (in seconds). Wait that long before retrying.

    - Some endpoints have their own lower limit, stated in their description.


    ## Base URL

    - **Production**: `https://ext.gojiberry.ai`


    ## Endpoints


    ### Contacts

    - `GET /v1/contact` - Get all contacts with filtering and pagination

    - `GET /v1/contact/{id}` - Get a specific contact

    - `GET /v1/contact/health` - Health check endpoint


    ## Example Usage


    ```bash

    # Get all contacts

    curl -H "Authorization: Bearer YOUR_API_KEY" \
         https://ext.gojiberry.ai/v1/contact

    # Get contacts with filtering

    curl -H "Authorization: Bearer YOUR_API_KEY" \
         "https://ext.gojiberry.ai/v1/contact?search=john&agent=1&dateFrom=2024-01-01"

    # Get a specific contact

    curl -H "Authorization: Bearer YOUR_API_KEY" \
         https://ext.gojiberry.ai/v1/contact/123
    ```


    ## Webhooks


    Gojiberry allows you to receive real-time notifications when new contacts
    are created or updated by configuring a webhook URL.


    ### How to Configure Webhooks


    1. **Log in to your Gojiberry AI account** at
    [https://app.gojiberry.ai](https://app.gojiberry.ai)

    2. **Navigate to the Integrations page** at
    [https://app.gojiberry.ai/integrations](https://app.gojiberry.ai/integrations)

    3. **Add a Webhook integration** by clicking the Webhook option

    4. **Enter your webhook URL** where you want to receive notifications

    5. **Save the configuration**


    Once configured, Gojiberry will send POST requests to your webhook URL
    whenever:

    - A new contact is created

    - A contact is updated

    - Other relevant events occur in your account


    The webhook payload will include the full contact data in JSON format. Each
    webhook request includes a custom header `x-gojiberry-user-id` containing
    your user ID for verification purposes.


    ### Verifying Webhook Signatures (optional)


    You can optionally configure a signing secret on your Webhook integration.
    When a secret is set, every webhook request also includes:


    - `x-gojiberry-timestamp`: the Unix timestamp (in seconds) at which the
    request was sent

    - `x-gojiberry-signature`: `sha256=` followed by the hex-encoded HMAC-SHA256
    of `{timestamp}.{rawBody}` computed with your signing secret


    To verify a request:


    1. Read the raw request body as a string (do not re-serialize parsed JSON).

    2. Concatenate the value of `x-gojiberry-timestamp`, a `.` character, and
    the raw body.

    3. Compute the HMAC-SHA256 of that string using your signing secret,
    hex-encoded, and prefix it with `sha256=`.

    4. Compare it to `x-gojiberry-signature` using a constant-time comparison.

    5. Reject requests whose timestamp is too old (we recommend a 5 minute
    tolerance) to prevent replay attacks.


    Example in Node.js:


    ```js

    const crypto = require('crypto');


    function verifyGojiberrySignature(rawBody, headers, secret) {
      const timestamp = headers['x-gojiberry-timestamp'];
      const signature = headers['x-gojiberry-signature'];
      if (!timestamp || !signature) return false;
      if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
      const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(timestamp + '.' + rawBody).digest('hex');
      return expected.length === signature.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
    }

    ```


    If no signing secret is configured, these headers are not sent.


    ## Support


    For API support, please contact us at
    [hello@gojiberry.ai](mailto:hello@gojiberry.ai)
          
  version: '1.0'
  contact: {}
servers:
  - url: https://ext.gojiberry.ai
    description: Production
security: []
tags: []
paths:
  /v1/team-activity/members:
    get:
      tags:
        - Team activity
      summary: Get the team activity per member
      description: >-
        Activity of each member of the organization over a date range, owner
        included, with the breakdown per campaign: the same figures as the Team
        activity page of the app. Only organization owners and admins can call
        it. Figures come from daily snapshots: each UTC day is computed at 04:30
        UTC the next day, so today is not included yet.
      operationId: TeamActivityExternalController_getMembers
      parameters:
        - name: x-impersonate-user-id
          in: header
          description: >-
            ID of an organization member to act on behalf of. The API key user
            must be the owner of the organization and the target user must
            belong to the same organization. Team activity is only returned when
            the user the request acts as is an owner or admin.
          required: false
          schema:
            type: string
        - name: dateFrom
          required: true
          in: query
          description: First day of the period, YYYY-MM-DD (UTC)
          schema:
            type: string
        - name: dateTo
          required: true
          in: query
          description: Last day of the period, YYYY-MM-DD (UTC), included
          schema:
            type: string
        - name: limit
          required: false
          in: query
          description: Members per page, between 1 and 100 (default 25)
          schema:
            type: number
        - name: offset
          required: false
          in: query
          description: Number of members to skip (default 0)
          schema:
            type: number
        - name: sortBy
          required: false
          in: query
          description: Metric to sort the members by
          schema:
            enum:
              - leadsFound
              - contacted
              - linkedinInvitationsAccepted
              - messagesSent
              - replied
              - interested
            type: string
        - name: sortDirection
          required: false
          in: query
          description: Used with sortBy (default desc)
          schema:
            enum:
              - asc
              - desc
            type: string
      responses:
        '200':
          description: Team activity per member
          content:
            application/json:
              schema:
                type: object
                properties:
                  organizationId:
                    type: number
                  dateFrom:
                    type: string
                    example: '2026-10-01'
                  dateTo:
                    type: string
                    example: '2026-10-31'
                  pagination:
                    type: object
                    properties:
                      limit:
                        type: number
                      offset:
                        type: number
                      total:
                        type: number
                      hasMore:
                        type: boolean
                  members:
                    type: array
                    items:
                      type: object
                      properties:
                        accountId:
                          type: number
                          description: >-
                            User ID of the member (usable in the
                            x-impersonate-user-id header)
                        firstName:
                          type: string
                          nullable: true
                        lastName:
                          type: string
                          nullable: true
                        email:
                          type: string
                        campaignsCount:
                          type: number
                        activeCampaignsCount:
                          type: number
                        outreach:
                          type: object
                          description: Channels used during the period
                          properties:
                            linkedin:
                              type: boolean
                            email:
                              type: boolean
                        metrics:
                          type: object
                          properties:
                            leadsFound:
                              type: object
                              description: Leads found by the source agents
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            contacted:
                              type: object
                              description: Distinct leads contacted
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            linkedinInvitationsSent:
                              type: object
                              description: LinkedIn invitations sent
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            linkedinInvitationsAccepted:
                              type: object
                              description: >-
                                LinkedIn invitations accepted. Rate: accepted ÷
                                sent.
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            messagesSent:
                              type: object
                              description: >-
                                LinkedIn messages (InMails and voice messages
                                included) and emails sent
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            replied:
                              type: object
                              description: >-
                                Distinct leads who replied. Rate: replied ÷
                                messages sent.
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                            interested:
                              type: object
                              description: >-
                                Distinct leads marked interested. Rate:
                                interested ÷ replied.
                              properties:
                                value:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Value over the period. Null when it cannot
                                    be computed.
                                rate:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Ratio between 0 and 1 (for example 0.12 =
                                    12%), or null when the metric has no rate.
                                changePercent:
                                  type: number
                                  nullable: true
                                  description: >-
                                    Change in percent against the previous
                                    period of the same length. Null when that
                                    period has no data.
                        campaigns:
                          type: array
                          items:
                            type: object
                            properties:
                              campaignId:
                                type: number
                              accountId:
                                type: number
                              name:
                                type: string
                              status:
                                type: string
                                enum:
                                  - active
                                  - paused
                                  - leads_sourcing_only
                                  - outreach_only
                              outreach:
                                type: object
                                description: Channels used during the period
                                properties:
                                  linkedin:
                                    type: boolean
                                  email:
                                    type: boolean
                              metrics:
                                type: object
                                properties:
                                  leadsFound:
                                    type: object
                                    description: Leads found by the source agents
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  contacted:
                                    type: object
                                    description: Distinct leads contacted
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  linkedinInvitationsSent:
                                    type: object
                                    description: LinkedIn invitations sent
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  linkedinInvitationsAccepted:
                                    type: object
                                    description: >-
                                      LinkedIn invitations accepted. Rate:
                                      accepted ÷ sent.
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  messagesSent:
                                    type: object
                                    description: >-
                                      LinkedIn messages (InMails and voice
                                      messages included) and emails sent
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  replied:
                                    type: object
                                    description: >-
                                      Distinct leads who replied. Rate: replied
                                      ÷ messages sent.
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
                                  interested:
                                    type: object
                                    description: >-
                                      Distinct leads marked interested. Rate:
                                      interested ÷ replied.
                                    properties:
                                      value:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Value over the period. Null when it
                                          cannot be computed.
                                      rate:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Ratio between 0 and 1 (for example 0.12
                                          = 12%), or null when the metric has no
                                          rate.
                                      changePercent:
                                        type: number
                                        nullable: true
                                        description: >-
                                          Change in percent against the previous
                                          period of the same length. Null when
                                          that period has no data.
        '400':
          description: Invalid dates, limit, offset, sortBy or sortDirection
        '403':
          description: >-
            The user the request acts as is not an owner or admin of the
            organization (for example a member impersonated with
            x-impersonate-user-id).
      security:
        - bearer: []
components:
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: Enter API Key

````

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