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

# Create Campaign Application

> Submits an applicant from your own signup form directly into a Growi campaign. Creates the creator account if needed and stores marketing attribution (Meta click ids, UTMs, TikTok enrichment) that is echoed back on outbound webhook events. Idempotent: repeat submissions for the same email + campaign return the existing application.

Submits an applicant from your own signup form directly into a Growi campaign — so you can host the signup experience on your domain while Growi handles creator onboarding, approval, and tracking.

The endpoint creates the creator account if it doesn't exist yet, files a **pending** application to the campaign (or **accepted**, when the campaign auto-accepts applicants), and stores any marketing attribution you send. When the creator is later approved, or generates a sale, the attribution is **echoed back** on the corresponding [webhook events](/essentials/campaign-creator-webhooks) so you can match the creator in your ad platform (for example, forwarding to the Meta Conversions API).

<Info>
  Requires a full-access API key (read-only keys are rejected).
</Info>

**Idempotent**: repeat submissions for the same `email` + `campaign_id` return the existing application with `created: false` instead of creating a duplicate. Attribution keys not seen before are merged in; existing values are never overwritten. This endpoint is also exempt from the 2-second request-interval limit, so bursts of near-simultaneous form submissions are safe.

## Request Body

| Field           | Type    | Description                                                                  | Required |
| --------------- | ------- | ---------------------------------------------------------------------------- | -------- |
| `campaign_id`   | Integer | Growi campaign the applicant is applying to                                  | Yes      |
| `email`         | String  | Applicant's email address                                                    | Yes      |
| `first_name`    | String  | Applicant's first name                                                       | No       |
| `last_name`     | String  | Applicant's last name                                                        | No       |
| `tiktok_handle` | String  | TikTok handle or profile URL; attached to the creator's profile              | No       |
| `id`            | Integer | Your internal applicant id, stored as attribution `external_id`              | No       |
| `created_at`    | String  | When the applicant submitted your form, stored as attribution `submitted_at` | No       |

### Attribution fields (all optional)

Everything below is stored verbatim and echoed back inside the `attribution` object on webhook events.

| Field                                                                     | Type    | Description                                                        |
| ------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------ |
| `fbp`                                                                     | String  | Meta browser id cookie (`_fbp`)                                    |
| `fbc`                                                                     | String  | Meta click id cookie (`_fbc`)                                      |
| `fbclid`                                                                  | String  | Meta click id from the landing page URL                            |
| `event_id`                                                                | String  | Your event id — use it to deduplicate against Meta Conversions API |
| `event_name`                                                              | String  | Your event name (e.g. `AffiliateLead`)                             |
| `event_source_url`                                                        | String  | URL the applicant submitted the form from                          |
| `client_ip_address`                                                       | String  | Applicant's IP address                                             |
| `client_user_agent`                                                       | String  | Applicant's browser user agent                                     |
| `referrer`                                                                | String  | HTTP referrer of the signup page                                   |
| `utm_source` / `utm_medium` / `utm_campaign` / `utm_content` / `utm_term` | String  | UTM parameters from the landing URL                                |
| `follower_count`                                                          | Integer | Applicant's TikTok follower count                                  |
| `likes_count`                                                             | Integer | Applicant's TikTok likes count                                     |
| `video_count`                                                             | Integer | Applicant's TikTok video count                                     |
| `tiktok_verified`                                                         | Integer | `1` when the TikTok account is verified                            |
| `enriched_at`                                                             | String  | When you enriched the TikTok profile data                          |

## Request Example

```bash theme={null}
curl -X POST "https://api.growi.io/api/public/v1/campaign_applications" \
  -H "Authorization: Bearer YOUR_PUBLIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": 51812,
    "email": "maria.92.ambriz@gmail.com",
    "first_name": "Maria",
    "last_name": "Ambriz",
    "tiktok_handle": "maria.ambriz66",
    "id": 11177,
    "created_at": "2026-07-31 13:13:16",
    "fbp": "fb.1.1785503550741.5188770206",
    "fbc": "fb.1.1785503550741.PAcGRvZgJmZGlk",
    "fbclid": "PAcGRvZgJmZGlk",
    "event_id": "012e8a42-6b26-43cf-9a66-0242c6bc0fd1",
    "event_name": "AffiliateLead",
    "event_source_url": "https://shop.example.com/tiktok-partner?utm_source=facebook",
    "client_ip_address": "203.0.113.7",
    "client_user_agent": "Mozilla/5.0 (iPhone)",
    "referrer": "https://instagram.com/",
    "utm_source": "facebook",
    "utm_medium": "paid",
    "utm_campaign": "COFFEE | LEAD | BOF",
    "follower_count": 2992,
    "likes_count": 16000,
    "video_count": 139,
    "tiktok_verified": 1
  }'
```

