Skip to main content
GET
/
campaign_affiliates
cURL
curl --request GET \
  --url https://api.growi.io/api/public/v1/campaign_affiliates \
  --header 'Authorization: Bearer <token>'
import requests

url = "https://api.growi.io/api/public/v1/campaign_affiliates"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch('https://api.growi.io/api/public/v1/campaign_affiliates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.growi.io/api/public/v1/campaign_affiliates",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.growi.io/api/public/v1/campaign_affiliates"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.growi.io/api/public/v1/campaign_affiliates")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.growi.io/api/public/v1/campaign_affiliates")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "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": "123456789012345678",
      "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"
    }
  ],
  "meta": {
    "row_count": 132,
    "page_count": 6,
    "current_page": 1
  }
}
{
"error": "Not Authenticated"
}
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:
curl -X GET "https://api.growi.io/api/public/v1/organizations/campaigns" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
{
  "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:
curl -X GET "https://api.growi.io/api/public/v1/campaign_affiliates?campaign_id=123" \
     -H "Authorization: Bearer YOUR_PUBLIC_API_KEY"
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.

Request Parameters

ParameterTypeDescriptionRequired
campaign_idIntegerRestrict results to creators enrolled in this campaign. Get IDs from Get Campaigns. Unknown/foreign IDs return an empty list. Omit to return creators across all campaigns.No
statusStringEnrollment status filter. One of active, paused, left, removed, completed, archived, pending. Default is active.No
paginationBooleanSet to true to paginate (25 results per page) and include a meta block. Default is false.No
pageIntegerPage number. Only used when pagination=true. Default is 1.No
Page size is fixed server-side at 25. There is no per/per_page parameter on this endpoint.

Request Examples

List the active creators in a specific campaign:
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):
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:
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.
{
  "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:
{
  "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:
FieldTypeDescription
affiliatesArrayArray of campaign-affiliate (enrollment) objects
affiliates[].idIntegerCampaign-affiliate (enrollment) ID
affiliates[].user_idIntegerThe creator’s user ID
affiliates[].campaign_idIntegerCampaign the creator is enrolled in
affiliates[].campaign_nameStringHuman-readable campaign name (or Contract <uuid> for contracts)
affiliates[].statusStringEnrollment status (active, paused, left, removed, completed, archived, pending)
affiliates[].affiliate_nameStringCreator’s display name
affiliates[].affiliate_emailStringCreator’s email
affiliates[].affiliate_phone_numberString|nullCreator’s phone number (this endpoint includes phone numbers)
affiliates[].affiliate_avatar_urlString|nullAvatar URL
affiliates[].affiliate_locationString|nullPretty location
affiliates[].affiliate_ageIntegerCreator’s age
affiliates[].affiliate_genderString|nullCreator’s gender
affiliates[].connected_accountsArrayCreator’s linked social accounts (each: platform, username, profile_share_url)
affiliates[].discord_idString|nullDiscord UID if linked
affiliates[].tagStringAffiliate tracking tag
affiliates[].unique_tagStringGlobally unique affiliate tracking tag
affiliates[].affiliate_linkStringCreator’s tracking/affiliate link
affiliates[].revenue_generatedNumberRevenue attributed to this creator
affiliates[].affiliate_amount_earnedNumberCommission earned by this creator
affiliates[].order_countIntegerAttributed orders
affiliates[].created_atStringEnrollment date, formatted "Month DD, YYYY"
metaObjectPagination metadata. Present only when pagination=true.
meta.row_countIntegerTotal number of affiliates matching the query
meta.page_countIntegerTotal number of pages
meta.current_pageIntegerCurrent page number
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.

Authentication

Send your organization’s public API key as a Bearer token:
-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 for shared rate-limit details (a 2-second burst minimum and an hourly cap per key, with X-RateLimit-* response headers).

Error Responses

StatusBodyWhen
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.
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.

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.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Query Parameters

campaign_id
integer

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.

status
enum<string>
default:active

Enrollment status filter. Default is active.

Available options:
active,
paused,
left,
removed,
completed,
archived,
pending
pagination
boolean
default:false

Set to true to paginate (25 results per page) and include a meta block in the response.

page
integer
default:1

Page number. Only used when pagination=true.

Response

Campaign affiliates retrieved successfully

affiliates
object[]
meta
object

Present only when pagination=true.