Docs

Pinterest

Publish and schedule Pins with one image or a carousel of up to five, on the board you choose.

Diese Seite gibt es noch nicht auf Deutsch, deshalb siehst du sie auf Englisch.

Connecting an account

Pinterest connects with Pinterest sign-in (OAuth). Open Connections in the dashboard, or send a connect link (POST /api/v1/platform-invites with "platform": "pinterest", see Connect links). Personal and business accounts both work.

FeedHorizon asks Pinterest for boards:read, pins:read, pins:write and user_accounts:read.

Pinterest tokens last 30 days. FeedHorizon renews them automatically ahead of time, so the connection keeps working until the user removes FeedHorizon in their Pinterest settings. When that happens the account turns needs_reauth and the account.needs_reauth webhook is sent.

The platform id in the API is pinterest.

What you can post

Limit
Text500 characters
Files per post1 to 5 files, required
ImagesJPEG, PNG or WebP
Videosnot supported
File size20 MB per file

The post text becomes the Pin description. A Pin can also have a title (up to 100 characters, default: the first line of the text) and a link where it leads when clicked, both in options.pinterest. One image makes a standard Pin, 2 to 5 a carousel Pin.

Choosing the board

Every Pin goes to a board. List the account's boards and pass the board id on the post target:

cURL
curl https://feedhorizon.com/api/v1/accounts/acc_…/boards \
  -H "Authorization: Bearer fh_YOUR_API_KEY"
{ "data": [{ "boardId": "1234567890", "name": "Recipes", "privacy": "PUBLIC" }] }

Without a boardId the Pin goes to the first board in this list. Posts from the dashboard use that default too. In the MCP server the same list comes from list_pinterest_boards.

Example

cURL
curl -X POST https://feedhorizon.com/api/v1/posts \
  -H "Authorization: Bearer fh_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "profileId": "prof_…",
    "content": "Five-minute tomato soup\nOur quickest weeknight dinner.",
    "mediaIds": ["med_…"],
    "targets": [{
      "accountId": "acc_…",
      "options": { "pinterest": { "boardId": "1234567890", "link": "https://example.com/soup" } }
    }],
    "scheduledFor": "2026-11-10T09:00:00+01:00"
  }'

After publishing

The Pinterest target carries the Pin id in platformPostId and the link in platformUrl (https://www.pinterest.com/pin/<id>/).

Errors

Checked before the post is stored (400, see Errors):

CodeCauseFix
content_too_longMore than 500 charactersShorten the text, or give Pinterest its own text in targets
media_requiredThe post has no imageAdd at least one image
too_many_mediaMore than 5 imagesRemove images or split the post
media_too_largeAn image is larger than 20 MBCompress or resize it
media_type_unsupportedA video, GIF or other non-image fileUse JPEG, PNG or WebP
validation_failedoptions.pinterest is wrong, for example a title over 100 characters or a link that is not a URLFix the field named in param

While publishing (in targets[].error, see Publishing errors). Rate limits and outages are retried automatically:

CodeCauseFix
account_needs_reauthThe user removed FeedHorizon on PinterestReconnect the account, then retry
platform_auth_failedPinterest refused the token or a permission is missingReconnect the account, then retry
platform_rejectedPinterest refused the Pin, for example an unknown boardId, or the account has no board yet. error.message has the reasonFix it (create a board on Pinterest, pick another board), then retry