Exchange a Meta OAuth code for a connection
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/ads/oauth/exchange \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "AQD3xk9d1e2f3g4h5i6j7k8l9m0n",
"redirect_uri": "https://app.orbit.devotel.io/ads/callback"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/ads/oauth/exchange"
payload = {
"code": "AQD3xk9d1e2f3g4h5i6j7k8l9m0n",
"redirect_uri": "https://app.orbit.devotel.io/ads/callback"
}
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({
code: 'AQD3xk9d1e2f3g4h5i6j7k8l9m0n',
redirect_uri: 'https://app.orbit.devotel.io/ads/callback'
})
};
fetch('https://api.orbit.devotel.io/api/v1/ads/oauth/exchange', 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://api.orbit.devotel.io/api/v1/ads/oauth/exchange",
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([
'code' => 'AQD3xk9d1e2f3g4h5i6j7k8l9m0n',
'redirect_uri' => 'https://app.orbit.devotel.io/ads/callback'
]),
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://api.orbit.devotel.io/api/v1/ads/oauth/exchange"
payload := strings.NewReader("{\n \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\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://api.orbit.devotel.io/api/v1/ads/oauth/exchange")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/ads/oauth/exchange")
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 \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\n}"
response = http.request(request)
puts response.read_body{}Ads
Exchange a Meta OAuth code for a connection
Completes the Meta (Facebook) Ads connect flow: exchanges the short-lived OAuth code returned to your redirect URI for a long-lived access token, looks up the authorizing user’s ad accounts, and stores the encrypted token against the first account found. Call it from your OAuth callback page right after the user authorizes in Facebook — you do not need to call /connect separately. Owner or admin only.
POST
/
api
/
v1
/
ads
/
oauth
/
exchange
Exchange a Meta OAuth code for a connection
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/ads/oauth/exchange \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"code": "AQD3xk9d1e2f3g4h5i6j7k8l9m0n",
"redirect_uri": "https://app.orbit.devotel.io/ads/callback"
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/ads/oauth/exchange"
payload = {
"code": "AQD3xk9d1e2f3g4h5i6j7k8l9m0n",
"redirect_uri": "https://app.orbit.devotel.io/ads/callback"
}
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({
code: 'AQD3xk9d1e2f3g4h5i6j7k8l9m0n',
redirect_uri: 'https://app.orbit.devotel.io/ads/callback'
})
};
fetch('https://api.orbit.devotel.io/api/v1/ads/oauth/exchange', 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://api.orbit.devotel.io/api/v1/ads/oauth/exchange",
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([
'code' => 'AQD3xk9d1e2f3g4h5i6j7k8l9m0n',
'redirect_uri' => 'https://app.orbit.devotel.io/ads/callback'
]),
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://api.orbit.devotel.io/api/v1/ads/oauth/exchange"
payload := strings.NewReader("{\n \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\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://api.orbit.devotel.io/api/v1/ads/oauth/exchange")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/ads/oauth/exchange")
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 \"code\": \"AQD3xk9d1e2f3g4h5i6j7k8l9m0n\",\n \"redirect_uri\": \"https://app.orbit.devotel.io/ads/callback\"\n}"
response = http.request(request)
puts response.read_body{}Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Body
application/json
Response
200 - application/json
The connected ad_account_id, a connected flag, and the list of accounts discovered on the authorizing Meta profile, inside the standard { data, meta } envelope.
The response is of type object.
⌘I