## Response Example

```json theme={null}
{
  "data": {
    "invitation_id": 98123,
    "status": "pending",
    "user_id": 45678,
    "campaign_id": 51812,
    "created": true
  }
}
```

A repeat submission returns `200` with the same shape and `"created": false`.

## Response Fields

| Field                | Type    | Description                                                        |
| -------------------- | ------- | ------------------------------------------------------------------ |
| `data.invitation_id` | Integer | The application's id                                               |
| `data.status`        | String  | `pending`, or `accepted` when the campaign auto-accepts applicants |
| `data.user_id`       | Integer | The creator's Growi user id                                        |
| `data.campaign_id`   | Integer | The campaign applied to                                            |
| `data.created`       | Boolean | `true` for a new application, `false` for an idempotent repeat     |

## Error Responses

**403 — plan or key**

```json theme={null}
{ "error": "The applications API is not enabled for your plan." }
```

**404 — campaign not found for your organization**

```json theme={null}
{ "error": "Campaign not found." }
```

**422 — validation**

```json theme={null}
{ "error": "email is required" }
```

## Use Cases

* **Host your own signup form**: keep the application experience on your domain (with your pixels and analytics firing natively) while applicants flow straight into Growi for review.
* **Meta ads attribution**: send `fbp`/`fbc`/`event_id` with each applicant, then forward the `campaign_affiliate.activated` and `affiliate_sale.created` webhook events — which echo the same identifiers — to the Meta Conversions API so your media team can optimize on approvals and revenue.
* **CRM sync**: pass your internal applicant `id`; it comes back as `attribution.external_id` on webhook events for painless matching.


## OpenAPI

````yaml POST /campaign_applications
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_applications:
    post:
      summary: Create Campaign Application
      description: >-
        Submits an applicant from your own signup form directly into a Growi
        campaign. Creates the creator account if needed and stores marketing
        attribution (Meta click ids, UTMs, TikTok enrichment) that is echoed
        back on outbound webhook events. Idempotent: repeat submissions for the
        same email + campaign return the existing application.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewCampaignApplication'
      responses:
        '200':
          description: >-
            Repeat submission — the existing application is returned and new
            attribution keys are merged
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
        '201':
          description: Application created
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      invitation_id:
                        type: integer
                        description: The application's id
                      status:
                        type: string
                        description: pending, or accepted when the campaign auto-accepts
                      user_id:
                        type: integer
                        description: The creator's Growi user id
                      campaign_id:
                        type: integer
                      created:
                        type: boolean
                        description: true when a new application was created
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Read-only API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Campaign not found for your organization
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    NewCampaignApplication:
      type: object
      required:
        - campaign_id
        - email
      properties:
        campaign_id:
          type: integer
          description: Growi campaign the applicant is applying to
        email:
          type: string
          description: Applicant's email address
        first_name:
          type: string
          description: Applicant's first name
        last_name:
          type: string
          description: Applicant's last name
        tiktok_handle:
          type: string
          description: >-
            TikTok handle or profile URL — the account is attached to the
            creator's profile
        id:
          type: integer
          description: Your internal applicant id, stored as attribution external_id
        created_at:
          type: string
          description: >-
            When the applicant submitted your form, stored as attribution
            submitted_at
        fbp:
          type: string
          description: Meta browser id cookie (_fbp)
        fbc:
          type: string
          description: Meta click id cookie (_fbc)
        fbclid:
          type: string
          description: Meta click id from the landing page URL
        event_id:
          type: string
          description: >-
            Your event id — echoed back on webhook events so you can deduplicate
            against Meta Conversions API
        event_name:
          type: string
          description: Your event name (e.g. AffiliateLead)
        event_source_url:
          type: string
          description: URL the applicant submitted the form from
        client_ip_address:
          type: string
          description: Applicant's IP address
        client_user_agent:
          type: string
          description: Applicant's browser user agent
        referrer:
          type: string
          description: HTTP referrer of the signup page
        utm_source:
          type: string
        utm_medium:
          type: string
        utm_campaign:
          type: string
        utm_content:
          type: string
        utm_term:
          type: string
        follower_count:
          type: integer
          description: Applicant's TikTok follower count
        likes_count:
          type: integer
          description: Applicant's TikTok likes count
        video_count:
          type: integer
          description: Applicant's TikTok video count
        tiktok_verified:
          type: integer
          description: 1 when the TikTok account is verified
        enriched_at:
          type: string
          description: When you enriched the TikTok profile data
    Error:
      required:
        - error
        - message
      type: object
      properties:
        error:
          type: string
        message:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````