Set up LinkedIn store tracking
curl --request PUT \
--url https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"storeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"serverConversionId": "<string>",
"browserConversionId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking"
payload = {
"connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"storeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"serverConversionId": "<string>",
"browserConversionId": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
connectionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
storeId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
serverConversionId: '<string>',
browserConversionId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'connectionId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'storeId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'serverConversionId' => '<string>',
'browserConversionId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking"
payload := strings.NewReader("{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {}
}{
"error": {
"code": "invalid_request",
"message": "name is required",
"requestId": "req_..."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Set up LinkedIn store tracking
Replace one connected store tracking binding with selected active owned native purchase rules. Requires ads:write and an Idempotency-Key. The token fixes the tenant. Rechecks current grants, account ownership, rule source types and store access before saving. Omitting the browser rule clears the browser binding. Creates no provider rule and starts no ad spend.
PUT
/
ads
/
linkedin
/
tracking
Set up LinkedIn store tracking
curl --request PUT \
--url https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"storeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"serverConversionId": "<string>",
"browserConversionId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking"
payload = {
"connectionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"storeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"serverConversionId": "<string>",
"browserConversionId": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
connectionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
storeId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
serverConversionId: '<string>',
browserConversionId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'connectionId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'storeId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'serverConversionId' => '<string>',
'browserConversionId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking"
payload := strings.NewReader("{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/linkedin/tracking")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"connectionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"storeId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"serverConversionId\": \"<string>\",\n \"browserConversionId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {}
}{
"error": {
"code": "invalid_request",
"message": "name is required",
"requestId": "req_..."
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Authorizations
oauth2platformApiKey
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Headers
A new replay key for this exact setup request. Reuse it only for the same request.
Body
application/json
Response
The data object confirms the saved native tracking binding. Full native rule URNs are retained.