openapi: 3.0.1
info:
title: FirstPromoter Admin Commissions Webhooks API
version: '2.0'
description: REST API for managing affiliate programs, promoters, campaigns, referrals, rewards, and payouts in FirstPromoter. Supports pagination, filtering, and full CRUD operations across all affiliate program resources.
contact:
url: https://docs.firstpromoter.com
license:
name: Proprietary
url: https://firstpromoter.com/terms
servers:
- url: https://api.firstpromoter.com/api/v2
description: Production server
security:
- BearerAuth: []
tags:
- name: Webhooks
paths:
/company/webhooks:
get:
summary: List webhook subscriptions
tags:
- Webhooks
description: "Returns a paginated list of all webhook subscriptions for your account, ordered by creation date descending. \n **HTTP Request**
`GET https://api.firstpromoter.com/api/v2/company/webhooks`"
parameters:
- $ref: '#/components/parameters/AccountId'
- name: per_page
in: query
schema:
type: integer
default: 25
description: Number of results per page.
- name: page
in: query
schema:
type: integer
default: 1
description: Page number.
responses:
'200':
description: Paginated list of webhook subscriptions
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/WebhookSubscription'
'401':
description: Unauthorized
'403':
description: Forbidden
post:
summary: Create a webhook subscription
tags:
- Webhooks
description: "Creates a new webhook subscription. The `secret_key` is auto-generated and returned only in this response — store it immediately. \n **HTTP Request**
`POST https://api.firstpromoter.com/api/v2/company/webhooks`"
parameters:
- $ref: '#/components/parameters/AccountId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSubscriptionInput'
responses:
'201':
description: Subscription created
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSubscription'
'401':
description: Unauthorized
'403':
description: Forbidden
'422':
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/company/webhooks/event_types:
get:
summary: List supported event types
tags:
- Webhooks
description: "Returns a sorted list of all event type strings that can be subscribed to. Use these values in the `event_types` array when creating or updating a subscription. \n **HTTP Request**
`GET https://api.firstpromoter.com/api/v2/company/webhooks/event_types`"
parameters:
- $ref: '#/components/parameters/AccountId'
responses:
'200':
description: List of supported event types
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: string
example:
- commission.created
- commission.deleted
- commission.updated
- contract_document.signed
- payments_batch.created
- payments_batch.deleted
- payments_batch.updated
- payout.commissions.created
- payout.commissions.deleted
- payout.commissions.updated
- payout.created
- payout.deleted
- payout.updated
- payout_method.created
- payout_method.deleted
- payout_method.updated
- promoter.balance.updated
- promoter.created
- promoter.deleted
- promoter.profile.updated
- promoter.updated
- promoter_campaign.created
- promoter_campaign.deleted
- promoter_campaign.updated
- referral.created
- referral.deleted
- referral.moved
- referral.updated
'401':
description: Unauthorized
'403':
description: Forbidden
/company/webhooks/test:
post:
summary: Send a test webhook delivery
tags:
- Webhooks
description: "Sends a sample payload for the given event type to the specified URL immediately. Useful for verifying that your endpoint is reachable and processing payloads correctly before creating a subscription. \n\n The signature in the test request is generated with a random secret (not a saved subscription's secret), so signature verification will fail — this is expected during testing. \n\n Returns the HTTP status and body received from your endpoint. \n **HTTP Request**
`POST https://api.firstpromoter.com/api/v2/company/webhooks/test`"
parameters:
- $ref: '#/components/parameters/AccountId'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- url
- event_type
properties:
url:
type: string
format: uri
description: The URL to send the test payload to. Must be a public URL — requests to private/internal networks are blocked.
event_type:
type: string
description: The event type to generate a sample payload for. Use any value from the `event_types` endpoint.
basic_auth_user:
type: string
description: HTTP Basic Auth username to include in the test request.
basic_auth_password:
type: string
description: HTTP Basic Auth password to include in the test request.
headers:
type: object
description: Custom HTTP headers to include in the test request.
additionalProperties:
type: string
example:
X-Api-Key: my-secret-token
responses:
'200':
description: Test delivery sent — response mirrors what your endpoint returned.
'400':
description: Invalid URL (private network or malformed URI)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Unauthorized
'403':
description: Forbidden
/company/webhooks/{id}:
get:
summary: Get a webhook subscription
tags:
- Webhooks
description: "Returns the details of a single webhook subscription. \n **HTTP Request**
`GET https://api.firstpromoter.com/api/v2/company/webhooks/{id}`"
parameters:
- $ref: '#/components/parameters/AccountId'
- name: id
in: path
required: true
schema:
type: integer
description: ID of the webhook subscription.
responses:
'200':
description: Webhook subscription details
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSubscription'
'401':
description: Unauthorized
'403':
description: Forbidden
'404':
description: Not found
put:
summary: Update a webhook subscription
tags:
- Webhooks
description: "Updates an existing webhook subscription. Only fields you include in the request body are changed. \n **HTTP Request**
`PUT https://api.firstpromoter.com/api/v2/company/webhooks/{id}`"
parameters:
- $ref: '#/components/parameters/AccountId'
- name: id
in: path
required: true
schema:
type: integer
description: ID of the webhook subscription.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSubscriptionInput'
responses:
'200':
description: Subscription updated
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookSubscription'
'401':
description: Unauthorized
'403':
description: Forbidden
'404':
description: Not found
'422':
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
delete:
summary: Delete a webhook subscription
tags:
- Webhooks
description: "Permanently deletes a webhook subscription and all its delivery records. \n **HTTP Request**
`DELETE https://api.firstpromoter.com/api/v2/company/webhooks/{id}`"
parameters:
- $ref: '#/components/parameters/AccountId'
- name: id
in: path
required: true
schema:
type: integer
description: ID of the webhook subscription.
responses:
'200':
description: Subscription deleted successfully
'401':
description: Unauthorized
'403':
description: Forbidden
'404':
description: Not found
components:
schemas:
WebhookSubscription:
type: object
properties:
id:
type: integer
description: Unique ID of the subscription.
url:
type: string
format: uri
description: The endpoint URL that receives webhook payloads.
description:
type: string
nullable: true
description: Optional human-readable label for this subscription.
event_types:
type: array
items:
type: string
description: Event type strings this subscription is listening to.
example:
- referral.created
- commission.created
campaign_ids:
type: array
items:
type: integer
description: Campaign IDs that trigger this subscription. `[1]` means all campaigns.
example:
- 1
active:
type: boolean
description: Whether delivery is enabled. Set to `false` to pause without deleting.
timeout:
type: integer
description: 'Request timeout in seconds. Must be between 1 and 120. Default: 30.'
minimum: 1
maximum: 120
max_retries:
type: integer
description: 'Number of times a failed delivery is automatically retried. Must be between 0 and 10. Default: 3.'
minimum: 0
maximum: 10
headers:
type: object
description: Custom HTTP headers sent with every delivery request.
additionalProperties:
type: string
example:
Authorization: Bearer my-token
basic_auth_user:
type: string
nullable: true
description: HTTP Basic Auth username sent with every delivery. `null` if not configured.
basic_auth_enabled:
type: boolean
description: '`true` when both a Basic Auth username and password are set on this subscription.'
created_at:
type: string
format: date-time
description: ISO 8601 timestamp of when the subscription was created.
updated_at:
type: string
format: date-time
description: ISO 8601 timestamp of the last update.
WebhookSubscriptionInput:
type: object
properties:
url:
type: string
format: uri
description: The HTTPS URL that will receive webhook payloads. Required when creating.
event_types:
type: array
items:
type: string
description: One or more event type strings to subscribe to. Required when creating. Use the `event_types` endpoint to list all supported values.
example:
- referral.created
- commission.created
active:
type: boolean
description: Enable or pause delivery. Defaults to `true`.
timeout:
type: integer
description: Request timeout in seconds. Must be 1–120. Defaults to 30.
minimum: 1
maximum: 120
max_retries:
type: integer
description: Automatic retry count for failed deliveries. Must be 0–10. Defaults to 3.
minimum: 0
maximum: 10
description:
type: string
description: Optional human-readable label.
campaign_ids:
type: array
items:
type: integer
description: Restrict this subscription to events from specific campaigns. Pass `[1]` (the default) to receive events from all campaigns.
example:
- 1
headers:
type: object
description: Custom HTTP headers to include in every delivery request.
additionalProperties:
type: string
example:
Authorization: Bearer my-token
basic_auth_user:
type: string
description: HTTP Basic Auth username. Must be set together with `basic_auth_password`.
basic_auth_password:
type: string
description: HTTP Basic Auth password. Write-only — never returned in responses. Encrypted at rest.
Error:
type: object
properties:
message:
type: string
example: Invalid user type
code:
type: string
example: forbidden
parameters:
AccountId:
name: Account-ID
in: header
required: true
description: Account ID. You can find your Account ID on Your FirstPromoter Dashboard. Navigate to Settings → Integrations
schema:
type: string
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: API key passed as Bearer token