curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectionId": "<string>",
"advertiserAccountId": "<string>",
"brandProfileId": "<string>",
"code": "<string>",
"companyId": "<string>",
"sourcePostId": "<string>",
"creatorId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes"
payload = {
"connectionId": "<string>",
"advertiserAccountId": "<string>",
"brandProfileId": "<string>",
"code": "<string>",
"companyId": "<string>",
"sourcePostId": "<string>",
"creatorId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
connectionId: '<string>',
advertiserAccountId: '<string>',
brandProfileId: '<string>',
code: '<string>',
companyId: '<string>',
sourcePostId: '<string>',
creatorId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes', 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/snapchat/codes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'connectionId' => '<string>',
'advertiserAccountId' => '<string>',
'brandProfileId' => '<string>',
'code' => '<string>',
'companyId' => '<string>',
'sourcePostId' => '<string>',
'creatorId' => '<string>'
]),
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/ads/snapchat/codes"
payload := strings.NewReader("{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"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": "idempotency_conflict",
"message": "Idempotency-Key was reused with a different request body",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Save a Snapchat ad code a creator sent
Saves a Snapchat ad code that the creator sent outside SideShift, bound to one exact connection, advertiser account and Public Profile, as the brand’s own form does. The answer is the saved code’s reference, never the code. Launch it with POST /ads/snapchat/launch as ad_code content. Requires ads:write and an Idempotency-Key of 8–200 characters; a retry with the same key returns the code its first attempt saved.
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectionId": "<string>",
"advertiserAccountId": "<string>",
"brandProfileId": "<string>",
"code": "<string>",
"companyId": "<string>",
"sourcePostId": "<string>",
"creatorId": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes"
payload = {
"connectionId": "<string>",
"advertiserAccountId": "<string>",
"brandProfileId": "<string>",
"code": "<string>",
"companyId": "<string>",
"sourcePostId": "<string>",
"creatorId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
connectionId: '<string>',
advertiserAccountId: '<string>',
brandProfileId: '<string>',
code: '<string>',
companyId: '<string>',
sourcePostId: '<string>',
creatorId: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes', 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/snapchat/codes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'connectionId' => '<string>',
'advertiserAccountId' => '<string>',
'brandProfileId' => '<string>',
'code' => '<string>',
'companyId' => '<string>',
'sourcePostId' => '<string>',
'creatorId' => '<string>'
]),
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/ads/snapchat/codes"
payload := strings.NewReader("{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/snapchat/codes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"connectionId\": \"<string>\",\n \"advertiserAccountId\": \"<string>\",\n \"brandProfileId\": \"<string>\",\n \"code\": \"<string>\",\n \"companyId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"creatorId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"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": "idempotency_conflict",
"message": "Idempotency-Key was reused with a different request body",
"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.
Headers
Client-chosen key; replaying the same key + body returns the original response, a different body returns 409.
Body
The ad code the creator sent.
1Optional assertion of the token company; mismatches are refused.
The SideShift source post the code is for, when known.
The creator who sent the code, when known.
Response
The saved code's id and fingerprint, with its revision and state.