Pinterest
www.pinterest.com/ ↗OAuth 2 authorization-code is real (authorize at https://www.pinterest.com/oauth/, token at POST /v5/oauth/token), but you get no app secret until Pinterest manually approves your Trial request, and shipping to other users needs a second, video-gated Standard review. No OIDC discovery exists, so endpoints are hand-configured.
01Pick your path
02Time & effort
- DEVBusiness account, email verify, Developer ToS10–30 minutessourced[S1]You must be logged into the business account that will administer the app.
- DEVDraft and submit Connect app (Trial) request15–45 minutessourced[S1]Agent can draft the app name, description and scope justification; you paste and submit.
- DEVPinterest reviews Trial requestwait 1–10 dayssourced[S1][S6]Sources confirm manual review plus email notification and advise allowing 'a few days'; the day range itself is inferred.
- DEVBuild and test the OAuth flow1–4 hourssourced[S2][S4]Authorize redirect, callback, token exchange, refresh persistence. No discovery metadata, so endpoints are hardcoded.
- PRODRecord OAuth demo video, submit Standard upgrade30–90 minutessourced[S6]Must show the live OAuth flow and real Pinterest integration; terminal/Postman recordings are accepted.
- PRODPinterest reviews Standard requestwait 1–4 weeksinferred[S6][S7]Sources say reviews happen 'regularly' with email notification but give no SLA; deny/resubmit cycles are visible in the community thread.
03Steps
Get a working connection
- Accept that this is a manual-endpoint OAuth 2 serveragentinferred
There is no OAuth/OIDC discovery on api.pinterest.com, and www.pinterest.com returns an HTML shell (200) for any well-known path. Plan for hardcoded endpoints: authorize https://www.pinterest.com/oauth/, token https://api.pinterest.com/v5/oauth/token. Don't wire a discovery-dependent client.
↗ www.pinterest.com/oauth/ Log in or create a business account, verify its email, open My apps, and accept the Developer Terms of Service. Nothing else is clickable until the ToS is accepted.
“Go to My apps and click through to accept our Developer Terms of Service” — [S1] verified verbatim
↗ developers.pinterest.com/docs/getting-started/connect-app/Select Connect app, fill the request form with app info, and submit for Trial access. Vague descriptions and broken privacy-policy links are the two stated denial reasons. Agent drafts the text; you paste and submit.
“Access requests that don't have enough information about the app or are vague or incomplete may be denied.” — [S6] verified verbatim
↗ developers.pinterest.com/docs/getting-started/connect-app/◆ prepared by agent · Trial-request description + scope justification draftApp name: PinPilot (>=3 Latin alphanumerics, no "Pinterest") What the app does: PinPilot is an assistant that drafts and schedules Pins and reports weekly organic performance for the brand's own Pinterest business account. A user explicitly authorizes their account via Pinterest OAuth; we never collect Pinterest usernames, passwords or session cookies. Scopes requested and why: - boards:read — list the user's boards so they can pick a destination board before publishing. - pins:read — read back Pins we created and fetch their metrics for the weekly report. - ads:read — (only if ads reporting is in scope) read campaign and ad performance for the user's ad account. Privacy policy: https://<your-company-domain>/privacy — public, loads fully, hosted on the same domain as the product. Data handling: access and refresh tokens stored encrypted server-side; no Pinterest credentials stored.
My apps → Manage (your app) → Configure tab → Redirect URIs → enter the URI → Add. Use an exact string including scheme and trailing slash; the value sent at authorize time must match character-for-character and must not bounce again from your callback.
“They must be an exact match to avoid any exceptions. The specified redirect URI must not cause the responding server to send a secondary redirect to yet another URI.” — [S1] verified verbatim
↗ developers.pinterest.com/docs/getting-started/connect-app/Redirect to https://www.pinterest.com/oauth/ with client_id, redirect_uri, response_type=code, scope and a state nonce; verify state on return; then POST to https://api.pinterest.com/v5/oauth/token with HTTP Basic client_id:client_secret, grant_type=authorization_code, code and the same redirect_uri. Sandbox host is https://api-sandbox.pinterest.com/v5/oauth/token.
“https://www.pinterest.com/oauth/?client_id=1234567&redirect_uri=https://example.com/&response_type=code&scope=ads:read,ads:write,boards:read,pins:read&state=hello” — [S4] verified verbatim
↗ api.pinterest.com/v5/oauth/token◆ prepared by agent · Authorize URL + token exchangeGET https://www.pinterest.com/oauth/?client_id=<APP_ID>&redirect_uri=<EXACT_REGISTERED_URI>&response_type=code&scope=boards:read,pins:read&state=<csrf_nonce> # callback -> verify state, then: curl -X POST https://api.pinterest.com/v5/oauth/token \ -H 'Authorization: Basic <base64(client_id:client_secret)>' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=authorization_code' \ --data-urlencode 'code=<CODE>' \ --data-urlencode 'redirect_uri=<EXACT_REGISTERED_URI>' \ --data-urlencode 'continuous_refresh=true' # only if the app predates 2025-09-25 # sandbox variant: https://api-sandbox.pinterest.com/v5/oauth/token
Store access_token + refresh_token server-side, track expires_in / refresh_token_expires_in, and refresh on a timer. Legacy 365-day refresh tokens are gone; continuous refresh tokens have a 60-day window and refresh indefinitely. Use the Token Debugger when a token misbehaves (expired, insufficient scopes, logged-out user session).
↗ developers.pinterest.com/docs/api/v5/oauth-token/Product-limited tokens expire after 24 hours and let you hit endpoints without the full flow; the sandbox host avoids touching production data. Watch the Trial ceiling of 1000 requests/day per app, and read x-ratelimit-* headers with curl -v.
“Test tokens expire after 24 hours and allow you to explore certain endpoints faster.” — [S1] verified verbatim
↗ github.com/pinterest/api-quickstart
Make it production-ready
My apps → Upgrade on the app card (only visible when eligible) → confirm use case and privacy-policy link → upload the video showing the full OAuth flow and live Pinterest integration → submit. A terminal or Postman recording is explicitly acceptable, even if you are the only user.
“We accept screen recordings of calls on your terminal or through tools such as Postman.” — [S6] verified verbatim
↗ developers.pinterest.com/docs/getting-started/access-tiers/◆ prepared by agent · Standard-access demo video checklistOAuth demo checklist (Standard access) [ ] Start logged out of Pinterest. [ ] Click 'Connect Pinterest' in the app — show the real authorize URL with YOUR client_id. [ ] Show the Pinterest login, then the consent screen with the requested scopes visible. [ ] Complete consent; show the redirect landing on your callback with ?code=... [ ] Show the token exchange request (server logs or terminal, secrets masked). [ ] Make one live API call with the token (e.g. list boards) and show the response in YOUR app's UI. [ ] Narrate the scope justification in one sentence per scope. [ ] Confirm on camera that no passwords or session cookies are collected or stored. [ ] Keep it under ~3 minutes, single unedited take, real data.
Allow a few days before following up. If rejected, re-check that the video shows the OAuth flow AND a live integration, then open an API Technical Support ticket from the Help Center ('Still need more help?').
“If you want to appeal a denial, submit a ticket in our Help Center.” — [S6] verified verbatim
↗ developers.pinterest.com/docs/getting-started/access-tiers/
04Requirements, scopes & nuances
You'll need
- ▸A Pinterest business account that administers the app — personal accounts and Business Access-provisioned accounts are not the admin path. sourced ❝[S1]
- ▸A verified email address on that account, plus acceptance of the Developer Terms of Service before you can register anything. sourced ❝[S1]
- ▸App name with at least 3 Latin letters/numbers, not containing the word "Pinterest". sourced ❝[S1]
- ▸At least one registered redirect URI, matched exactly at authorize time and not itself issuing a redirect. sourced ❝[S1]
- ▸A publicly accessible privacy policy hosted on a domain clearly associated with your company/app — a missing or inaccurate one is a stated Trial denial reason. sourced ❝[S6]
- ▸For Standard access: a screen recording that shows the app sending users through the OAuth flow and not storing sensitive information. sourced ❝[S6]
Gotchas
- !Trial access is not production: 1000 requests/day per app, and Pins/boards you create are visible only to their creator as sandbox entities. Real distribution needs Standard access. sourced ❝[S6][S3]
- !Refresh tokens changed: the legacy 365-day refresh token is no longer supported. Apps created before Sept 25, 2025 must send continuous_refresh=true to get the 60-day token that refreshes indefinitely; newer apps get it automatically. sourced ❝[S4][S2]
- !redirect_uri must be an exact string match against a registered URI and must not trigger a secondary redirect from your callback server. sourced ❝[S1]
- !Doc inconsistency: the auth guide's Client Credentials example still says grant_type=authorization_code, while the endpoint reference enum lists client_credentials. Trust the enum. inferred[S4][S2]
- !Denials are frequent and the rejection mail is generic ("demo did not show Pinterest integration" / "demo did not show full OAuth flow"), so treat the video as the deliverable that decides your launch. sourced ❝[S7][S6]
- !Tokens can stop working for reasons other than expiry — logged-out user session or a password change invalidates the session; then you must re-run the Authorization Code grant. sourced ❝[S5]
| Scope / permission | Tier | Note | Evidence |
|---|---|---|---|
| boards:read | basic | Read boards. Ask for this before any write scope; combine with commas or spaces (boards:read,pins:read). | sourced ❝[S4] |
| pins:read | basic | Read Pins. The narrowest organic read scope shown in the docs. | inferred[S4] |
| ads:read | sensitive | Read ad accounts, campaigns, ad groups, ads — ad data is business-sensitive; request only if your agent reports on ads. | sourced ❝[S3][S4] |
| ads:write | sensitive | Create/edit/delete ad entities. Highest-risk scope in the documented set — an agent with this can spend money. | sourced ❝[S3][S4] |
| Pins/boards of non-business users (post-Sept-14-2026 apps) | gated | Apps registered on/after Sept 14, 2026 can get 403 PINNER_DATA_ACCESS_DENIED reading boards or Pins without Pinterest's authorization for non-business users. | sourced ❝[S6] |
05If you get blocked
→ Keep the demo video short and boring: full OAuth redirect, consent screen, code landing, token exchange, one live API call. Re-submit; if still rejected, open an 'API Technical Support' ticket in the Help Center.
→ Plan Trial review into your schedule before you need the secret; until then prototype the redirect + callback handling against the documented authorize URL and use the api-quickstart repo structure.
→ Hardcode the two endpoints: authorize https://www.pinterest.com/oauth/ and token https://api.pinterest.com/v5/oauth/token (sandbox: https://api-sandbox.pinterest.com/v5/oauth/token).
→ Delete an existing app (requires a Support ticket) or ask Support to raise the limit; don't burn slots on throwaway apps.
→ Handle the PINNER_DATA_ACCESS_DENIED 403 in code, and verify your use case is a business-account / authorized-user flow rather than reading arbitrary users' boards and Pins.
06Evidence: what was tested, sourced, and still uncertain
Sources read
- [S1] Pinterest Developers | Connect app official
- [S2] Pinterest Developers official
- [S3] Pinterest Developers | Rate limits official
- [S4] Set up authentication and authorization official
- [S5] Pinterest Developers | Faqs official
- [S6] Pinterest Developers | Access tiers official
- [S7] My Standard API Request application rejected twice - Need clarification third-party
- [S8] Install the Pinterest for Salesforce Commerce Cloud app official
- [S9] Business Manager: access, roles and permissions | Pinterest Business help official
- [S10] Business Manager: partner access | Pinterest Business help official
- [S11] GitHub - pinterest/api-quickstart: Code that makes it easy to get started with the Pinterest API. third-party
- [S12] How to Get OAuth Access Token for Pinterest? third-party
- [S13] Pinterest Developers official
- [composio] Composio — Managed OAuth apps directory official
- [probe] Live HTTP probes run by the agent (dummy client_id, no credentials) probe
Still uncertain
- ? Neither source states a review SLA for Trial or Standard access; the 1–10 day and 1–4 week ranges are inferred from 'allow a few days' guidance and community denial threads.
- ? The provided sources never list the full scope catalog (the scopes URL returned rate-limit content), so only boards:read, pins:read, ads:read and ads:write are documented here — check the scopes reference for write/organic and catalog scopes.
- ? Whether an agent-only client-credentials token can access every ad/catalog endpoint is not stated; the docs only show it as a grant type.
- ? It is not stated whether Standard access requires a business account (Trial explicitly does), nor whether a personal-account-only use case can ever pass Standard review.
- ? Token rotation semantics (whether refresh returns a new refresh token each time) are not described in these sources.
- ? Probes could not confirm that client_id validation happens on the authorize endpoint, since a fake client_id is intercepted by the login redirect first.
- ? Generated automatically; no app was registered and no review was submitted.