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

# List Campaign Affiliates

> Retrieves the organization's enrolled creators (campaign affiliates). Pass campaign_id to restrict the list to the creators enrolled in a single campaign. Results are always scoped to the API key's organization.

Retrieves the organization's enrolled creators (campaign affiliates). By default it returns every active creator across all of your campaigns. Pass the optional **`campaign_id`** parameter to restrict the list to the creators enrolled in a single campaign — the recommended way to **identify and extract the list of creators added to a specific campaign**.

Each item represents one creator's enrollment (a campaign affiliate) and includes creator identity, contact details, connected social accounts, and attributed performance. The full payload is large (\~90 fields); this page documents the creator-identification subset most useful for listing creators, and notes that additional campaign-configuration and commission fields are also returned.

## Recipe: List the creators in a specific campaign

This is the headline use case. It's a two-step flow.

**Step 1 — find the campaign's ID** with [Get Campaigns](/api-reference/endpoint/get-campaigns):

```bash theme={null}
curl -X GET "https://api.growi.io/api/public/v1/organizations/campaigns" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

```json theme={null}
{
  "success": true,
  "campaigns": [
    { "id": 123, "name": "Summer Collection 2024", "campaign_type": "Campaign", "status": "Active" }
  ]
}
```

**Step 2 — list that campaign's creators** by passing the `campaign_id`:

```bash theme={null}
curl -X GET "https://api.growi.io/api/public/v1/campaign_affiliates?campaign_id=123" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

<Note>
  An unknown `campaign_id`, or one that belongs to a different organization, returns **HTTP 200 with an empty `affiliates` array** — not a `404`. There is no cross-organization data leakage. Check for an empty list rather than relying on an error status.
</Note>

## Request Parameters

| Parameter     | Type    | Description                                                                                                                                                                                                              | Required |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- |
| `campaign_id` | Integer | **Restrict results to creators enrolled in this campaign.** Get IDs from [Get Campaigns](/api-reference/endpoint/get-campaigns). Unknown/foreign IDs return an empty list. Omit to return creators across all campaigns. | No       |
| `status`      | String  | Enrollment status filter. One of `active`, `paused`, `left`, `removed`, `completed`, `archived`, `pending`. Default is `active`.                                                                                         | No       |
| `pagination`  | Boolean | Set to `true` to paginate (25 results per page) and include a `meta` block. Default is `false`.                                                                                                                          | No       |
| `page`        | Integer | Page number. Only used when `pagination=true`. Default is 1.                                                                                                                                                             | No       |

<Note>
  Page size is fixed server-side at **25**. There is no `per`/`per_page` parameter on this endpoint.
</Note>

## Request Examples

List the active creators in a specific campaign:

```bash theme={null}
curl -X GET "https://api.growi.io/api/public/v1/campaign_affiliates?campaign_id=123" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

Filter by enrollment status (e.g. creators who completed the campaign):

```bash theme={null}
curl -X GET "https://api.growi.io/api/public/v1/campaign_affiliates?campaign_id=123&status=completed" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

Paginate through a large campaign, 25 creators per page:

