Pinterest API
GET /v1/pinterest/accounts
List Pinterest Accounts
List connected Pinterest accounts (limited to the API key’s allow-list, if any).
Auth: ApiKeyAuth, BearerAuth
Response 200
curl -X GET "https://api.pinbridge.io/v1/pinterest/accounts" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
DELETE /v1/pinterest/accounts/{account_id}
Revoke Pinterest Account
Revoke a Pinterest account connection.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
account_id |
path | yes | string |
Response 204
curl -X DELETE "https://api.pinbridge.io/v1/pinterest/accounts/$ACCOUNT_ID" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
GET /v1/pinterest/accounts/{account_id}/analytics
Get Account Analytics
Account-level analytics (impressions, engagement, saves, clicks) over a date range.
PinBridge copies every connected account’s analytics nightly, so most reads are
answered from that stored history (source: stored in the response, with
data_as_of) without calling Pinterest. Live ranges are capped at 90 days,
stored ranges at 366. Sandbox-simulated workspaces return zeroed metrics.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
account_id |
path | yes | string | |
start_date |
query | no | string? | Inclusive start (YYYY-MM-DD); default 30 days ago |
end_date |
query | no | string? | Inclusive end (YYYY-MM-DD); default today |
metrics |
query | no | string? | Comma-separated Pinterest metric types, e.g. IMPRESSION,ENGAGEMENT,SAVE,PIN_CLICK,OUTBOUND_CLICK. Defaults to the organic engagement set. |
source |
query | no | enum(auto, stored, live) | auto (default): PinBridge’s stored history when it covers the range, else Pinterest. stored: stored history only (up to 366 days, beyond Pinterest’s 90). live: always ask Pinterest (counts against the read limit). |
include_daily |
query | no | boolean | false: return only the range totals, with an empty daily list. Use it when the totals are all you need, e.g. over 90 days. |
Response 200 (AccountAnalyticsResponse)
curl -X GET "https://api.pinbridge.io/v1/pinterest/accounts/$ACCOUNT_ID/analytics" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
GET /v1/pinterest/boards
List Boards
List boards for a Pinterest account.
Returns a synthetic local board in sandbox simulation mode, otherwise proxies Pinterest.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
account_id |
query | yes | string | Pinterest account ID |
Response 200
curl -X GET "https://api.pinbridge.io/v1/pinterest/boards?account_id=$ACCOUNT_ID" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
POST /v1/pinterest/boards
Create Board
Create a board for a connected Pinterest account.
SECRET needs Pinterest’s boards:write_secret scope. Connections made before
API 1.37 lack it and get 409 scope_missing until they reconnect.
Auth: ApiKeyAuth, BearerAuth
Request body (BoardCreateRequest)
| Field | Type | Required | Description |
|---|---|---|---|
account_id |
string | yes | Pinterest account ID |
name |
string | yes | Board name (max 180, min 1) |
description |
string? | no | Board description |
privacy |
string? | no | Board privacy (for example PUBLIC, PROTECTED, SECRET) |
Response 201 (BoardResponse)
curl -X POST "https://api.pinbridge.io/v1/pinterest/boards" \
-H "X-API-Key: $PINBRIDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Home decor ideas"}'
DELETE /v1/pinterest/boards/{board_id}
Delete Board
Delete a board on Pinterest, with every pin on it. Irreversible.
PinBridge’s published pins on the board keep their records and stored analytics
and are marked removed_from_pinterest_at. Deleting a secret board needs the
boards:write_secret scope (connections made before API 1.37 lack it).
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
board_id |
path | yes | string | |
account_id |
query | yes | string | Pinterest account ID |
Response 204
curl -X DELETE "https://api.pinbridge.io/v1/pinterest/boards/$BOARD_ID?account_id=$ACCOUNT_ID" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
PATCH /v1/pinterest/boards/{board_id}
Update Board
Rename a board or change its description or privacy.
The change is made on Pinterest; fields left out are unchanged. Pins on the
board are unaffected.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
board_id |
path | yes | string |
Request body (BoardUpdateRequest)
| Field | Type | Required | Description |
|---|---|---|---|
account_id |
string | yes | Pinterest account that owns the board |
name |
string? | no | New board name |
description |
string? | no | New board description |
privacy |
string? | no | New privacy (for example PUBLIC, SECRET) |
Response 200 (BoardResponse)
curl -X PATCH "https://api.pinbridge.io/v1/pinterest/boards/$BOARD_ID" \
-H "X-API-Key: $PINBRIDGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "name": "Autumn decor"}'
GET /v1/pinterest/boards/{board_id}/access
Get Board Access
Check whether an account can publish to a board right now.
Runs the same preflight POST /v1/pins uses and reports the outcome
instead of failing: publishable plus a stable code (board_not_found,
board_not_owned, board_deleted, scope_missing, token_expired,
board_access_denied, sandbox_board_not_allowed, …) and a remediation
hint. status: skipped means Pinterest was unavailable and only local
checks ran.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
board_id |
path | yes | string | |
account_id |
query | yes | string | Pinterest account ID |
fresh |
query | no | boolean | Bypass the cached verdict and ask Pinterest again |
Response 200 (BoardAccessResponse)
curl -X GET "https://api.pinbridge.io/v1/pinterest/boards/$BOARD_ID/access?account_id=$ACCOUNT_ID" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
GET /v1/pinterest/oauth/callback
Oauth Callback
Handle Pinterest OAuth callback.
Exchanges code for access token and stores account.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
code |
query | no | string? | Authorization code from Pinterest |
state |
query | yes | string | State parameter for CSRF protection |
error |
query | no | string? | Set by Pinterest when access was refused |
Response 200
curl -X GET "https://api.pinbridge.io/v1/pinterest/oauth/callback?state=$STATE"
GET /v1/pinterest/oauth/start
Start Oauth
Start Pinterest OAuth flow.
Returns authorization URL to redirect user to. Pass account_id when
reconnecting an account, so a workspace at its plan’s account limit can still
reconnect it.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
account_id |
query | no | string? | When reconnecting, the connected account being reconnected. It does not count against the plan’s Pinterest account limit. |
Response 200 (OAuthStartResponse)
curl -X GET "https://api.pinbridge.io/v1/pinterest/oauth/start" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
GET /v1/pinterest/terms/related
List Related Terms
List Pinterest related terms for a connected account.
Auth: ApiKeyAuth, BearerAuth
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
account_id |
query | yes | string | Pinterest account ID |
terms |
query | yes | array |
Requested term(s). Supports repeated query params or a comma-separated value. |
exact_match |
query | no | boolean | When true, keep only related-term groups whose term exactly matches one of the requested terms values after trim/casefold normalization. |
Response 200 (RelatedTermsResponse)
curl -X GET "https://api.pinbridge.io/v1/pinterest/terms/related?account_id=$ACCOUNT_ID&terms=$TERMS" \
-H "X-API-Key: $PINBRIDGE_API_KEY"
