1. Overview
A Pin needs a destination board and one image. Pinterest has no text-only or link-only post, and no default board: every Pinterest target setsboard_id.
2. Supported media
SocialAPI sends the first
media item to Pinterest as the Pin’s image and ignores the rest. A Pin with no image fails validation on the field media. SocialAPI does not check the image’s type or size in advance: Pinterest rejects a file it does not accept, and the target fails. A video is not supported.
Field limits: title 100 characters, description 800 characters, alt text 500 characters, and link 2,048 characters. A longer value in platform_data.pinterest fails validation with 400 publishing.validation_failed, and the issue names the field. SocialAPI checks the 800-character limit only on platform_data.pinterest.description: a longer text is sent as is and Pinterest refuses it.
3. Create post
UsePOST /v1/posts with a target that sets account_id and board_id, and publish_now: true. Get board_id from Pinterest boards.
Target field
A target with neither
board_id nor page_id fails with 400 validation.board_id_required. A board_id inside platform_data fails with 400 validation.use_board_id: set it on the target.
Pin text
The post’stext is the Pin’s description. Set the Pin’s title in platform_data.pinterest.title: the post’s top-level title field is not used for a Pin.
Platform data fields
Send these keys inplatform_data.pinterest on the post, which applies them to every Pinterest target. To set them for one target, send them flat in that target’s platform_data (targets[].platform_data, with no pinterest key). When both set the same key, the target’s value wins.
SocialAPI forwards any additional keys in
platform_data.pinterest that the table above lists, and no others. Pinterest has no other publish options that SocialAPI passes through: an unlisted key is ignored without a warning.
Scheduling
Setscheduled_at to an ISO 8601 timestamp (UTC) instead of publish_now. SocialAPI holds the post and publishes it at that time.
4. Update post
SocialAPI offers no edit of a published Pin. Pinterest’s edit call is in beta and not open to every app, and a Pin’s image never changes.PATCH /v1/posts/{pid} edits only a post in draft, scheduled, or failed status, and returns 409 post.state_invalid for a published post. To change a Pin, delete it and publish a new one: the new Pin has a new ID.
5. Delete post
DELETE /v1/posts/{pid} deletes the Pin from Pinterest when its Pinterest target is published. See Delete a post. Deleting a board deletes every Pin on it: see Pinterest boards.
6. Retrieve posts
GET /v1/platforms/pinterest/accounts/{id}/pins returns the account’s Pins, read from Pinterest on every call. The response and its fields are in List Pins. Each published target of a post you created carries platform_post_id and permalink.
Pinterest reports no engagement counts on the Pin list, so a Pin has no metrics. GET /v1/posts/{pid}/metrics returns HTTP 200, and the Pinterest target carries error.code: resource.not_supported. Account-level counts are in Analytics.
7. Quirks, errors, and recovery
A Pin needs a board
There is no default board, and a target withoutboard_id is refused. When the connected account does not own the board, Pinterest refuses the Pin and the target fails with 403 platform.pinterest.403.
Boards and Pins are read live
SocialAPI stores no board or Pin. A board you just created appears on the next call. If Pinterest is unavailable, a call fails.Errors on a failed target
A publish that fails after the request returned puts a structured error on the target, intargets[].error, with its code. Every code is in Errors.
401 platform.pinterest.auth: Pinterest reported that authentication failed. The account is markedtoken_expired, and every later call that acts on the account returns403 account.reconnection_requireduntil you reconnect it.401 platform.pinterest.unauthorized: Pinterest answered 401 without naming the token. The account keeps working. Reconnect if it persists.403 platform.pinterest.403: Pinterest refused the action for this account or board. Readmessage.404 platform.pinterest.404: Pinterest reports that the board or Pin does not exist.429 platform.pinterest.rate_limit: Pinterest’s own limit. Wait, then retry.
Recovery
- Rate limit. Wait for the seconds in
Retry-After, or at least 60 seconds when it is absent, then sendPOST /v1/posts/{pid}/retry. See Delivery. - Auth error. Reconnect the Pinterest account through the OAuth flow.
- Wrong board. Delete the Pin, then publish it to the right board.
8. Full worked example
This example finds a board, publishes a Pin to it, and reads the result. Step 1: List boardsmedia_id, here f47ac10b-58cc-4372-a567-0e02b2c3d479.
Step 3: Publish the Pin
status: "publishing", as in Create post.
Step 4: Check the status
9. Required OAuth scopes
SocialAPI’s Pinterest app requests these scopes during the OAuth flow. You configure nothing. The full list is in Pinterest scopes.
The scopes a scoped API key needs, the credit cost of a post, and the MCP tools that publish are on Publishing.