> ## Documentation Index
> Fetch the complete documentation index at: https://docs.salesfinity.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a note

> Attaches a plain-text note to a person (a Contact) or a company (a Company). You identify the target by what you already know about it, such as an email address, a LinkedIn URL or a website, instead of by contact-list and contact IDs.

**Matching.** For `type: "person"`, Salesfinity tries the identifiers you send in this order and uses the first that matches a contact on your team: `crm_id`, then the username in `linkedin_url`, then `email`, then `phone`. `crm_id`, `email` and `phone` must equal the stored value exactly; emails are stored in lowercase. For `type: "company"`, it tries the hostname of `website_url` (lowercased, without `www.`), then `name`, compared case-insensitively against the whole company name.

**Side effects.** If nothing matches, a minimal Contact or Company is created from the identifiers you sent and the note is attached to it. For a new person, `company_name` and `company_website` also link the contact to a company, matched or created the same way. Identifiers that belong to the other `type` are accepted and ignored.

**Retries.** Not idempotent: every successful call adds another note. If a request times out, check with [List notes](/api-reference/endpoint/list-notes) before sending it again.

`user_id` is the author and must be a member of the team that owns the API key; member IDs come from [the team endpoint](/api-reference/endpoint/get-team). Only the author can later [update](/api-reference/endpoint/update-note) or [delete](/api-reference/endpoint/delete-note) the note.

Attaches a plain-text note to a **person** (a Contact) or a **company** (a Company). You name the target by what you already know about it, such as an email address, a LinkedIn URL or a website, instead of by contact-list and contact IDs, so you can attach a note without looking the person up in a list first.

If no matching record exists yet, Salesfinity creates a minimal Contact or Company from the identifiers you send and attaches the note to it.

### How the target is matched

Salesfinity tries the identifiers you send in the order below and uses the first one that matches a record on your team. The others are not checked against it.

| `type` | Order tried | How each identifier is compared |
| - | - | - |
| `person` | `crm_id`, `linkedin_url`, `email`, `phone` | `crm_id`: equal to the CRM record ID Salesfinity imported. `linkedin_url`: the username after `/in/`. `email` and `phone`: equal to the stored value. |
| `company` | `website_url`, `name` | `website_url`: the hostname, lowercased and without `www.`. `name`: the whole name, case-insensitive. |

Send at least one identifier for the chosen `type`. Identifiers that belong to the other `type` are accepted and ignored.

<Warning>
  Emails are compared exactly, and Salesfinity stores them in lowercase. Send `jane@acme.com`, not `Jane@Acme.com`: a mixed-case address that matches nobody creates a second contact for the same person.
</Warning>

### Request body

| Field | Type | Required | Max length | Description |
| - | - | - | - | - |
| `type` | string | Yes | — | `person` or `company`. Decides which identifier fields apply. |
| `user_id` | string | Yes | — | ID of the team member who authors the note, a 24-character hex string. Must be a member of the team that owns the API key; get member IDs from [the team endpoint](/api-reference/endpoint/get-team). |
| `content` | string | Yes | 10,000 | Plain text of the note. Cannot be empty. |

#### Person identifiers (`type: "person"`)

Supply **at least one** of:

| Field | Type | Max length | Description |
| - | - | - | - |
| `crm_id` | string | 200 | The contact's record ID in your connected CRM, as Salesfinity imported it, for example a Salesforce Contact ID such as `0035e00000AbCdEAAZ`. No source prefix. |
| `linkedin_url` | string | 500 | LinkedIn profile URL. The username after `/in/` is matched. |
| `email` | string | 320 | Email address, in lowercase. Must be a valid email address. |
| `phone` | string | 50 | Phone number in E.164 format. A newly created contact stores it as a mobile number. |

Optionally, link a company when a **new** Contact has to be created. Both are ignored when the person already exists.

| Field | Type | Max length | Description |
| - | - | - | - |
| `company_name` | string | 300 | Company name, matched or created like a company note's `name`. |
| `company_website` | string | 500 | Company website, matched or created like a company note's `website_url`. |

#### Company identifiers (`type: "company"`)

Supply **at least one** of:

| Field | Type | Max length | Description |
| - | - | - | - |
| `website_url` | string | 500 | Company website. `https://www.acme.com/about` matches a company whose website is `acme.com`. |
| `name` | string | 300 | Company name, matched case-insensitively against the whole name. A new company is named exactly as sent. |

