Email SupportCall Us Go to Close

Authentication with OAuth


To start integrating with Close using OAuth 2.0, a developer must have a Close account and acquire its own credentials, a client id and client secret. Those can be obtained by accessing the Settings page, navigating to Developer → OAuth Apps, clicking Create App button and filling in the form. You should also implement a redirect URI where the user is redirected after the authorization. In the examples below we use https://example.com/callback/close.

Authorization

First you need to have your application redirect the user to Close's authorization page with the client_id and redirect_uri.

https://app.close.com/oauth2/authorize/?client_id=CLIENT_ID&response_type=code

The user will be presented with a Consent Screen and be able to select an organization and grant or decline access. If the user chooses to grant access, their browser is redirected to that OAuth App's redirect_uri, the Authorization Code is passed inside the code query parameter.

https://example.com/callback/close?code=CODE

If the users chooses to decline access instead, their browser is redirected to the same redirect_uri with error information in query parameters.

https://example.com/callback/close?error=access_denied

Obtain Access Token

The Authorization Code can be exchanged for an Access Token by performing a POST request with form-encoded parameters to https://api.close.com/oauth2/token/

POST /oauth2/token/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: api.close.com

client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=CODE

You will get a following JSON response:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  "expires_in": 3600,
  "refresh_token": "REFRESH_TOKEN",
  "scope": "all.full_access offline_access",
  "organization_id": "ORGANIZATION_ID",
  "user_id": "USER_ID"
}

Notice that the Access Token has a limited lifetime and expires in expires_in seconds from the moment it was issued. If your application has offline_access scope refresh_token property will be present in the response and you can refresh Access Token (See below).

Perform API calls with Access Token

Send your HTTP requests with an Authorization header that contains the word Bearer followed by a space and the Access Token.

e.g. using cURL:

curl https://api.close.com/api/v1/me/ -H "Authorization: Bearer ACCESS_TOKEN"

which results in the following request:

GET /api/v1/me/ HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Host: api.close.com

Refresh Access Token

If your application has an offline_access scope you can refresh the Access Token using Refresh Token obtained before by performing a POST request with form-encoded parameters to https://api.close.com/oauth2/token/

POST /oauth2/token/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: api.close.com

client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

You will get a following JSON response

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  "expires_in": 3600,
  "refresh_token": "REFRESH_TOKEN",
  "scope": "all.full_access offline_access",
  "organization_id": "ORGANIZATION_ID",
  "user_id": "USER_ID"
}

Note that the authorization server issues a new Refresh Token and the client must discard the old Refresh Token and replace it with the new one. The authorization server revokes the old Refresh Token after issuing a new one.

Revoke application access

It's a good security practice to revoke Access and Refresh Tokens immediately if the user chooses to disable the integration with Close. You can accomplish this by performing a POST request with form-encoded parameters to https://api.close.com/oauth2/revoke/.

POST /oauth2/revoke/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: api.close.com

client_id=CLIENT_ID&client_secret=CLIENT_SECRET&token=REFRESH_TOKEN