---
title: "Create a partner"
method: POST
path: "/v1/partners"
tags: ["Partners"]
---

# Create a partner

`POST /v1/partners`

## Request

- Base URL: `https://api.affiliaterail.com`
- URL: `https://api.affiliaterail.com/v1/partners`
- Auth: HTTP bearer

Adds a partner directly (`status: active`) or into the review queue (`status: pending`). The handle is derived from the email when omitted. A duplicate answers 409 WITH the existing partner under `existing`, so you can connect it to your system without a second lookup.

**Scope:** `partners:write` (or `write`)

## Request body

- PartnerCreate
  - `program_id` string, required: Prefixed id (`prg_…`)
  - `email` string, email, required
  - `first_name` string
  - `last_name` string
  - `company_name` string
  - `website_url` string, uri
  - `country_code` string
  - `handle` string: 2 to 32 chars, letters, digits, hyphens. Derived from the email when omitted.
  - `group_id` string: Prefixed id (`grp_…`)
  - `status` 'active' | 'pending': `pending` puts the partner in the review queue instead of activating them
  - `metadata` object, nullable: Your own key/value data, stored as given

## Response `201`

The new partner

- Partner
  - `id` string, required: Prefixed id (`part_…`)
  - `object` 'partner', required
  - `program_id` string, required: Prefixed id (`prg_…`)
  - `group_id` string, nullable, required: Prefixed id (`grp_…`)
  - `email` string, email, required
  - `first_name` string, nullable, required
  - `last_name` string, nullable, required
  - `display_name` string, nullable, required
  - `company_name` string, nullable, required
  - `website_url` string, nullable, required
  - `country_code` string, nullable, required
  - `language_code` string, nullable, required
  - `handle` string, required: The `?ref=` value
  - `status` 'pending' | 'active' | 'declined' | 'suspended', required
  - `decline_reason` string, nullable, required
  - `suspension_reason` string, nullable, required
  - `currency` string, required: The program's currency; every amount on this partner is in it
  - `min_payout_minor` integer, nullable, required: Per-partner threshold override; null means the program's
  - `terms_accepted_at` string, date-time, nullable, required: ISO-8601, UTC
  - `terms_version` string, nullable, required
  - `completed_onboarding` boolean, required
  - `email_first_referral` boolean, required
  - `email_new_referral` boolean, required
  - `email_payout_paid` boolean, required
  - `metadata` object, nullable, required: Your own key/value data, stored as given
  - `stats` PartnerStats
    - `clicks` integer, required
    - `referrals` integer, required
    - `customers` integer, required
    - `commissions_minor` integer, required: Integer minor units (cents, pence). Never a float, never a string.
    - `paid_minor` integer, required: Integer minor units (cents, pence). Never a float, never a string.
    - `currency` string, required: ISO-4217
  - `created_at` string, date-time, required: ISO-8601, UTC
  - `updated_at` string, date-time, required: ISO-8601, UTC

## Other responses

- `400`: Invalid request
- `401`: Missing or unknown API key
- `403`: Key lacks the required scope
- `404`: No such object in your organization
- `409`: Email or handle already in use; the record you collided with rides along
- `422`: The request was understood and refused
- `429`: Rate limited: see Retry-After

---

[API](https://skmtc.dev/affiliaterail/apis/affiliaterail-api.md) · [All operations](https://skmtc.dev/affiliaterail/apis/affiliaterail-api/llms.txt) · [OpenAPI document](https://skmtc.dev/affiliaterail/apis/affiliaterail-api/revisions/ea41f345c092?raw)