### Example request: person

```json theme={"system"}
{
  "type": "person",
  "user_id": "507f1f77bcf86cd799439033",
  "content": "Mentioned moving back from Lisbon next quarter.",
  "email": "jane@acme.com",
  "company_name": "Acme Corp"
}
```

### Example request: company

```json theme={"system"}
{
  "type": "company",
  "user_id": "507f1f77bcf86cd799439033",
  "content": "Renewal owner is the new VP of Ops. Loop her in before Q3.",
  "website_url": "https://acme.com"
}
```

### Response (201)

Returns the created [note object](/api-reference/endpoint/list-notes#note-object). A person note has `contact` set; a company note has `company` set.

### Retries

Creating a note is not idempotent: every successful call adds another note. If a request times out, call [List notes](/api-reference/endpoint/list-notes) with the same identifiers before you send it again.

Only the author, the `user_id` you send here, can later [update](/api-reference/endpoint/update-note) or [delete](/api-reference/endpoint/delete-note) the note. Any team member can [pin it](/api-reference/endpoint/pin-note).

### Errors

| Status | When |
| - | - |
| 400 | The body failed validation (no identifier for the chosen `type`, an invalid `email`, `content` empty or too long, an unknown field), or `user_id` is not a member of the team (`User is not a member of this team`). |


## OpenAPI

````yaml POST /v2/notes
openapi: 3.0.1
info:
  title: Salesfinity API
  description: >-
    The Salesfinity API is a JSON-over-HTTPS REST API for the Salesfinity
    parallel dialer.

    Use it to manage contact lists and notes, run the Sequencer, read call logs
    and AI call

    scores, pull team and SDR analytics, and enrich phone numbers and email
    addresses. Webhook

    subscriptions are managed in the Salesfinity dashboard rather than through
    this API.


    ## Base URL


    All requests go to `https://client-api.salesfinity.co`. There is no separate
    sandbox host;

    see the developer portal for the recommended way to test safely.


    ## Authentication


    Every operation requires an API key sent in the `x-api-key` request header.
    Generate a key

    in the Salesfinity dashboard under **Settings → Connections → API &
    Webhooks**. A key is scoped to a

    single team, and every response is filtered to that team.


    ```bash

    curl https://client-api.salesfinity.co/v1/team \
      --header 'x-api-key: YOUR_API_KEY'
    ```


    ## Errors


    Every error the API returns is JSON with the same four fields, so a client
    can parse a

    failure the same way on every endpoint:


    ```json

    {
      "message": "Forbidden resource",
      "error": "Forbidden",
      "statusCode": 403,
      "request_id": "0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10"
    }

    ```


    `statusCode` matches the HTTP status. `error` is the stable reason phrase to
    branch on.

    `message` is human readable, and is an array of strings when request
    validation fails.

    `request_id` identifies the request in Salesfinity's logs; include it when
    you contact

    support. Note that a missing or invalid API key returns **403**, not 401.


    ## Request IDs


    Every response carries an `X-Request-Id` header, and an error body repeats
    it as

    `request_id`. To trace a request end to end, send your own `X-Request-Id`: 1
    to 128

    characters of letters, digits, `.`, `_`, `:` and `-`. Otherwise Salesfinity
    generates one.


    ## Request bodies


    Bodies are JSON. A field the operation does not define is rejected with
    **400**

    (`property <name> should not exist`). A body may be up to 10 MB on
    `/v1/contact-lists` and

    `/v2/sequencer`, and up to 1 MB everywhere else; a larger one gets **413**.


    Writes that record a person take a `user_id`: the team member the call acts
    as. On

    contact lists and notes, a `user_id` that is not on the team gets **400**.
    On the Sequencer

    it must be an active member, or the call gets **403**.


    ## Pagination


    List endpoints accept `page` (1-based) and `limit` query parameters.
    Defaults, maximums and

    the response envelope differ by endpoint family, so read the `limit`
    parameter and the

    response schema on the operation itself. Scored calls and every paged
    `/v2/sequencer`

    list return `{ data, pagination: { total, page, limit, pages } }`. Call logs
    return that shape

    when a `filters[...]` parameter is sent, and `{ data, pagination: { total,
    page, next } }`

    otherwise.


    ## Rate limits


    Limits are per team: every API key on a team shares them. Requests are
    counted per bucket in

    fixed one-minute windows that start on the minute.


    | Bucket | Routes | Requests per minute |

    |---|---|---|

    | Sequencer reads | `GET /v2/sequencer/*` | 600 |

    | Sequencer writes | `POST`, `PATCH`, `PUT` and `DELETE` on
    `/v2/sequencer/*` | 300 |

    | Heavy reads | `GET /v1/call-log` and `GET /v1/scored-calls` (the lists),
    `/v1/analytics/*`, `/v1/sequences` and `/v1/sequences/{id}` | 120 |

    | Everything else | All other endpoints | 1200 |


    Every response to an authenticated request carries `X-RateLimit-Limit`,

    `X-RateLimit-Remaining` and `X-RateLimit-Reset` (seconds until the window
    resets). Over the

    limit the API returns **429** with a `Retry-After` header giving the seconds
    to wait. These

    are the current limits; Salesfinity gives notice before lowering them.


    ## Idempotency


    `POST` endpoints outside the Sequencer are not idempotent: cap retries, and
    confirm state with

    a `GET` before retrying a create. Every `POST /v2/sequencer/*` endpoint
    except the three

    `/preview` endpoints accepts an `Idempotency-Key` header. Keys are kept for
    24 hours per team.

    A retry with the same key and the same request replays the original
    successful response. The

    same key with a different body or path returns **409**, and so does a retry
    while the first

    request is still running, which is safe to repeat after a moment. A request
    that fails frees

    its key, so a retry after a 5xx runs the write again: confirm state with a
    `GET` before

    retrying a create that failed with a 5xx.
  version: 1.0.0
  termsOfService: https://salesfinity.ai/terms
  contact:
    name: Salesfinity Support
    email: hello@salesfinity.co
    url: https://support.salesfinity.ai
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://client-api.salesfinity.co
    description: Production. The only public Salesfinity API host.
security:
  - ApiKeyAuth: []
tags:
  - name: Contact Lists
    description: >-
      Create, read, merge, and delete CSV contact lists, add or remove the
      contacts inside them, and put a list's contacts in its dialing queue.
  - name: Teams
    description: >-
      Read the team that owns the API key, including its members, licenses, and
      statuses.
  - name: Dispositions
    description: Read the default and custom call outcomes configured for the team.
  - name: Sequences
    description: >-
      Read the external CRM sequences that appear on the team's call logs, with
      call counts and first and last use. Not the Salesfinity Sequencer, which
      is the Sequencer Sequences group.
  - name: Call Logs
    description: >-
      Read the raw call history for the team, with filtering, sorting, and
      pagination.
  - name: Analytics
    description: Aggregated call metrics for the team, by contact list, and by SDR.
  - name: Snoozed Contacts
    description: Read and manage contacts that have been snoozed out of the dialing queue.
  - name: Follow-up Tasks
    description: Read follow-up tasks created from call outcomes.
  - name: Custom Fields
    description: Read the custom field mappings configured for the team.
  - name: Scored Calls
    description: Read AI-scored calls with per-facet scoring and coaching recommendations.
  - name: Notes
    description: >-
      Attach freeform notes to a person or company, list them, and pin the ones
      that matter.
  - name: Enrichment
    description: >-
      Look up phone numbers and work or personal email addresses for a LinkedIn
      profile, and check the team's remaining enrichment credits.
  - name: Sequencer Sequences
    description: >-
      Create, configure, enable and duplicate Sequencer cadences, and read their
      analytics. Distinct from the Sequences group, which lists sequence names
      observed on call logs from an external CRM.
  - name: Sequencer Steps
    description: The ordered steps that make up a cadence.
  - name: Sequencer Templates
    description: Reusable email subjects and bodies that email steps send from.
  - name: Sequencer Enrollments
    description: >-
      Contacts inside a sequence: where they are in the cadence, and the verbs
      that move them. Bulk verbs take up to 500 enrollments.
  - name: Sequencer Enrolment Runs
    description: >-
      Background enrollment of up to 5,000 contacts at a time, and the preview
      that shows what a batch would do.
  - name: Sequencer Tasks
    description: The rep task queue a cadence produces, plus standalone one-off tasks.
  - name: Sequencer Suppression
    description: >-
      The team do-not-contact list, checked when someone is enrolled and again
      before every email is sent.
  - name: Sequencer Policies
    description: 'Rules of engagement: what may be enrolled, and what happens at each step.'
  - name: Sequencer Settings
    description: Team-level sequencer settings and sending mailboxes. Read-only.
externalDocs:
  description: Salesfinity API documentation
  url: https://docs.salesfinity.ai
paths:
  /v2/notes:
    post:
      tags:
        - Notes
      summary: Create a note
      description: >-
        Attaches a plain-text note to a person (a Contact) or a company (a
        Company). You identify the target by what you already know about it,
        such as an email address, a LinkedIn URL or a website, instead of by
        contact-list and contact IDs.


        **Matching.** For `type: "person"`, Salesfinity tries the identifiers
        you send in this order and uses the first that matches a contact on your
        team: `crm_id`, then the username in `linkedin_url`, then `email`, then
        `phone`. `crm_id`, `email` and `phone` must equal the stored value
        exactly; emails are stored in lowercase. For `type: "company"`, it tries
        the hostname of `website_url` (lowercased, without `www.`), then `name`,
        compared case-insensitively against the whole company name.


        **Side effects.** If nothing matches, a minimal Contact or Company is
        created from the identifiers you sent and the note is attached to it.
        For a new person, `company_name` and `company_website` also link the
        contact to a company, matched or created the same way. Identifiers that
        belong to the other `type` are accepted and ignored.


        **Retries.** Not idempotent: every successful call adds another note. If
        a request times out, check with [List
        notes](/api-reference/endpoint/list-notes) before sending it again.


        `user_id` is the author and must be a member of the team that owns the
        API key; member IDs come from [the team
        endpoint](/api-reference/endpoint/get-team). Only the author can later
        [update](/api-reference/endpoint/update-note) or
        [delete](/api-reference/endpoint/delete-note) the note.
      operationId: create-note
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateNoteDTO'
      responses:
        '201':
          description: The note was created. The body is the note.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NoteDTO'
              example:
                _id: 6703f1c2a9e4b8d1c2f3a4b5
                team: 507f1f77bcf86cd799439012
                author:
                  _id: 507f1f77bcf86cd799439033
                  first_name: Maya
                  last_name: Chen
                  email: maya@yourco.com
                content: Mentioned moving back from Lisbon next quarter.
                is_pinned: false
                contact: 6703f1c2a9e4b8d1c2f3a4b6
                createdAt: '2026-10-03T14:05:11.482Z'
                updatedAt: '2026-10-03T14:05:11.482Z'
        '400':
          description: >-
            The body failed validation, or `user_id` is not a member of the
            team. Validation failures return `message` as an array with one
            entry per problem: no identifier for the chosen `type`, `type` not
            `person` or `company`, `user_id` not an ID, `email` not an email
            address, `content` empty or over 10,000 characters, a field over its
            maximum length, or a field this endpoint does not accept. A
            `user_id` outside the team returns the string `User is not a member
            of this team`.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message:
                  - >-
                    Person notes require at least one identifier: linkedin_url,
                    email, crm_id, or phone
                error: Bad Request
                statusCode: 400
                request_id: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    CreateNoteDTO:
      type: object
      required:
        - type
        - user_id
        - content
      properties:
        type:
          type: string
          enum:
            - person
            - company
          example: person
          description: >-
            Kind of record to attach the note to: `person` (a contact) or
            `company`. Decides which identifier fields apply.
        user_id:
          type: string
          description: >-
            ID of the team member who authors the note, a 24-character hex
            string. Must be a member of the team that owns the API key. Only
            this member can later edit or delete the note.
          example: 507f1f77bcf86cd799439033
        content:
          type: string
          maxLength: 10000
          description: Plain text of the note, 1 to 10,000 characters.
          example: Mentioned moving back from Lisbon next quarter.
        linkedin_url:
          type: string
          maxLength: 500
          example: https://www.linkedin.com/in/janedoe
          description: >-
            LinkedIn profile URL. Person only. The username after `/in/` is
            extracted and matched. Person notes need at least one of
            `linkedin_url`, `email`, `crm_id` or `phone`.
        email:
          type: string
          format: email
          maxLength: 320
          example: jane@acme.com
          description: >-
            Email address. Person only. Must be a valid email address. Matched
            exactly, and Salesfinity stores emails in lowercase, so send it in
            lowercase; a mixed-case address that matches nobody creates a new
            contact.
        crm_id:
          type: string
          maxLength: 200
          example: 0035e00000AbCdEAAZ
          description: >-
            The contact's record ID in your connected CRM, as Salesfinity
            imported it (for example a Salesforce Contact ID or a HubSpot
            contact ID). Person only. Matched exactly.
        phone:
          type: string
          maxLength: 50
          example: '+14155552671'
          description: >-
            Phone number in E.164 format. Person only. Matched exactly against
            the contact's stored numbers; saved as a mobile number on a newly
            created contact.
        company_name:
          type: string
          maxLength: 300
          example: Acme Corp
          description: >-
            Company to link a newly created contact to, matched or created like
            a company note's `name`. Person only. Ignored when the person
            already exists.
        company_website:
          type: string
          maxLength: 500
          example: https://acme.com
          description: >-
            Website of the company to link a newly created contact to, matched
            or created like a company note's `website_url`. Person only. Ignored
            when the person already exists.
        website_url:
          type: string
          maxLength: 500
          example: https://acme.com
          description: >-
            Company website. Company only. Matched on its hostname, lowercased
            and without `www.`, so `https://www.acme.com/about` matches
            `acme.com`. Company notes need at least one of `website_url` or
            `name`.
        name:
          type: string
          maxLength: 300
          example: Acme Corp
          description: >-
            Company name. Company only. Matched case-insensitively against the
            whole name. A company created from it is named exactly as sent.
      example:
        type: person
        user_id: 507f1f77bcf86cd799439033
        content: Mentioned moving back from Lisbon next quarter.
        email: jane@acme.com
        company_name: Acme Corp
    NoteDTO:
      type: object
      properties:
        _id:
          type: string
          description: Note ID.
          example: 6703f1c2a9e4b8d1c2f3a4b5
        team:
          type: string
          description: Team that owns the note.
          example: 507f1f77bcf86cd799439012
        author:
          allOf:
            - $ref: '#/components/schemas/NoteAuthorDTO'
          description: >-
            The author, with `first_name`, `last_name`, `email` and `image` when
            Salesfinity has them. `null` if the author's user record no longer
            exists.
        content:
          type: string
          description: Plain text of the note.
        is_pinned:
          type: boolean
          description: Whether the note is pinned. `false` for a new note.
        pinned_at:
          type: string
          format: date-time
          nullable: true
          description: When the note was pinned. Absent when the note is not pinned.
        pinned_by:
          type: string
          nullable: true
          description: >-
            ID of the member who pinned the note. Absent when the note is not
            pinned.
        contact:
          type: string
          nullable: true
          description: >-
            ID of the contact the note is attached to. Present on person notes
            only.
        company:
          type: string
          nullable: true
          description: >-
            ID of the company the note is attached to. Present on company notes
            only.
        createdAt:
          type: string
          format: date-time
          description: When the note was created.
        updatedAt:
          type: string
          format: date-time
          description: When the note was last changed, including pin changes.
      example:
        _id: 6703f1c2a9e4b8d1c2f3a4b5
        team: 507f1f77bcf86cd799439012
        author:
          _id: 507f1f77bcf86cd799439033
          first_name: Maya
          last_name: Chen
          email: maya@yourco.com
        content: Mentioned moving back from Lisbon next quarter.
        is_pinned: false
        contact: 6703f1c2a9e4b8d1c2f3a4b6
        createdAt: '2026-10-03T14:05:11.482Z'
        updatedAt: '2026-10-03T14:05:11.482Z'
    Error:
      type: object
      title: Error
      description: >-
        The error envelope returned by every Salesfinity API error response. The
        shape is identical across all status codes and all endpoints, and
        `request_id` is present on every error the API returns.
      required:
        - message
        - error
        - statusCode
        - request_id
      properties:
        message:
          description: >-
            Human-readable description of the failure. A string for most errors,
            and an array of strings when request validation fails, with one
            entry per field that did not validate.
          oneOf:
            - type: string
            - type: array
              items:
                type: string
          example: Forbidden resource
        error:
          type: string
          description: >-
            Stable HTTP reason phrase for the status code, such as `Forbidden`.
            One exception: a 403 from a `/v2/sequencer` write whose `user_id`
            has no active plan or seat carries `NO_ACTIVE_PLAN` here. Branch on
            this rather than on `message`.
          example: Forbidden
        statusCode:
          type: integer
          format: int32
          description: >-
            HTTP status code, repeated in the body so it survives transports
            that drop it.
          example: 403
        request_id:
          type: string
          description: >-
            Identifies the request in Salesfinity's logs; the same value as the
            `X-Request-Id` response header. Include it when you contact support.
          example: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
        errors:
          type: array
          items:
            type: string
          description: >-
            Present on a few Sequencer errors, such as a rules-of-engagement
            policy whose rules fail the catalog check: one entry per problem.
            Other fields an upstream service sends are passed through unchanged
            too.
      example:
        message: Forbidden resource
        error: Forbidden
        statusCode: 403
        request_id: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
    NoteAuthorDTO:
      type: object
      properties:
        _id:
          type: string
          description: User ID of the author.
          example: 507f1f77bcf86cd799439033
        first_name:
          type: string
          example: Maya
        last_name:
          type: string
          example: Chen
        email:
          type: string
          example: maya@yourco.com
        image:
          type: string
          description: Profile image URL, when the author has one.
  headers:
    X-Request-Id:
      description: >-
        Identifies the request in Salesfinity's logs, and matches `request_id`
        in an error body. Echoes the `X-Request-Id` you sent when it is 1 to 128
        characters of letters, digits, `.`, `_`, `:` and `-`; otherwise
        Salesfinity generates one.
      schema:
        type: string
      example: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
    X-RateLimit-Limit:
      description: >-
        Requests allowed per minute in the rate-limit bucket this request
        counted against. Limits are per team: every API key on the team shares
        them.
      schema:
        type: integer
      example: 300
    X-RateLimit-Remaining:
      description: Requests left in the current one-minute window for this bucket.
      schema:
        type: integer
        minimum: 0
      example: 0
    X-RateLimit-Reset:
      description: >-
        Seconds until the current window ends and the bucket resets. At least 1
        and at most 60.
      schema:
        type: integer
        minimum: 0
      example: 12
    Retry-After:
      description: >-
        Seconds to wait before retrying: the time left in the current one-minute
        window. At least 1 and at most 60.
      schema:
        type: integer
        minimum: 0
      example: 12
  responses:
    Forbidden:
      description: >-
        Forbidden. The `x-api-key` header is missing, malformed, revoked, or
        belongs to another team. Send a valid key in the `x-api-key` header.
        Salesfinity returns 403 (not 401) for a missing, malformed, revoked, or
        wrong-team key. On an operation that takes a `user_id`, 403 can also
        mean that team member may not do this, for example a Sequencer call
        acting as an inactive member; `message` then says why. A `/v2/sequencer`
        write whose `user_id` has no active plan or seat gets `error` set to
        `NO_ACTIVE_PLAN` instead of `Forbidden`; assign the member a seat.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Forbidden resource
            error: Forbidden
            statusCode: 403
            request_id: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
    TooManyRequests:
      description: >-
        Too Many Requests. The team has used its per-minute budget for this
        rate-limit bucket; the limit is shared by every API key on the team.
        Wait the number of seconds in the `Retry-After` header (never more than
        60), then retry. The request was refused before it ran, so retrying it
        is safe even for a write. Pace bulk work with the
        `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers. See
        /api-reference/rate-limits.
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Rate limit of 300 requests per minute exceeded. Retry in 12s.
            error: Too Many Requests
            statusCode: 429
            request_id: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
    InternalServerError:
      description: >-
        Internal Server Error. Something went wrong on the Salesfinity side.
        Retry with exponential backoff. If it persists, contact
        hello@salesfinity.co with the `request_id` from the body, the request
        path and the timestamp. The contact-list, snoozed-contact and note
        routes do not validate an ID in the path, and the analytics routes do
        not validate `user_ids`: an ID that is not a 24-character hexadecimal
        string returns 500 there, and retrying does not help, so check the ID
        first.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/X-Request-Id'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Internal server error
            error: Internal Server Error
            statusCode: 500
            request_id: 0f6d3c52-9f3e-4c1a-a4b8-2b1f7e5d9c10
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Team-scoped API key generated in the Salesfinity dashboard under
        Settings → Connections → API & Webhooks. A missing or invalid key
        returns HTTP 403.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.