Quick reference
Connect an account
POST /v1/accounts/connect/pinterest. OAuth 2.0. After the callback the provider calls GET /v5/user_account to pin platformAccountId to the real Pinterest user id.
Scopes
pins:read_secret (off by default) for callers that publish to secret boards.
Token lifecycle
30-day access tokens, refreshable. The provider refreshes ~24 h before expiry; subscribe totoken.expiring to know when a re-auth window is coming.
Post types
Image pin
image-pin.json
options extension is optional. If you set a default board on the account, options.boardId can be omitted; if you don’t supply destinationUrl we fall back to the image’s letmepost URL.
Video pin
coverImageUrl is required — Pinterest mandates a still-frame URL for the pre-play poster. Preflight rejects video pins without it (pinterest.video.cover_required) so you don’t lose the upload to a vague upstream 400.
video-pin.json
POST /v5/media— register an upload slot. Failures:pinterest.media.register_failed.- Multipart POST to the presigned S3 endpoint. Failures:
pinterest.video.upload_failed. - Poll
GET /v5/media/{id}every 2 s up to a 5-minute deadline. Failures:pinterest.video.transcode_failed,pinterest.video.transcode_timeout. POST /v5/pinswithmedia_source: { source_type: "video_id", media_id, cover_image_url }.
Wisdom (platform-specific things that bite)
Common errors
What you can’t do (yet)
- Carousel pins (multi-image).
- Idea pins.
- Tagging products on a pin.
- Reading pin engagement (saves, impressions).
- Comments on pins.
- Posting to secret boards without the extended
pins:read_secretscope.
API reference
POST /v1/posts— primary publish.POST /v1/media— upload images/videos formediaIdreferences.POST /v1/accounts/connect/pinterest— start a Pinterest OAuth flow.

