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

# Create a partner

`POST /partners`

## Request

- Base URL: `https://api.lassotech.com/api/v1/rest`
- URL: `https://api.lassotech.com/api/v1/rest/partners`
- Auth: API key in header `x-lasso-access-token`

Create a new partner. When `email` is provided, a partner contact is created for that person
and invited unless `skip_email` is true. Requires `partners_create` permission.

`managed_by`, `tier` and `segment` are lookup objects, not plain strings, e.g.
`"tier": {"slug": "gold"}`. A value in any other shape is a `400`. A partner type, tier,
reward plan or manager that cannot be found is a `404`.

To add or manage more contacts after creation, use `/partners/{identifier}/contacts`.

## Request body

- object
  - `name` string, required: Partner name
  - `partner_type_slug` string, required: Slug of the partner type. Required to create a partner: missing or blank is a `400` (`REQUIRED`). The one exception is an idempotent retry: a request whose `partner_external_*` triple matches an existing partner returns that partner with `200` whether or not this is sent.
  - `email` string: Contact email. Creates a partner contact when provided, and is required when a contact CRM ID is sent.
  - `contact_name` string: Contact full name (takes precedence over first/last)
  - `contact_first_name` string: Contact first name (used when contact_name is not provided)
  - `contact_last_name` string: Contact last name (used when contact_name is not provided)
  - `contact_title` string
  - `contact_phone_number` string
  - `skip_email` boolean: Skip sending the invitation email. Must be the JSON boolean `true`.
  - `website_url` string
  - `partner_linkedin_url` string
  - `contact_linkedin_url` string
  - `managed_by` ManagedBy: Resolve manager by email or CRM owner ID
    - `email` string
    - `crm_system_type` string
    - `crm_owner_id` string
  - `managed_by_id` string: User ID of the manager (alternative to managed_by)
  - `tier` ResourceLookup: Lookup by slug, id, or name
    - `slug` string
    - `id` string
    - `name` string
  - `segment` ResourceLookup: Lookup by slug, id, or name
    - `slug` string
    - `id` string
    - `name` string
  - `payment_terms` 'due_on_invoice' | 'net_10' | 'net_15' | 'net_30' | 'net_45' | 'net_60' | 'net_90' | 'end_of_month'
  - `payment_frequency` 'monthly' | 'quarterly' | 'semi_annually' | 'yearly'
  - `agreement_template_ids` string[]
  - `hubspot_company_id` string: HubSpot company ID (partner-level)
  - `salesforce_account_id` string: Salesforce account ID (partner-level)
  - `pipedrive_organization_id` string: Pipedrive organization ID (partner-level)
  - `hubspot_contact_id` string: HubSpot contact ID (partner-user-level)
  - `salesforce_contact_id` string: Salesforce contact ID (partner-user-level)
  - `pipedrive_person_id` string: Pipedrive person ID (partner-user-level)
  - `partner_external_system_type` string: External system for a partner-level ID the flat CRM fields above don't cover. Use this for a CRM custom object, such as a HubSpot custom "Partner" object.
  - `partner_external_object_type` string: External object type. Free-form, so a new CRM shape needs no change here.
  - `partner_external_identifier` string: The external record's ID. All three `partner_external_*` fields are required together; sending only some of them is a `400` rather than a partner created without the link.

## Response `200`

A partner already carried the supplied `partner_external_*` record and was returned unchanged. This endpoint is idempotent on that triple, so re-running a CRM workflow will not create a duplicate partner. Returning the existing record is a read: a key without `partners_read` gets only `slug` and `crm_identifier`, which is enough to carry on. Note the flat `hubspot_company_id`-style fields do **not** dedupe: several partners may legitimately map to one CRM company.

- object
  - `partner` Partner
    - `slug` string
    - `name` string
    - `crm_identifier` string
    - `website_url` string, nullable
    - `linkedin_url` string, nullable
    - `status` 'active' | 'deleted'
    - `partner_type` string, nullable
    - `segment` string, nullable
    - `managed_by` string, nullable: Email of the managing user
    - `payment_terms` 'due_on_invoice' | 'net_10' | 'net_15' | 'net_30' | 'net_45' | 'net_60' | 'net_90' | 'end_of_month', nullable
    - `payment_frequency` 'monthly' | 'quarterly' | 'semi_annually' | 'yearly', nullable
    - `created_at` string, date-time
    - `updated_at` string, date-time

## Other responses

- `201`: Partner created
- `400`: `partner_type_slug` is missing, only some of the `partner_external_*` fields were sent, or a lookup object was malformed
- `401`: Missing or invalid API key
- `403`: API key lacks required permission
- `404`: The partner type, tier, reward plan or manager could not be found
- `422`: Validation error
- `429`: Rate limit exceeded. Wait the number of seconds in `Retry-After`, then retry.

---

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