| What you need | Why you need it | How to get it |
| Your app ID and client secret | You will provide these as credentials when requesting an OAuth access token. | First, Register your app. Then, find your app ID and client secret
. |
| Redirect URI | References your app's site, where Pinterest will send the user and an authorization code after the user authorizes your app in Step 1. You will later provide the redirect URI in Step 3, when requesting the OAuth access token. | When you register your app, you provide at least one redirect URI. See Configure your app's redirect URI to learn more. |
| OAuth grant type selection | The grant type determines how your app authenticates and acquires authorization to access
protected resources. | Learn about grant types. Then, select one. |
| Scope(s) selection | Scopes are the permissions your users give your app to act on their behalf within Pinterest.
Each scope allows your app to make different API requests, such as for creating ads or
viewing secret boards. | Learn about scopes. Then select the ones you need. |
https://www.pinterest.com/oauth/| Parameter | Description |
client_idRequired | Unique ID for your app, also referred to as App ID. See Before you begin. |
redirect_uriRequired | Redirect URI registered for your app. Must exactly match the value as registered with Pinterest. See Before you begin. |
response_typeRequired | Type of credential you want the authorization server to return after the user authenticates
and authorizes your app. Set to literal string code |
scopeRequired | Permission granted with the access token. At least one is required. Separate multiple scopes with spaces or commas. For example, to include the scopes boards:readpins:readscopeboards:read,pins:readboards:read pins:read |
stateOptional | Any string value you define, appended to your redirect URI as part of the request query
string during the OAuth transaction. Commonly used to prevent cross-site request
forgery. Learn more from the
Open Worldwide Application Security Project
(OWASP). |
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

redirect_uri| Parameter | Description |
code | Code to be exchanged for an access token. |
state | Should match the string you entered in the redirect
request.
A non-matching string could indicate a cross-site request forgery attack. |
https://www.example.com/oauth/pinterest/oauth_response/https://www.example.com/oauth/pinterest/oauth_response/?code={code}&state={your_optional_string}client_idclient_secretBasic {base64-encoded_string_made_of client_id:client_secret}client_id123client_secret456123:456MTIzOjQ1Ng==Authorization: Basic MTIzOjQ1Ng==| Parameter | Description |
codeRequired | Authorization code returned in preceding
step. |
redirect_uriRequired | Redirect URI used during registration, which must match exactly. |
grant_typeRequired | Set this to authorization_code |
continuous_refreshOptional | Only applicable to apps created before September 25, 2025. Set to trueIf your app was created on or after September 25, 2025, disregard this parameter, as you are automatically using the continuous refresh token (60-day expiration, refreshable indefinitely). |
| Parameter | Description |
scopeRequired | Permission granted with the access token. At least one is required. Separate multiple scopes
with spaces or commas. For example, to include the scopes boards:readpins:readboards:read,pins:readboards:read pins:read |
grant_typeRequired | Set this to authorization_code |
curl -X POST https://api.pinterest.com/v5/oauth/token \ --header 'Authorization: Basic {base64-encoded_string_made_of client_id:client_secret}' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=authorization_code' \ --data-urlencode 'code={your_code}' \ --data-urlencode 'redirect_uri=http://localhost/' \ --data-urlencode 'continuous_refresh=true'
curl -X POST https://api.pinterest.com/v5/oauth/token \ --header 'Authorization: Basic {base64-encoded_string_made_of client_id:client_secret}' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'scope=boards:read,pins:read'
pina{ "access_token": "{access_token_string_with_'pina'_prefix}", "refresh_token": "{refresh_token_string_with_'pinr'_prefix}", "response_type": "authorization_code", "token_type": "bearer", "expires_in": 2592000, "refresh_token_expires_in": 31536000, "scope": "boards:read boards:write pins:read" }
pinc{ "access_token": "{access_token_string_with_'pinc'_prefix}", "response_type": "client_credentials", "token_type": "bearer", "expires_in": 2592000, "scope": "boards:read catalogs:read catalogs:write pins:read" }
| Field | Description |
access_token | Token used to authenticate API requests. |
refresh_token | Token used to obtain a new access token without requiring user interaction. |
token_type | Type of token returned in the request. For example, the type bearer |
expires_in | Lifetime of the access token in seconds. |
refresh_token_expires_in | Lifetime of the refresh token in seconds. |
scope | Permissions granted with the access token. |
AuthorizationBearer {your_token}curl https://api.pinterest.com/v5/user_account --header 'Authorization: Bearer 123'
HTTP 4012| Parameter | Description |
refresh_tokenRequired | Full refresh token string, starting with pinr |
grant_typeRequired | Set to the literal string refresh_token |
scopeOptional | One or more scopes. Include this parameter to get an access token with a subset of the
scopes originally granted |
curl -X POST https://api.pinterest.com/v5/oauth/token \ --header 'Authorization: Basic {base64-encoded_string_made_of client_id:client_secret}' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'grant_type=refresh_token' \ --data-urlencode 'refresh_token={your_refresh_token}' \ --data-urlencode 'scope=boards:read'
refresh_token_expires_at1730227664October 29, 2024{ "access_token": "{access_token_string_with_'pina'_prefix}", "response_type": "refresh_token", "token_type": "bearer", "expires_in": 2592000, "scope": "boards:read", "refresh_token": "{refresh_token_string_with_'pinr'_prefix}", "refresh_token_expires_in": 5184000, "refresh_token_expires_at": 1730227664 }
| Parameter | Description |
access_token | Token used to authenticate API requests. |
response_type | Set to literal string code |
token_type | Type of token returned in the request. For example, the type bearer |
expires_in | Lifetime of the access token in seconds. |
scope | Permissions granted with the access token. |




{entity}:read{entity}:writeads:read,ads:write,boards:read,boards:writeads:read ads:write boards:read boards:write| Entity | read | write |
|---|---|---|
ads | See all data related to advertising, such as ads, ad groups and campaigns. | Create, update or delete ads, ad groups and campaigns. |
billing | See all of your billing data, such as your billing profile. | Create, update or delete billing data. |
biz_access | See all business access data. | Create, update or delete business access data. |
boards | See public boards, including group boards, with boards:readboards:read_secret | Create, update or delete public boards with boards:writeboards:write_secret |
catalogs | See all catalog data. | Create, update or delete catalogs. |
pins | See public pins with pins:readpins:read_secret | Create, update or delete public pins with pins:writepins:write_secret |
user_accounts | See user accounts and followers. | Update user accounts and followers. |