---
title: "Create a contact (legacy flat URL shape)"
method: POST
path: "/v1/contacts/{projectId}"
tags: ["Contacts"]
---

# Create a contact (legacy flat URL shape)

`POST /v1/contacts/{projectId}`

## Request

- Base URL: `https://api.bluefox.email`
- URL: `https://api.bluefox.email/v1/contacts/{projectId}`
- Auth: HTTP bearer

Legacy flat URL shape, kept for backward compatibility - identical behavior to POST /v1/projectId/{projectId}/contacts above. Accepts an API key or a whitelisted Origin header (for client-side widget use).

## Path parameters

- `projectId` string, required

## Request body

- object
  - `email` string, required
  - `name` string
  - `tags` string[]

## Response `201`

Created

- object
  - `status` integer
  - `result` Contact: Custom contact field values are sent/received as flat top-level keys matching the field's name, not nested under a "customFields" object - e.g. after creating a field named "plan" via POST /v1/projectId/{projectId}/contacts/fields, set it with `{ "email": "x@y.com", "plan": "pro" }`. A key that does not match any registered field name is silently dropped (not an error) - it will not appear in the response, so a typo in a custom field name fails silently.
    - `_id` string
    - `email` string
    - `name` string
    - `tags` string[]
    - `_lists` string[]: Names of subscriber lists this contact belongs to.
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400`: Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
- `403`: Missing or invalid API key
- `405`: The operation is blocked by a business rule (e.g. the resource is still in use)

---

[API](https://skmtc.dev/bluefox/apis/bluefox-email-public-api.md) · [All operations](https://skmtc.dev/bluefox/apis/bluefox-email-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bluefox/apis/bluefox-email-public-api/revisions/fa1a0a835c7f?raw)
