Donutwork Docs

Partners

Manage partner channels, commission settlement cycles, and partner-customer associations.

Partners API

The Partners API enables organizations to build and scale distribution networks through agencies, resellers, and affiliates. It provides a framework for managing partner identities, commission calculations (fees), and financial settlements (payouts), while maintaining clear attribution for every customer acquired through the channel.


Channel Management

List Partners

Retrieve a paginated directory of all registered partners. This list includes high-level identification data and current status for each collaborative entity.

GET
/2026-02-01/partners.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

sizeinteger
Maximum records per page (max 100).
pageinteger
Target page index.

Responses

Partner directory successfully retrieved.

{
  "entities": "Partner",
  "count": 24,
  "per_page": 100,
  "pages": {
    "current": 1,
    "max": 1
  },
  "elements": [
    {
      "id": "675d...",
      "name": "Global Solutions Agency",
      "external_id": "GSA-9921",
      "partner_code": "GOLD-PARTNER-X"
    }
  ]
}

Provision New Partner

Onboard a new partner into the ecosystem. This initializes their profile and associates them with a governance group (Partner Group) to define their commission rules.

POST
/2026-02-01/partners.json
Required permissionpartners:writeApiAccessPermission::PARTNERS_WRITE

Query Parameters

No query parameters required.

Request Body

JSON
{
  "partner": {
    "name": "Apex Marketing Group",
    "email": "channel@apex-marketing.com",
    "external_id": "APEX_001",
    "code": "APEXPROMO",
    "partner_group_id": "66bf22b0...",
    "address": {
      "vat_number": "IT09876543210",
      "country": "IT",
      "city": "Milan"
    }
  }
}
partner.namestringRequired
Legal entity name of the partner.
partner.emailstringRequired
Primary contact for financial and operational notifications.
partner.partner_group_idstring
The ID of the Partner Group define rules. If empty, the default group is used.
partner.address.countrystringRequired
ISO 3166-1 alpha-2 country code.

Responses

Partner successfully provisioned.

{
  "partner": {
    "id": "6768..."
  }
}

Retrieve Partner Profile

Fetch the comprehensive profile of a specific partner, including their fee structure, whitelist configuration, and association metadata.

GET
/2026-02-01/partners/{partnerId}.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

partnerIdstringRequired
The unique identifier of the partner.

Responses

Partner profile retrieved.

{
  "id": "66b136b9...",
  "name": "Apex Marketing Group",
  "status": "active",
  "tags": [
    "tier-1",
    "mfa-enabled"
  ],
  "email": "channel@apex-marketing.com",
  "address": {
    "city": "Milan",
    "country": "IT",
    "vat_number": "IT098..."
  }
}

Attribution & Performance

Audit Attributed Customers

Retrieve a paginated list of all customers currently attributed to a specific partner. This is used to verify channel performance and revenue attribution.

GET
/2026-02-01/partners/{partnerId}/customers.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

partnerIdstringRequired
The partner identifier.

Responses

Attributed customer list retrieved.

{
  "entities": "PartnerCustomers",
  "count": 142,
  "elements": [
    {
      "id": "68d2...",
      "company_name": "Acme Corp",
      "email": "procurement@acme.com",
      "status": "active"
    }
  ]
}

Performance Analytics

Retrieve high-level performance metrics for a partner, including total attributed revenue and cumulative commissions earned.

GET
/2026-02-01/partners/{partnerId}/stats.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

partnerIdstringRequired
The partner identifier.

Responses

Aggregated performance statistics retrieved.

{
  "total_revenue": "45200.00",
  "commission_earned": "4520.00",
  "currency": "EUR"
}

Financial Settlement (Payouts)

Audit Commission Ledger (Fees)

Retrieve individual commission entries (fees) generated by attributed customer transactions. These entries serve as the basis for payout generation.

GET
/2026-02-01/partners/{partnerId}/fees.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

partnerIdstringRequired
The partner identifier.

Responses

Commission ledger retrieved.

{
  "entities": "PartnerFees",
  "elements": [
    {
      "id": "fee_991",
      "source_charge": "ch_123",
      "fee_value": 15.5,
      "status": "pending"
    }
  ]
}

Generate Payout Request

Consolidate multiple 'pending' commission fees into a single Payout request. This initiates the financial settlement cycle and generates a draft settlement record.

POST
/2026-02-01/partners/payouts.json
Required permissionpartner_payouts:writeApiAccessPermission::PARTNER_PAYOUTS_WRITE

Query Parameters

No query parameters required.

Request Body

JSON
{
  "payout": {
    "partner_id": "675d...",
    "transactions": [
      "fee_991",
      "fee_992"
    ],
    "invoice": {
      "number": "INV-2026-001",
      "date": "2026-03-01"
    },
    "vat_settings": {
      "tax_id": "tax_vat_22"
    }
  }
}
payout.partner_idstringRequired
The partner identifier.
payout.transactionsarrayRequired
Collection of fee entry IDs.
payout.invoice.numberstringRequired
Reference number for the partner settlement invoice.

Responses

Payout request successfully generated.

{
  "id": "pay_5521",
  "total": "1250.00"
}

Retrieve Payout Documentation (PDF)

Retrieve a base64-encoded PDF report (Account Statement) for a specific payout. This document serves as the official settlement record for the partner.

GET
/2026-02-01/partners/{partnerId}/payouts/{payoutId}/report.json
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

partnerIdstringRequired
The partner identifier.
payoutIdstringRequired
The payout identifier.

Responses

PDF documentation retrieved.

{
  "stream": {
    "type": "application/pdf",
    "base64_content": "JVBER..."
  }
}

