Request native video access and send creator guides for the selected source indices
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectionId": "<string>",
"sources": [
{
"kind": "youtube",
"videoId": "<string>"
}
],
"sourceIndices": [
1
]
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request"
payload = {
"connectionId": "<string>",
"sources": [
{
"kind": "youtube",
"videoId": "<string>"
}
],
"sourceIndices": [1]
}
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>',
sources: [{kind: 'youtube', videoId: '<string>'}],
sourceIndices: [1]
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request', 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/google/partnerships/request",
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>',
'sources' => [
[
'kind' => 'youtube',
'videoId' => '<string>'
]
],
'sourceIndices' => [
1
]
]),
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/google/partnerships/request"
payload := strings.NewReader("{\n \"connectionId\": \"<string>\",\n \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\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/google/partnerships/request")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"<string>\",\n \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request")
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 \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"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_..."
}
}Request native video access and send creator guides for the selected source indices
Request native video access and send creator guides for the selected source indices. Confirm the advertiser and videos; YPP is not required.
POST
/
ads
/
google
/
partnerships
/
request
Request native video access and send creator guides for the selected source indices
curl --request POST \
--url https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"connectionId": "<string>",
"sources": [
{
"kind": "youtube",
"videoId": "<string>"
}
],
"sourceIndices": [
1
]
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request"
payload = {
"connectionId": "<string>",
"sources": [
{
"kind": "youtube",
"videoId": "<string>"
}
],
"sourceIndices": [1]
}
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>',
sources: [{kind: 'youtube', videoId: '<string>'}],
sourceIndices: [1]
})
};
fetch('https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request', 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/google/partnerships/request",
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>',
'sources' => [
[
'kind' => 'youtube',
'videoId' => '<string>'
]
],
'sourceIndices' => [
1
]
]),
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/google/partnerships/request"
payload := strings.NewReader("{\n \"connectionId\": \"<string>\",\n \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\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/google/partnerships/request")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"connectionId\": \"<string>\",\n \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/ads/google/partnerships/request")
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 \"sources\": [\n {\n \"kind\": \"youtube\",\n \"videoId\": \"<string>\"\n }\n ],\n \"sourceIndices\": [\n 1\n ]\n}"
response = http.request(request)
puts response.read_body{}{
"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.
FlowAuthorization Code
- Authorization URL
- https://app.sideshift.app/api/oauth/v1/authorize
- Token URL
- https://app.sideshift.app/api/oauth/v1/token
- Refresh URL
- https://app.sideshift.app/api/oauth/v1/token
Scopes1
ads:write
Create and manage ad campaigns and connected ad accounts (sensitive — this can spend money)
Headers
Client-chosen key; replaying the same key + body returns the original response, a different body returns 409.
Body
application/json
Response
Success. Returns the resource envelope.
The response is of type object.