curl --request PUT \
--url https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tags": [
"<string>"
],
"operation": "replace"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags"
payload = {
"tags": ["<string>"],
"operation": "replace"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({tags: ['<string>'], operation: 'replace'})
};
fetch('https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags', 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/posts/{id}/analytics-tags",
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([
'tags' => [
'<string>'
],
'operation' => 'replace'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/posts/{id}/analytics-tags"
payload := strings.NewReader("{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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/posts/{id}/analytics-tags")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"postId": "<string>",
"analyticsTags": [
"<string>"
],
"analyticsTagsUpdatedAt": "2023-11-07T05:31:56Z",
"analyticsTagsUpdatedBy": "<string>",
"updatedCount": 123
}
}{
"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 a post's analytics tags
set/add/remove a post’s analytics tags for the token tenant. Requires the posts:write scope.
curl --request PUT \
--url https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tags": [
"<string>"
],
"operation": "replace"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags"
payload = {
"tags": ["<string>"],
"operation": "replace"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({tags: ['<string>'], operation: 'replace'})
};
fetch('https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags', 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/posts/{id}/analytics-tags",
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([
'tags' => [
'<string>'
],
'operation' => 'replace'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/posts/{id}/analytics-tags"
payload := strings.NewReader("{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
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/posts/{id}/analytics-tags")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/posts/{id}/analytics-tags")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tags\": [\n \"<string>\"\n ],\n \"operation\": \"replace\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"postId": "<string>",
"analyticsTags": [
"<string>"
],
"analyticsTagsUpdatedAt": "2023-11-07T05:31:56Z",
"analyticsTagsUpdatedBy": "<string>",
"updatedCount": 123
}
}{
"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
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Path Parameters
The id.
Body
Body for setting, adding or removing a post's analytics tags. The route reads only tags and operation.
The two coercions above combine into a destructive default worth stating plainly: because an unrecognised operation becomes replace and a missing or non-array tags becomes an empty list, a request that omits both - or that misspells the operation, including a capitalised Remove - returns 200 and clears every tag on the post. Send operation exactly as one of the enum values, in lower case, and always send tags.
Response
The post's resulting analytics tags and write metadata.
Show child attributes
Show child attributes