---
title: "Create a Buyer Persona"
method: POST
path: "/v1/buyer-personas"
tags: ["Buyer Personas", "v1"]
---

# Create a Buyer Persona

`POST /v1/buyer-personas`

Create a new buyer persona in the account.

Credit Note: Creating a buyer persona does not consume credits.

:::info
Requires the `buyer_personas:write` OAuth2 scope.
:::

## Query parameters

- `account_id` string, required

## Request body

- BuyerPersonaRequestV1
  - `data` object, required
    - `type` 'buyer_persona', required — The type of the object
    - `attributes` object, required
      - `name` string, required — The human-readable name of the buyer persona
      - `filters` object, required — Contact-level filter criteria that define the buyer persona, grouped by category. At least one category must be present and non-empty. Omit a category rather than sending it empty.
        - `department` object[] — Department filters.
          - `search_value` 'business_project_management_department' | 'consulting_department' | 'engineering_department' | 'finance_controlling_department' | 'hr_department' | 'it_department' | 'legal_compliance_department' | 'logistics_department' | 'management_department' | 'marketing_department' | 'media_communications_department' | 'product_department' | 'production_department' | 'purchasing_department' | 'qm_department' | 'rd_department' | 'sales_department' | 'students_apprentices' | 'support_department' | 'unknown_department', required — The department a contact works in.
          - `display_value` string — Human-readable label for the department. Defaults to `search_value` when omitted.
          - `negated` boolean — When true, the filter excludes rather than includes contacts in this department.
        - `seniority` object[] — Seniority filters.
          - `search_value` 'top_management' | 'middle_management' | 'employees', required — How senior the contact is. Map job levels onto these three rather than inventing a code.
          - `display_value` string — Human-readable label for the seniority. Defaults to `search_value` when omitted.
          - `negated` boolean — When true, the filter excludes rather than includes contacts at this level.
        - `job_title` object[] — Job title keyword filters.
          - `search_value` string, required — Free text matched against the contact's job title.
          - `display_value` string — Human-readable label for the keyword. Defaults to `search_value` when omitted.
          - `negated` boolean — When true, the filter excludes rather than includes contacts whose title matches.
        - `location` object[] — Location filters.
          - `search_value` string, required — The place to match, in the form the entry's `type` expects.
          - `type` 'country_code' | 'continent' | 'region' | 'world_region' — What kind of place `search_value` names. `country_code` takes an ISO 3166-1 alpha-2 code (e.g. "DE"). `continent` takes one of `asia`, `north_america`, `africa`, `europe`, `south_america`, `antarctica`, `australia`. `world_region` takes one of `africa`, `latam`, `emea`, `amer`, `dach`, `apac`. `region` takes a state or province name.
          - `display_value` string — Human-readable label for the place. Defaults to `search_value` when omitted.
          - `negated` boolean — When true, the filter excludes rather than includes contacts in this place.

## Response `201`

Success

- object
  - `data` BuyerPersonaV1, required
    - `type` string, required — The type of the object
    - `id` string, required — The unique identifier for the buyer persona
    - `attributes` object, required
      - `name` string, required — The human-readable name of the buyer persona
      - `created_at` string, date-time, required — Date and time when the buyer persona was created
      - `filters` object, required — Filter criteria that define this buyer persona, grouped by filter category. Categories with no configured criteria are omitted. The object is empty when the buyer persona has no filters configured.
        - `department` object[] — Department filters.
          - `search_value` string — The internal value used to match this filter (e.g. industry code, country code, employee range identifier).
          - `display_value` string, required — The human-readable label of the filter value.
          - `negated` boolean, required — When true, the filter excludes (rather than includes) matching results.
        - `job_title` object[] — Job title keyword filters.
          - `search_value` string — The internal value used to match this filter (e.g. industry code, country code, employee range identifier).
          - `display_value` string, required — The human-readable label of the filter value.
          - `negated` boolean, required — When true, the filter excludes (rather than includes) matching results.
        - `location` object[] — Location filters.
          - `search_value` string — The internal value used to match this filter (e.g. industry code, country code, employee range identifier).
          - `display_value` string, required — The human-readable label of the filter value.
          - `negated` boolean, required — When true, the filter excludes (rather than includes) matching results.
        - `seniority` object[] — Seniority filters.
          - `search_value` string — The internal value used to match this filter (e.g. industry code, country code, employee range identifier).
          - `display_value` string, required — The human-readable label of the filter value.
          - `negated` boolean, required — When true, the filter excludes (rather than includes) matching results.
  - `meta` object, required
    - `request_id` string, required — A unique identifier assigned to each API request for end-to-end traceability.

## Other responses

- `400` — Bad Request
- `401` — Unauthorized. The request was rejected because the credentials are missing, invalid, expired, or have been revoked. The client must re-authenticate before retrying. Clients can differentiate via the `code` value of the first item in `errors`.
- `403` — Forbidden. The credentials are valid but the caller is not authorized to perform the request — typically because the user lacks the required permission, the OAuth scope is insufficient, the subscription plan does not include the required entitlement, the `account_id` does not belong to the authenticated user, or the target list is read-only and its members cannot be modified. Clients can differentiate via the `code` value of the first item in `errors`.
- `422` — Unprocessable entity
- `429` — Too many requests. Either the per-second rate limit or the monthly quota configured for the API key / OAuth application has been exceeded. Clients can differentiate via the `code` value of the first item in `errors`.
- `500` — Internal server error
- `504` — Server timeout

---

[API](https://skmtc.net/leadfeeder/apis/leadfeeder-public-api.md) · [All operations](https://skmtc.net/leadfeeder/apis/leadfeeder-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/leadfeeder/leadfeeder-public-api/revisions/3818d08d92d0/schema)