```bash theme={null}
curl -X GET "https://api.growi.io/api/public/v1/campaign_affiliates?campaign_id=123&pagination=true&page=2" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

## Response Example

Without pagination, the response is `{ "affiliates": [ ... ] }`. The example below is trimmed to the documented fields; the real payload contains additional campaign-configuration and commission fields per creator.

```json theme={null}
{
  "affiliates": [
    {
      "id": 3490313,
      "user_id": 2628998,
      "campaign_id": 123,
      "campaign_name": "Summer Collection 2024",
      "status": "active",
      "affiliate_name": "Natalie Garay",
      "affiliate_email": "creator@example.com",
      "affiliate_phone_number": "+15551234567",
      "affiliate_avatar_url": "https://imagedelivery.net/abc/avatar.png",
      "affiliate_location": "Temecula, CA 92591, US",
      "affiliate_age": 24,
      "affiliate_gender": "female",
      "connected_accounts": [
        {
          "platform": "Instagram",
          "username": "nataliemgaray",
          "profile_share_url": "https://www.instagram.com/nataliemgaray/"
        }
      ],
      "discord_id": null,
      "tag": "natalie-g",
      "unique_tag": "natalie-g-3490313",
      "affiliate_link": "https://growi.io/r/natalie-g",
      "revenue_generated": 14245.57,
      "affiliate_amount_earned": 1403.31,
      "order_count": 150,
      "created_at": "January 16, 2026"
      // ... additional campaign-config & commission fields omitted
    }
  ]
}
```

When `pagination=true`, the response also includes a `meta` block:

```json theme={null}
{
  "affiliates": [ /* ... */ ],
  "meta": {
    "row_count": 132,
    "page_count": 6,
    "current_page": 1
  }
}
```

## Response Fields

The documented subset most useful for listing the creators in a campaign:

| Field                                  | Type         | Description                                                                                   |
| -------------------------------------- | ------------ | --------------------------------------------------------------------------------------------- |
| `affiliates`                           | Array        | Array of campaign-affiliate (enrollment) objects                                              |
| `affiliates[].id`                      | Integer      | Campaign-affiliate (enrollment) ID                                                            |
| `affiliates[].user_id`                 | Integer      | The creator's user ID                                                                         |
| `affiliates[].campaign_id`             | Integer      | Campaign the creator is enrolled in                                                           |
| `affiliates[].campaign_name`           | String       | Human-readable campaign name (or `Contract <uuid>` for contracts)                             |
| `affiliates[].status`                  | String       | Enrollment status (`active`, `paused`, `left`, `removed`, `completed`, `archived`, `pending`) |
| `affiliates[].affiliate_name`          | String       | Creator's display name                                                                        |
| `affiliates[].affiliate_email`         | String       | Creator's email                                                                               |
| `affiliates[].affiliate_phone_number`  | String\|null | Creator's phone number (this endpoint includes phone numbers)                                 |
| `affiliates[].affiliate_avatar_url`    | String\|null | Avatar URL                                                                                    |
| `affiliates[].affiliate_location`      | String\|null | Pretty location                                                                               |
| `affiliates[].affiliate_age`           | Integer      | Creator's age                                                                                 |
| `affiliates[].affiliate_gender`        | String\|null | Creator's gender                                                                              |
| `affiliates[].connected_accounts`      | Array        | Creator's linked social accounts (each: `platform`, `username`, `profile_share_url`)          |
| `affiliates[].discord_id`              | String\|null | Discord UID if linked                                                                         |
| `affiliates[].tag`                     | String       | Affiliate tracking tag                                                                        |
| `affiliates[].unique_tag`              | String       | Globally unique affiliate tracking tag                                                        |
| `affiliates[].affiliate_link`          | String       | Creator's tracking/affiliate link                                                             |
| `affiliates[].revenue_generated`       | Number       | Revenue attributed to this creator                                                            |
| `affiliates[].affiliate_amount_earned` | Number       | Commission earned by this creator                                                             |
| `affiliates[].order_count`             | Integer      | Attributed orders                                                                             |
| `affiliates[].created_at`              | String       | Enrollment date, formatted `"Month DD, YYYY"`                                                 |
| `meta`                                 | Object       | Pagination metadata. Present only when `pagination=true`.                                     |
| `meta.row_count`                       | Integer      | Total number of affiliates matching the query                                                 |
| `meta.page_count`                      | Integer      | Total number of pages                                                                         |
| `meta.current_page`                    | Integer      | Current page number                                                                           |

<Note>
  The response also includes many campaign-configuration and commission fields per creator — for example `campaign_platforms`, `campaign_tiers`, `current_tier`, `shopify_commission_value`, `tik_tok_shop_commission_value`, and `organization_currency`. They are returned but not documented here; the fields above are what you need to identify and list the creators in a campaign.
</Note>

## Authentication

Send your organization's public API key as a Bearer token:

```bash theme={null}
-H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
```

This is a read-only `GET`, so **viewer (read-only) API keys** can call it. Keys are scoped to a single organization, and results are always anchored to the key's organization. See [Rate Limits & Authentication](/api-reference/introduction) for shared rate-limit details (a 2-second burst minimum and an hourly cap per key, with `X-RateLimit-*` response headers).

## Error Responses

| Status | Body                                                                                                         | When                                   |
| ------ | ------------------------------------------------------------------------------------------------------------ | -------------------------------------- |
| `401`  | `{ "error": "Not Authenticated" }`                                                                           | Missing or invalid API key.            |
| `429`  | `{ "error": "Rate limit exceeded. Please wait 2 seconds between requests.", "retry_after": 2 }`              | Burst limit (min 2s between requests). |
| `429`  | `{ "error": "Hourly rate limit of N requests exceeded.", "retry_after": <secs>, "reset_time": "<iso8601>" }` | Hourly limit exceeded.                 |

<Note>
  There is **no `404`** for an unknown `campaign_id` — the endpoint returns `200` with an empty `affiliates` array. This is a common integrator gotcha; check for an empty list rather than an error status.
</Note>

## Use Cases

This endpoint is useful for:

* **Campaign roster**: Identify and extract the full list of creators enrolled in a specific campaign via `campaign_id`.
* **Creator directory / CRM sync**: Pull creator identity, contact details, and social accounts into an external system.
* **Status segmentation**: Filter by `status` to separate active, completed, or removed creators within a campaign.
* **Performance review**: Use `revenue_generated`, `affiliate_amount_earned`, and `order_count` to rank creators in a campaign.
* **Drill-down**: Use `affiliates[].id` with the single campaign-affiliate endpoint, or `user_id` to join against other API data.


## OpenAPI

````yaml GET /campaign_affiliates
openapi: 3.0.1
info:
  title: Growi API
  description: >-
    API documentation for Growi platform, showcasing the public tracking event
    endpoint
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.growi.io/api/public/v1
security:
  - bearerAuth: []
paths:
  /campaign_affiliates:
    get:
      description: >-
        Retrieves the organization's enrolled creators (campaign affiliates).
        Pass campaign_id to restrict the list to the creators enrolled in a
        single campaign. Results are always scoped to the API key's
        organization.
      parameters:
        - name: campaign_id
          in: query
          required: false
          example: 123
          schema:
            type: integer
          description: >-
            Restrict results to creators enrolled in this campaign. Get IDs from
            GET /organizations/campaigns. An unknown or foreign campaign_id
            returns an empty list (HTTP 200), not a 404.
        - name: status
          in: query
          required: false
          example: active
          schema:
            type: string
            default: active
            enum:
              - active
              - paused
              - left
              - removed
              - completed
              - archived
              - pending
          description: Enrollment status filter. Default is active.
        - name: pagination
          in: query
          required: false
          example: false
          schema:
            type: boolean
            default: false
          description: >-
            Set to true to paginate (25 results per page) and include a meta
            block in the response.
        - name: page
          in: query
          required: false
          example: 1
          schema:
            type: integer
            default: 1
          description: Page number. Only used when pagination=true.
      responses:
        '200':
          description: Campaign affiliates retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  affiliates:
                    type: array
                    items:
                      $ref: '#/components/schemas/CampaignAffiliate'
                  meta:
                    type: object
                    description: Present only when pagination=true.
                    properties:
                      row_count:
                        type: integer
                        example: 132
                        description: Total number of affiliates matching the query
                      page_count:
                        type: integer
                        example: 6
                        description: Total number of pages
                      current_page:
                        type: integer
                        example: 1
                        description: Current page number
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Not Authenticated
components:
  schemas:
    CampaignAffiliate:
      type: object
      description: >-
        One creator's enrollment in a campaign. The full payload contains ~90
        fields mixing creator identity, campaign configuration, and commission
        data; the creator-identification subset is documented here.
      properties:
        id:
          type: integer
          example: 3490313
          description: Campaign-affiliate (enrollment) ID
        user_id:
          type: integer
          example: 2628998
          description: The creator's user ID
        campaign_id:
          type: integer
          example: 123
          description: Campaign the creator is enrolled in
        campaign_name:
          type: string
          example: Summer Collection 2024
          description: Human-readable campaign name (or "Contract <uuid>" for contracts)
        status:
          type: string
          example: active
          enum:
            - active
            - paused
            - left
            - removed
            - completed
            - archived
            - pending
          description: Enrollment status
        affiliate_name:
          type: string
          example: Natalie Garay
          description: Creator's display name
        affiliate_email:
          type: string
          format: email
          example: creator@example.com
          description: Creator's email
        affiliate_phone_number:
          type: string
          nullable: true
          example: '+15551234567'
          description: Creator's phone number (this endpoint includes phone numbers)
        affiliate_avatar_url:
          type: string
          nullable: true
          example: https://imagedelivery.net/abc/avatar.png
          description: Avatar URL
        affiliate_location:
          type: string
          nullable: true
          example: Temecula, CA 92591, US
          description: Pretty location
        affiliate_age:
          type: integer
          example: 24
          description: Creator's age
        affiliate_gender:
          type: string
          nullable: true
          example: female
          description: Creator's gender
        connected_accounts:
          type: array
          description: Creator's linked social accounts
          items:
            type: object
            properties:
              platform:
                type: string
                example: Instagram
              username:
                type: string
                example: nataliemgaray
              profile_share_url:
                type: string
                example: https://www.instagram.com/nataliemgaray/
        discord_id:
          type: string
          nullable: true
          example: '123456789012345678'
          description: Discord UID if linked
        tag:
          type: string
          example: natalie-g
          description: Affiliate tracking tag
        unique_tag:
          type: string
          example: natalie-g-3490313
          description: Globally unique affiliate tracking tag
        affiliate_link:
          type: string
          example: https://growi.io/r/natalie-g
          description: Creator's tracking/affiliate link
        revenue_generated:
          type: number
          example: 14245.57
          description: Revenue attributed to this creator
        affiliate_amount_earned:
          type: number
          example: 1403.31
          description: Commission earned by this creator
        order_count:
          type: integer
          example: 150
          description: Attributed orders
        created_at:
          type: string
          example: January 16, 2026
          description: Enrollment date, formatted "Month DD, YYYY"
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````