PingOne Platform APIs

Create Identity Provider (LinkedIn Legacy Deprecated)

   

POST {{apiPath}}/environments/{{envID}}/identityProviders

The POST {{apiPath}}/environments/{{envID}}/identityProviders operation adds a new identity provider resource to the specified environment.

When the type property value is set to LINKEDIN, LinkedIn’s clientId and clientSecret property values are required in the request body.

Deprecation notice: PingOne no longer supports the LINKEDIN external identity provider type. You can set the type to LINKEDIN_OIDC to connect with LinkedIn through OpenID Connect (refer to POST Create Identity Provider (LinkedIn OIDC)). The LINKEDIN type is deprecated and will be removed in February 2026.

Prerequisites

Request Model

LinkedIn identity provider settings data model

Property Type Required?

clientId

String

Required

clientSecret

String

Required

LinkedIn core attributes

Property Description

username

A string that specifies the core LinkedIn attribute. The default value is ${providerAttributes.emailAddress} and the default update value is EMPTY_ONLY.

LinkedIn provider attributes

Permission Provider attributes

r_liteprofile

Options are: id, firstName, lastName.

r_emailaddress

Options are: emailAddress.

Refer to Base IdP data model for the properties available to all of the supported identity providers.

Query parameters
Parameter Description

expand

When equal to attributes, shows the details for the core attribute mapping created by the request.

Example: POST {{apiPath}}/environments/{{envID}}/identityProviders?expand=attributes

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{apiPath}}/environments/{{envID}}/identityProviders' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/identityProviders")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"    ""description"": ""Custom LinkedIn ID Provider""," + "\n" +
@"    ""enabled"": true," + "\n" +
@"    ""name"": ""LinkedInIdP""," + "\n" +
@"    ""type"": ""LINKEDIN""," + "\n" +
@"    ""clientId"": ""LINKEDIN_ID""," + "\n" +
@"    ""clientSecret"": ""LINKEDIN_SECRET""" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "{{apiPath}}/environments/{{envID}}/identityProviders"
  method := "POST"

  payload := strings.NewReader(`{
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Authorization", "Bearer {{accessToken}}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
POST /environments/{{envID}}/identityProviders HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"description\": \"Custom LinkedIn ID Provider\",\n    \"enabled\": true,\n    \"name\": \"LinkedInIdP\",\n    \"type\": \"LINKEDIN\",\n    \"clientId\": \"LINKEDIN_ID\",\n    \"clientSecret\": \"LINKEDIN_SECRET\"\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/identityProviders")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{apiPath}}/environments/{{envID}}/identityProviders",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{apiPath}}/environments/{{envID}}/identityProviders',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "name": "LinkedInIdP",
    "type": "LINKEDIN",
    "clientId": "LINKEDIN_ID",
    "clientSecret": "LINKEDIN_SECRET"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "{{apiPath}}/environments/{{envID}}/identityProviders"

payload = json.dumps({
  "description": "Custom LinkedIn ID Provider",
  "enabled": True,
  "name": "LinkedInIdP",
  "type": "LINKEDIN",
  "clientId": "LINKEDIN_ID",
  "clientSecret": "LINKEDIN_SECRET"
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/environments/{{envID}}/identityProviders');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n    "description": "Custom LinkedIn ID Provider",\n    "enabled": true,\n    "name": "LinkedInIdP",\n    "type": "LINKEDIN",\n    "clientId": "LINKEDIN_ID",\n    "clientSecret": "LINKEDIN_SECRET"\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"

url = URI("{{apiPath}}/environments/{{envID}}/identityProviders")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "description": "Custom LinkedIn ID Provider",
  "enabled": true,
  "name": "LinkedInIdP",
  "type": "LINKEDIN",
  "clientId": "LINKEDIN_ID",
  "clientSecret": "LINKEDIN_SECRET"
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"description\": \"Custom LinkedIn ID Provider\",\n    \"enabled\": true,\n    \"name\": \"LinkedInIdP\",\n    \"type\": \"LINKEDIN\",\n    \"clientId\": \"LINKEDIN_ID\",\n    \"clientSecret\": \"LINKEDIN_SECRET\"\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/identityProviders")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()

Example Response

201 Created

{
    "_links": {
        "self": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/identityProviders/172fc816-66ed-4d69-9bf9-98a11f96ff2a"
        },
        "environment": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        },
        "attributes": {
            "href": "https://api.pingone.com/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/identityProviders/172fc816-66ed-4d69-9bf9-98a11f96ff2a/attributes"
        }
    },
    "id": "172fc816-66ed-4d69-9bf9-98a11f96ff2a",
    "type": "LINKEDIN",
    "name": "LinkedInIdP",
    "description": "Custom LinkedIn ID Provider",
    "enabled": true,
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "createdAt": "2019-12-06T23:08:09.136Z",
    "updatedAt": "2019-12-06T23:08:09.136Z",
    "clientSecret": "LINKEDIN_SECRET",
    "clientId": "LINKEDIN_ID"
}