Technical Implementation (Payout Flow)

const payoutData = {
  payout: {
    partner_id: "PARTNER_6621",
    transactions: ["FEE_001", "FEE_002"],
    invoice: { number: "REF-9921", date: "2026-03-03" },
    vat_settings: { tax_id: "VAT_22_IT" }
  }
};

try {
  const settlement = await sdk.partners.createPayout(payoutData);
  console.log(`Settlement Processed. ID: ${settlement.id}, Total: ${settlement.total}`);
} catch (error) {
  console.error(`Settlement Failed: ${error.message}`);
}

Additional Partner Operations

Search Partner by External ID or Email

GET
/2026-02-01/partners/partner.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

externalIdstring
Partner external identifier.
emailstring
Partner email address.

Responses

Partner record retrieved.

{
  "id": "675d...",
  "name": "Apex Marketing Group",
  "email": "channel@apex-marketing.com"
}

Neither `externalId` nor `email` was provided.

{
  "error": "A valid \"externalId\" or \"email\" must be specified in the request"
}

Update Partner Profile

PUT
/2026-02-01/partners/{partnerId}.json
Required permissionpartners:writeApiAccessPermission::PARTNERS_WRITE

Query Parameters

partnerIdstringRequired
Partner identifier.

Request Body

JSON
{
  "partner": {
    "name": "Apex Marketing Group - Enterprise",
    "email": "enterprise@apex-marketing.com",
    "description": "Updated profile",
    "external_id": "APEX_001",
    "code": "APEXPROMO",
    "partner_group_id": "66bf22b0...",
    "tags": [
      "tier-1",
      "priority"
    ],
    "address": {
      "country": "IT",
      "city": "Milan"
    }
  }
}
partner.namestring
Updated partner legal name.
partner.emailstring
Updated partner contact email.
partner.descriptionstring
Updated profile description.
partner.external_idstring
Updated external identifier.
partner.codestring
Updated partner code.
partner.partner_group_idstring
Partner group assignment (empty string removes current group).
partner.tagsarray|string
Updated tags list.
partner.addressobject
Partial address update object.

Responses

Partner updated.

{
  "id": "675d...",
  "name": "Apex Marketing Group - Enterprise"
}

Delete Partner

DELETE
/2026-02-01/partners/{partnerId}.json
Required permissionpartners:writeApiAccessPermission::PARTNERS_WRITE

Query Parameters

partnerIdstringRequired
Partner identifier.

Responses

Partner deleted.

{
  "id": "675d...",
  "deleted": true
}

Partner has still attached customers.

{
  "error": "Unable to remove this partner. Customer attached to partner: ..."
}

Get Partner Fee by ID

GET
/2026-02-01/partners/{partnerId}/fees/{feeId}.json
Required permissionpartners:readApiAccessPermission::PARTNERS_READ

Query Parameters

partnerIdstringRequired
Partner identifier.
feeIdstringRequired
Fee entry identifier.

Responses

Partner fee entry retrieved.

{
  "id": "fee_991",
  "partner_id": "675d...",
  "fee_value": 15.5,
  "status": "pending"
}

List Global Payouts

GET
/2026-02-01/partners/payouts.json
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

sizeinteger
Maximum records per page (1-100).
pageinteger
Page index (1-based).

Responses

Paginated payout list across all partners.

{
  "entities": "PartnerPayout",
  "count": 3,
  "elements": []
}

List Payouts for One Partner

GET
/2026-02-01/partners/{partnerId}/payouts.json
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

partnerIdstringRequired
Partner identifier.
sizeinteger
Maximum records per page (1-100).
pageinteger
Page index (1-based).

Responses

Paginated payout list for the specified partner.

{
  "entities": "PartnerPayout",
  "count": 2,
  "elements": []
}

Get Payout by Partner and ID

GET
/2026-02-01/partners/{partnerId}/payouts/{payoutId}.json
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

partnerIdstringRequired
Partner identifier.
payoutIdstringRequired
Payout identifier.

Responses

Payout details retrieved.

{
  "id": "pay_5521",
  "partner_id": "675d...",
  "status": "pending",
  "total": 1250
}

Get Payout by ID

GET
/2026-02-01/partners/payouts/{payoutId}.json
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

payoutIdstringRequired
Payout identifier.

Responses

Payout details retrieved.

{
  "id": "pay_5521",
  "partner_id": "675d...",
  "status": "pending",
  "total": 1250
}

Update Payout Status

PUT
/2026-02-01/partners/payouts/{payoutId}/status.json
Required permissionpartner_payouts:writeApiAccessPermission::PARTNER_PAYOUTS_WRITE

Query Parameters

payoutIdstringRequired
Payout identifier.

Request Body

JSON
{
  "payout": {
    "status": "paid",
    "metadata": {
      "reference": "BANK-TRX-2026-8891"
    }
  }
}
payout.statusstringRequired
Next payout status. Allowed values: pending, paid, refused.
payout.metadataobject
Optional metadata merged into payout metadata.

Responses

Payout status updated and related fee entries synchronized.

{
  "payout": {
    "id": "pay_5521",
    "status": "paid"
  }
}

Invalid status transition.

{
  "error": "Paid payouts cannot be updated"
}

Stream Payout PDF

GET
/2026-02-01/partners/{partnerId}/payouts/{payoutId}/report.pdf
Required permissionpartner_payouts:readApiAccessPermission::PARTNER_PAYOUTS_READ

Query Parameters

partnerIdstringRequired
Partner identifier.
payoutIdstringRequired
Payout identifier.

Responses

Inline PDF stream response.

{
  "note": "Response is streamed as application/pdf."
}

On this page