curl --request POST \
--url https://api.1club.ai/v1/platform/competitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"clubId": 123,
"notes": "<string>"
}
'import requests
url = "https://api.1club.ai/v1/platform/competitors"
payload = {
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"clubId": 123,
"notes": "<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({
name: '<string>',
website: '<string>',
googlePlaceId: '<string>',
clubId: 123,
notes: '<string>'
})
};
fetch('https://api.1club.ai/v1/platform/competitors', 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.1club.ai/v1/platform/competitors",
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([
'name' => '<string>',
'website' => '<string>',
'googlePlaceId' => '<string>',
'clubId' => 123,
'notes' => '<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.1club.ai/v1/platform/competitors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<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://api.1club.ai/v1/platform/competitors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/competitors")
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 \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"logoUrl": "<string>",
"clubId": 123,
"notes": "<string>",
"lastCheckedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"google": {
"rating": 123,
"ratingCount": 123
},
"latestChanges": [
{
"kind": "price_changed",
"name": "<string>",
"before": "<string>",
"after": "<string>"
}
]
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Add a competitor
Adds a club to follow. Its website is read in the background within about a minute, then every week; lastCheckedAt stays null until the first reading lands. Give its own website, not a social profile (400, code competitor_website_invalid), or its Google place id, which brings the website with it. A club already on the list by place or website is a 409 (code competitor_exists); a full list of 10 is a 400 (code competitor_limit). Requires competitors:write. Supports the Idempotency-Key header.
curl --request POST \
--url https://api.1club.ai/v1/platform/competitors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"clubId": 123,
"notes": "<string>"
}
'import requests
url = "https://api.1club.ai/v1/platform/competitors"
payload = {
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"clubId": 123,
"notes": "<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({
name: '<string>',
website: '<string>',
googlePlaceId: '<string>',
clubId: 123,
notes: '<string>'
})
};
fetch('https://api.1club.ai/v1/platform/competitors', 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.1club.ai/v1/platform/competitors",
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([
'name' => '<string>',
'website' => '<string>',
'googlePlaceId' => '<string>',
'clubId' => 123,
'notes' => '<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.1club.ai/v1/platform/competitors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<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://api.1club.ai/v1/platform/competitors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/competitors")
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 \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"googlePlaceId\": \"<string>\",\n \"clubId\": 123,\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"website": "<string>",
"googlePlaceId": "<string>",
"logoUrl": "<string>",
"clubId": 123,
"notes": "<string>",
"lastCheckedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"google": {
"rating": 123,
"ratingCount": 123
},
"latestChanges": [
{
"kind": "price_changed",
"name": "<string>",
"before": "<string>",
"after": "<string>"
}
]
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Headers
Retry-safe key; a repeat of the same request replays the first response
255Body
1 - 120The club's own website, not a social profile. Changing it discards the readings of the old one.
500Their Google place id, for the rating and reviews. On create without a website, the website comes from the place.
300The organization's club it competes with; null for all of them
2000Response
The competitor
The website the weekly watch reads
Their logo, as the last reading of their website found it
The organization's club it competes with; null for all of them
When their website was last read; null until the first reading lands (about a minute after adding)
The club's Google rating, read live and cached for a day at most. Null when it has no Google place or Google did not answer.
Show child attributes
Show child attributes
What the latest reading found changed on their website
Show child attributes
Show child attributes
Was this page helpful?