---
title: "Create a Pinterest board"
method: POST
path: "/v1/accounts/{id}/pinterest/boards"
tags: ["Accounts"]
---

# Create a Pinterest board

`POST /v1/accounts/{id}/pinterest/boards`

## Request

- Base URL: `https://api.letmepost.dev`
- URL: `https://api.letmepost.dev/v1/accounts/{id}/pinterest/boards`
- Auth: HTTP bearer

Creates a board on the user's Pinterest account without sending them off-site. Optional `setAsDefault` lifts the new board id into the account's default in one round-trip. Optional `upsert: true` returns the existing board (with `existing: true`) on duplicate-name instead of 409-ing.

## Path parameters

- `id` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `name` string, required
  - `description` string
  - `privacy` 'PUBLIC' | 'PROTECTED' | 'SECRET'
  - `setAsDefault` boolean: Lift the new board id into `tokenMetadata.defaultBoardId`.
  - `upsert` boolean: When true, a duplicate-name response from Pinterest resolves to a 200 with the existing board (`existing: true`) instead of a `platform_rejected` failure.

## Response `200`

Existing board returned (only when `upsert: true` matched).

- object
  - `id` string, required
  - `name` string, required
  - `privacy` 'PUBLIC' | 'PROTECTED' | 'SECRET' | 'null', nullable
  - `existing` boolean
  - `defaultBoardId` string
  - `defaultBoardName` string

## Other responses

- `201`: Board created.
- `400`: `validation_failed` — request body or query parameters didn't match the schema. Rules surfaced include `body.json`, `targets.required`, `targets.max`, `mode_conflict`, `targets.options.platform_mismatch`, `targets.account.platform_mismatch`, `target.account.not_connected`, `target.account.ambiguous`, `scheduledAt.future`, `scheduledAt.no_first_comment`, `scheduledAt.no_bluesky_reply`.
- `401`: `unauthenticated` — missing or invalid Bearer key.
- `404`: `not_found` — the resource does not exist in the caller's organization (or, for profile-scoped keys, in the caller's profile).
- `429`: `rate_limited` — too many requests. Inspect `X-RateLimit-Limit` (static ceiling) and the IETF-draft `RateLimit-*` headers (sliding-window remaining/reset) before retrying.
- `502`: `platform_auth_failed`, `platform_rejected`, `platform_unavailable`, or `platform_not_enabled` — the upstream platform refused the call. `platformResponse` carries the raw upstream payload when available.

---

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