curl --request PUT \
--url https://api.erdo.ai/v1/provider-lead-sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "<string>",
"connection_id": "<string>",
"dataset": "<string>",
"enabled": true,
"forms": [
"<string>"
],
"provider": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/provider-lead-sources"
payload = {
"account_id": "<string>",
"connection_id": "<string>",
"dataset": "<string>",
"enabled": True,
"forms": ["<string>"],
"provider": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '<string>',
connection_id: '<string>',
dataset: '<string>',
enabled: true,
forms: ['<string>'],
provider: '<string>'
})
};
fetch('https://api.erdo.ai/v1/provider-lead-sources', 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.erdo.ai/v1/provider-lead-sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => '<string>',
'connection_id' => '<string>',
'dataset' => '<string>',
'enabled' => true,
'forms' => [
'<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://api.erdo.ai/v1/provider-lead-sources"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.erdo.ai/v1/provider-lead-sources")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/provider-lead-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"account_id": "<string>",
"connection_id": "<string>",
"created_at": "<string>",
"dataset": "<string>",
"enabled": true,
"forms": [
"<string>"
],
"last_error": "<string>",
"last_run_at": "<string>",
"provider": "<string>",
"synced_through": "<string>",
"updated_at": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Declares that an ad platform's lead form responses for one ad account are
written into a lead dataset. Every fifteen minutes Erdo reads the account’s responses and writes those submitted on the listed forms, each exactly once, with submitted_at set to when Erdo wrote the row and ts to when the person submitted the form. The dataset must have lead identity turned on, and every form must belong to the account; the save is refused otherwise. Saving replaces the declaration for the same provider and account.
REST only, with no MCP tool, like scheduled actions: connecting an ad account’s leads to a dataset is a commitment about whose prospects land where, made by somebody who holds the connection, not a step an agent takes mid-task.
curl --request PUT \
--url https://api.erdo.ai/v1/provider-lead-sources \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"account_id": "<string>",
"connection_id": "<string>",
"dataset": "<string>",
"enabled": true,
"forms": [
"<string>"
],
"provider": "<string>"
}
'import requests
url = "https://api.erdo.ai/v1/provider-lead-sources"
payload = {
"account_id": "<string>",
"connection_id": "<string>",
"dataset": "<string>",
"enabled": True,
"forms": ["<string>"],
"provider": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: '<string>',
connection_id: '<string>',
dataset: '<string>',
enabled: true,
forms: ['<string>'],
provider: '<string>'
})
};
fetch('https://api.erdo.ai/v1/provider-lead-sources', 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.erdo.ai/v1/provider-lead-sources",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => '<string>',
'connection_id' => '<string>',
'dataset' => '<string>',
'enabled' => true,
'forms' => [
'<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://api.erdo.ai/v1/provider-lead-sources"
payload := strings.NewReader("{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.erdo.ai/v1/provider-lead-sources")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.erdo.ai/v1/provider-lead-sources")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": \"<string>\",\n \"connection_id\": \"<string>\",\n \"dataset\": \"<string>\",\n \"enabled\": true,\n \"forms\": [\n \"<string>\"\n ],\n \"provider\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"account_id": "<string>",
"connection_id": "<string>",
"created_at": "<string>",
"dataset": "<string>",
"enabled": true,
"forms": [
"<string>"
],
"last_error": "<string>",
"last_run_at": "<string>",
"provider": "<string>",
"synced_through": "<string>",
"updated_at": "<string>"
}{
"code": "not_found",
"details": {},
"message": "<string>"
}Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Body
Response
Success response
owns are ever written.
responses are read through.
empty when it never has.
handled through (RFC 3339), or empty before the first complete sync.

