curl --request POST \
--url https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"provider": "google_ads",
"name": "Customer 42 — Google Ads",
"settings": {
"customerId": "123-456-7890"
},
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"linkExpiresInDays": 7
}
'import requests
url = "https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations"
payload = {
"provider": "google_ads",
"name": "Customer 42 — Google Ads",
"settings": { "customerId": "123-456-7890" },
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"linkExpiresInDays": 7
}
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({
provider: 'google_ads',
name: 'Customer 42 — Google Ads',
settings: {customerId: '123-456-7890'},
returnUrl: 'https://app.acme.com/integrations/done?customer=42',
linkExpiresInDays: 7
})
};
fetch('https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations', 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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations",
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([
'provider' => 'google_ads',
'name' => 'Customer 42 — Google Ads',
'settings' => [
'customerId' => '123-456-7890'
],
'returnUrl' => 'https://app.acme.com/integrations/done?customer=42',
'linkExpiresInDays' => 7
]),
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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations"
payload := strings.NewReader("{\n \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations")
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 \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\n}"
response = http.request(request)
puts response.read_body{
"id": "5b1f2c3d-8e4a-4c6b-9d0e-1f2a3b4c5d6e",
"workspaceId": "ws_7f3c2a",
"provider": "google_ads",
"providerName": "Google Ads",
"category": "wg",
"authMethod": "oauth",
"name": "Customer 42 — Google Ads",
"status": "pending",
"statusDetail": null,
"statusCheckedAt": null,
"lastError": null,
"lastErrorAt": null,
"settings": {
"customerId": "123-456-7890"
},
"connectedAt": null,
"connectedAccount": null,
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"connectLink": {
"connectUrl": "https://platform.01ads.com/connect/8f3c1a2b4d5e6f7a8b9c0d1e2f3a4b5c",
"expiresAt": "2026-09-08T09:00:00.000Z",
"expired": false
},
"createdByEmail": "ada@acme-corp.com",
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-01T09:00:00.000Z",
"connectUrl": "https://platform.01ads.com/connect/8f3c1a2b4d5e6f7a8b9c0d1e2f3a4b5c"
}{
"type": "about:blank",
"title": "Validation Failed",
"status": 400,
"detail": "The request does not match the expected schema.",
"instance": "/v1/organizations/acme-corp/workspaces",
"requestId": "7c1b0c1e-5b7d-4b2a-9f1e-3c2d1a0b9e8f",
"errors": [
{
"path": "name",
"message": "Too small: expected string to have >=1 characters"
}
]
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Authentication required. Sign in and try again.",
"instance": "/v1/organizations",
"requestId": "2f6a9c3d-1e4b-4a8c-b7d2-5e0f1a2b3c4d"
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"instance": "/v1/me",
"detail": "<string>",
"requestId": "<string>",
"errors": [
{
"path": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "Organization not found.",
"instance": "/v1/organizations/no-such-org",
"requestId": "a1b2c3d4-9e8f-4d7c-8b6a-5f4e3d2c1b0a"
}Create an integration and its connect link
Effective workspace members and admins (sessions, or API keys whose scope reaches the workspace with at least the member role). The integration starts pending; send connectUrl to the client who will authorize the access — it stays readable on the integration until used or replaced.
curl --request POST \
--url https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"provider": "google_ads",
"name": "Customer 42 — Google Ads",
"settings": {
"customerId": "123-456-7890"
},
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"linkExpiresInDays": 7
}
'import requests
url = "https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations"
payload = {
"provider": "google_ads",
"name": "Customer 42 — Google Ads",
"settings": { "customerId": "123-456-7890" },
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"linkExpiresInDays": 7
}
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({
provider: 'google_ads',
name: 'Customer 42 — Google Ads',
settings: {customerId: '123-456-7890'},
returnUrl: 'https://app.acme.com/integrations/done?customer=42',
linkExpiresInDays: 7
})
};
fetch('https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations', 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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations",
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([
'provider' => 'google_ads',
'name' => 'Customer 42 — Google Ads',
'settings' => [
'customerId' => '123-456-7890'
],
'returnUrl' => 'https://app.acme.com/integrations/done?customer=42',
'linkExpiresInDays' => 7
]),
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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations"
payload := strings.NewReader("{\n \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\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.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.01ads.com/v1/organizations/{orgSlug}/workspaces/{workspaceSlug}/integrations")
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 \"provider\": \"google_ads\",\n \"name\": \"Customer 42 — Google Ads\",\n \"settings\": {\n \"customerId\": \"123-456-7890\"\n },\n \"returnUrl\": \"https://app.acme.com/integrations/done?customer=42\",\n \"linkExpiresInDays\": 7\n}"
response = http.request(request)
puts response.read_body{
"id": "5b1f2c3d-8e4a-4c6b-9d0e-1f2a3b4c5d6e",
"workspaceId": "ws_7f3c2a",
"provider": "google_ads",
"providerName": "Google Ads",
"category": "wg",
"authMethod": "oauth",
"name": "Customer 42 — Google Ads",
"status": "pending",
"statusDetail": null,
"statusCheckedAt": null,
"lastError": null,
"lastErrorAt": null,
"settings": {
"customerId": "123-456-7890"
},
"connectedAt": null,
"connectedAccount": null,
"returnUrl": "https://app.acme.com/integrations/done?customer=42",
"connectLink": {
"connectUrl": "https://platform.01ads.com/connect/8f3c1a2b4d5e6f7a8b9c0d1e2f3a4b5c",
"expiresAt": "2026-09-08T09:00:00.000Z",
"expired": false
},
"createdByEmail": "ada@acme-corp.com",
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-01T09:00:00.000Z",
"connectUrl": "https://platform.01ads.com/connect/8f3c1a2b4d5e6f7a8b9c0d1e2f3a4b5c"
}{
"type": "about:blank",
"title": "Validation Failed",
"status": 400,
"detail": "The request does not match the expected schema.",
"instance": "/v1/organizations/acme-corp/workspaces",
"requestId": "7c1b0c1e-5b7d-4b2a-9f1e-3c2d1a0b9e8f",
"errors": [
{
"path": "name",
"message": "Too small: expected string to have >=1 characters"
}
]
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "Authentication required. Sign in and try again.",
"instance": "/v1/organizations",
"requestId": "2f6a9c3d-1e4b-4a8c-b7d2-5e0f1a2b3c4d"
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"instance": "/v1/me",
"detail": "<string>",
"requestId": "<string>",
"errors": [
{
"path": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "Organization not found.",
"instance": "/v1/organizations/no-such-org",
"requestId": "a1b2c3d4-9e8f-4d7c-8b6a-5f4e3d2c1b0a"
}Authorizations
Session token as Authorization: Bearer (the CLI and scripts).
Body
the_trade_desk, amazon_dsp, walmart_dsp, beeswax, google_dv360, openx, google_ad_manager, google_ads, meta, tiktok, snapchat, x, reddit, openai_ads, roku, iqm, yahoo_dsp, mediamath, linkedin, pinterest 1 - 100Non-secret provider configuration, validated against the provider's settings fields: GET /v1/integrations/providers/{provider} lists them, and the <Provider>Settings schemas describe each shipped provider
Show child attributes
Show child attributes
Where the client is sent after authorizing; https (http on loopback in development)
2048Connect-link lifetime, default 7
1 <= x <= 30Response
Created
"google_ads"
"Google Ads"
dsp, ssp, wg, null oauth, credentials, null "Acme Google Ads"
pending, active, error, disabled Why the status is error
Last transient failure, if any
Non-secret provider configuration, validated against the provider's settings fields: GET /v1/integrations/providers/{provider} lists them, and the <Provider>Settings schemas describe each shipped provider
Show child attributes
Show child attributes
The external account that authorized access
The live connect link; null when none was issued or it was used
Show child attributes
Show child attributes
The connect link for the client (also in connectLink.connectUrl)
"https://portal.example.com/connect/…"
Was this page helpful?