curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/code-requests \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"creatorId": "<string>",
"tiktokItemId": "<string>",
"sourcePostId": "<string>",
"sourcePostUrl": "<string>",
"sourcePlatform": "<string>",
"postTitle": "<string>",
"provider": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/code-requests"
payload = {
"creatorId": "<string>",
"tiktokItemId": "<string>",
"sourcePostId": "<string>",
"sourcePostUrl": "<string>",
"sourcePlatform": "<string>",
"postTitle": "<string>",
"provider": "<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({
creatorId: '<string>',
tiktokItemId: '<string>',
sourcePostId: '<string>',
sourcePostUrl: '<string>',
sourcePlatform: '<string>',
postTitle: '<string>',
provider: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/code-requests', 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/code-requests",
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([
'creatorId' => '<string>',
'tiktokItemId' => '<string>',
'sourcePostId' => '<string>',
'sourcePostUrl' => '<string>',
'sourcePlatform' => '<string>',
'postTitle' => '<string>',
'provider' => '<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/code-requests"
payload := strings.NewReader("{\n \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<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/code-requests")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/code-requests")
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 \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<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": "not_found",
"message": "Resource not found",
"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_..."
}
}Request a TikTok Spark code from a creator
Sends the creator a message with a link to submit the Spark code for one TikTok video. The company must have a TikTok ad account connected in Ad Settings, because SideShift authorizes every submitted code to that advertiser. Without one, the request is refused with 409 conflict and meta.adAccountRequired: true. A repeat of the same request returns the existing request with reused: true and does not message the creator again. Requires the ads:write scope and an Idempotency-Key.
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/code-requests \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"creatorId": "<string>",
"tiktokItemId": "<string>",
"sourcePostId": "<string>",
"sourcePostUrl": "<string>",
"sourcePlatform": "<string>",
"postTitle": "<string>",
"provider": "<string>"
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/code-requests"
payload = {
"creatorId": "<string>",
"tiktokItemId": "<string>",
"sourcePostId": "<string>",
"sourcePostUrl": "<string>",
"sourcePlatform": "<string>",
"postTitle": "<string>",
"provider": "<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({
creatorId: '<string>',
tiktokItemId: '<string>',
sourcePostId: '<string>',
sourcePostUrl: '<string>',
sourcePlatform: '<string>',
postTitle: '<string>',
provider: '<string>'
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/code-requests', 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/code-requests",
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([
'creatorId' => '<string>',
'tiktokItemId' => '<string>',
'sourcePostId' => '<string>',
'sourcePostUrl' => '<string>',
'sourcePlatform' => '<string>',
'postTitle' => '<string>',
'provider' => '<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/code-requests"
payload := strings.NewReader("{\n \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<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/code-requests")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/code-requests")
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 \"creatorId\": \"<string>\",\n \"tiktokItemId\": \"<string>\",\n \"sourcePostId\": \"<string>\",\n \"sourcePostUrl\": \"<string>\",\n \"sourcePlatform\": \"<string>\",\n \"postTitle\": \"<string>\",\n \"provider\": \"<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": "not_found",
"message": "Resource not found",
"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 creator to ask.
The numeric TikTok item ID of the video. Give this, sourcePostId or sourcePostUrl.
The ID of the video, as SideShift tracks it.
The TikTok URL of the video.
Optional. Only tiktok uses Spark codes; other platforms are refused.
Response
Success. Returns the request and reused.
The response is of type object.