# Teamleader — CRM API: gotchas

> Canonical URL: https://developers.apideck.com/apis/crm/teamleader/gotchas

## POST /crm/opportunities

The `primary_contact_id` is required in the request body
## GET /crm/notes

Teamleader only lists the notes of a single parent record, so one of `filter[contact_id]`, `filter[company_id]` or `filter[opportunity_id]` is required. Without one, Teamleader returns a `400` error ("filter must be present"). When more than one of these filters is sent, only one is used, in this order: `contact_id`, then `company_id`, then `opportunity_id`. Teamleader does not return a total record count, so `meta.total_count` will not appear. Notes are returned newest first. Note `content` is stored as Markdown, so special characters such as `[`, `]`, `*` and `_` are returned escaped (for example `\[text\]`), leading and trailing whitespace is trimmed, and line breaks are normalised. Notes attached to other Teamleader records (for example invoices or meetings) are not returned, because they can only be listed through those records. Leads in this connector are Teamleader contacts, so use `filter[contact_id]` with the lead id; `lead_id` is not returned on notes.

## POST /crm/notes

A Teamleader note is attached to exactly one parent record. When more than one of `contact_id`, `company_id` and `opportunity_id` is set, `contact_id` is used first, then `company_id`, then `opportunity_id`. One of `contact_id`, `company_id` or `opportunity_id` is required; without one, Teamleader returns a `400` error ("subject must be present"). Leads in this connector are Teamleader contacts, so pass a lead id as `contact_id`; `lead_id` is ignored. Only `content` is stored: `title`, `owner_id`, `activity_id` and `active` are ignored. `content` is required. Teamleader treats `content` as HTML and stores it as Markdown. A `<` directly followed by a letter (for example `a<b` or `List<String>`) is read as the start of an HTML tag, so the rest of the text can be cut off or altered even though the request succeeds. A `<` followed by a space or a number (for example `price < 5`) is kept. HTML tags such as `<b>` are converted to Markdown, whitespace is trimmed and special characters are returned escaped when the note is read back.

## PATCH /crm/notes/{id}

Only `content` can be updated. A note cannot be moved to another parent record: `contact_id`, `company_id` and `opportunity_id` are ignored on update, as are `title`, `owner_id`, `activity_id` and `active`. An update without `content` succeeds without changing the note; an empty `content` returns Teamleader's `400` error. Teamleader treats `content` as HTML and stores it as Markdown. A `<` directly followed by a letter (for example `a<b` or `List<String>`) is read as the start of an HTML tag, so the rest of the text can be cut off or altered even though the request succeeds.


[API reference](https://developers.apideck.com/apis/crm/reference.md) · [Coverage matrix](https://developers.apideck.com/apis/crm/coverage)
