---
title: "Create a partner contact"
method: POST
path: "/partners/{identifier}/contacts"
tags: ["Partner Contacts"]
---

# Create a partner contact

`POST /partners/{identifier}/contacts`

## Request

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

Adds a contact to a partner, or returns the matching contact if one already exists.
Requires `partners_edit` permission.

### Upsert and retries
This endpoint is safe to retry and safe to call from a sync that re-sends the same people.
Lasso looks for an active contact at this partner carrying one of the CRM contact IDs you
sent, then for one with the same email:

- **Match**: `200 OK` with the existing contact. Any CRM IDs you sent that the contact does
  not have yet are linked to it. Nothing else in the request is applied: `name`, `title`,
  `phone_number`, `linkedin_url` and `send_invitation` are ignored. Use
  `PUT /partners/{identifier}/contacts/{contact_identifier}` to change a contact.
- **No match**: `201 Created` with the new contact. A person who was previously removed from
  this partner is restored rather than added twice.

Two identical requests sent at the same time produce one contact: the second waits for the
first and then returns it with `200`.

### CRM IDs
A CRM contact ID can belong to only one contact across all your partners, and a contact holds
at most one ID per CRM. Sending an ID another contact already holds, or a different ID from the
one this contact already holds for that CRM, is a `409` with `ALREADY_LINKED`. Links cannot be
removed through the API, so an empty CRM ID is a `422` with `CANNOT_BE_CLEARED`.

### Who can be added
A new contact gets the `finance_legal_contact` role: in the partner portal they can see payments,
add payout details and tax forms, and read and sign agreements, but cannot manage the partner's
team. If the email belongs to someone who already has a
Lasso login but is not yet a contact or team member in your account, the request is refused
with `422` and `EMAIL_UNAVAILABLE`; add them from the Lasso admin dashboard instead.

### Response body
A key that also holds `partners_read` gets the full contact. A key with `partners_edit` alone
gets only `{"contact": {"slug": "..."}}`, which is enough to address the contact afterwards.

## Path parameters

- `identifier` string, required

## Query parameters

- `by` 'slug' | 'id' | 'lasso_key' | 'name' | 'external'
- `external_system_type` string
- `external_object_type` string

## Request body

- object
  - `email` string, email, required: The contact's email. Always required, including when matching on a CRM ID.
  - `name` string: The contact's full name. Required to create a new contact.
  - `phone_number` string
  - `title` string
  - `linkedin_url` string
  - `send_invitation` boolean: Email the new contact an invitation to the partner portal. Sent only when the contact is created (not on a match), and only when the partner's type has portal access enabled.
  - `hubspot_contact_id` string
  - `salesforce_contact_id` string
  - `pipedrive_person_id` string

## Response `200`

A matching contact already existed and was returned. Only missing CRM IDs were added.

- object
  - `contact` PartnerContact: A contact at a partner organization (shown as a Partner Contact in Lasso).
    - `slug` string: The contact's Lasso key. Use it to address the contact in the path.
    - `partner_slug` string
    - `name` string, nullable
    - `email` string, nullable
    - `phone_number` string, nullable
    - `title` string, nullable
    - `linkedin_url` string, nullable
    - `role` string, nullable: The contact's role at the partner, which decides what they can see and do in the partner portal.
    - `status` 'active' | 'deleted'
    - `external_ids` ExternalId[]: CRM records linked to this contact.
      - `system_type` string, required: e.g. HUBSPOT, SALESFORCE, PIPEDRIVE
      - `object_type` string, required: e.g. company, contact, deal, opportunity, account
      - `identifier` string, required
    - `created_at` string, date-time
    - `updated_at` string, date-time

## Other responses

- `201`: Contact created
- `401`: Missing or invalid API key
- `403`: API key lacks required permission
- `404`: Resource not found
- `409`: A CRM contact ID you sent is already linked to another contact, or this contact already holds a different ID for that CRM
- `422`: The contact could not be created. Messages include `REQUIRED` (`email`, or `name` for a new contact), `EMAIL_UNAVAILABLE` (`email`), `CANNOT_BE_CLEARED` (an empty CRM ID), and `MULTIPLE_PARTNERS_FOUND` (`identifier`, for an ambiguous `?by=name`).
- `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)
