curl --request POST \
--url https://api.sixtyfour.ai/monitors \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"key_columns": [
"<string>"
],
"struct": {},
"monitor_type": "research",
"rows": [
{}
],
"handle_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"frequency": "1d",
"tier": "low",
"subject_type": "company",
"research_plan": "<string>",
"webhook_url": "<string>",
"webhook_event_types": [
"<string>"
],
"metadata": {},
"is_active": true,
"first_check": "now",
"idempotency_key": "<string>"
}
'import requests
url = "https://api.sixtyfour.ai/monitors"
payload = {
"name": "<string>",
"key_columns": ["<string>"],
"struct": {},
"monitor_type": "research",
"rows": [{}],
"handle_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"frequency": "1d",
"tier": "low",
"subject_type": "company",
"research_plan": "<string>",
"webhook_url": "<string>",
"webhook_event_types": ["<string>"],
"metadata": {},
"is_active": True,
"first_check": "now",
"idempotency_key": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
key_columns: ['<string>'],
struct: {},
monitor_type: 'research',
rows: [{}],
handle_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
frequency: '1d',
tier: 'low',
subject_type: 'company',
research_plan: '<string>',
webhook_url: '<string>',
webhook_event_types: ['<string>'],
metadata: {},
is_active: true,
first_check: 'now',
idempotency_key: '<string>'
})
};
fetch('https://api.sixtyfour.ai/monitors', 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.sixtyfour.ai/monitors",
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>',
'key_columns' => [
'<string>'
],
'struct' => [
],
'monitor_type' => 'research',
'rows' => [
[
]
],
'handle_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'frequency' => '1d',
'tier' => 'low',
'subject_type' => 'company',
'research_plan' => '<string>',
'webhook_url' => '<string>',
'webhook_event_types' => [
'<string>'
],
'metadata' => [
],
'is_active' => true,
'first_check' => 'now',
'idempotency_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.sixtyfour.ai/monitors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.sixtyfour.ai/monitors")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sixtyfour.ai/monitors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"org_id": "<string>",
"team_id": "<string>",
"name": "<string>",
"frequency": "<string>",
"struct": {},
"tier": "<string>",
"subject_type": "<string>",
"research_plan": "<string>",
"is_active": true,
"disabled_reason": "<string>",
"webhook_url": "<string>",
"webhook_event_types": [
"<string>"
],
"metadata": {},
"last_run_at": "<string>",
"next_run_times": [
"<string>"
],
"row_count": 123,
"active_row_count": 123,
"status": "starting",
"created_at": "<string>",
"updated_at": "<string>",
"monitor_type": "research"
}{
"detail": "Invalid request body",
"code": "bad_request",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "Invalid API key",
"code": "unauthenticated",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour.",
"code": "forbidden",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "<string>",
"feedback": "<string>",
"code": "<string>",
"correlation_id": "<string>"
}{
"detail": "Internal server error",
"code": "internal_error",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "Could not verify the API key right now. Retry shortly.",
"code": "unavailable",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}Create Monitor
Create one monitor from a table, with a row per subject.
Cells you supply for watched fields become their starting values. A row missing any is enriched once before its recurring checks start.
curl --request POST \
--url https://api.sixtyfour.ai/monitors \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "<string>",
"key_columns": [
"<string>"
],
"struct": {},
"monitor_type": "research",
"rows": [
{}
],
"handle_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"frequency": "1d",
"tier": "low",
"subject_type": "company",
"research_plan": "<string>",
"webhook_url": "<string>",
"webhook_event_types": [
"<string>"
],
"metadata": {},
"is_active": true,
"first_check": "now",
"idempotency_key": "<string>"
}
'import requests
url = "https://api.sixtyfour.ai/monitors"
payload = {
"name": "<string>",
"key_columns": ["<string>"],
"struct": {},
"monitor_type": "research",
"rows": [{}],
"handle_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"frequency": "1d",
"tier": "low",
"subject_type": "company",
"research_plan": "<string>",
"webhook_url": "<string>",
"webhook_event_types": ["<string>"],
"metadata": {},
"is_active": True,
"first_check": "now",
"idempotency_key": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
key_columns: ['<string>'],
struct: {},
monitor_type: 'research',
rows: [{}],
handle_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
frequency: '1d',
tier: 'low',
subject_type: 'company',
research_plan: '<string>',
webhook_url: '<string>',
webhook_event_types: ['<string>'],
metadata: {},
is_active: true,
first_check: 'now',
idempotency_key: '<string>'
})
};
fetch('https://api.sixtyfour.ai/monitors', 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.sixtyfour.ai/monitors",
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>',
'key_columns' => [
'<string>'
],
'struct' => [
],
'monitor_type' => 'research',
'rows' => [
[
]
],
'handle_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'frequency' => '1d',
'tier' => 'low',
'subject_type' => 'company',
'research_plan' => '<string>',
'webhook_url' => '<string>',
'webhook_event_types' => [
'<string>'
],
'metadata' => [
],
'is_active' => true,
'first_check' => 'now',
'idempotency_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.sixtyfour.ai/monitors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.sixtyfour.ai/monitors")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sixtyfour.ai/monitors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"monitor_type\": \"research\",\n \"rows\": [\n {}\n ],\n \"handle_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"frequency\": \"1d\",\n \"tier\": \"low\",\n \"subject_type\": \"company\",\n \"research_plan\": \"<string>\",\n \"webhook_url\": \"<string>\",\n \"webhook_event_types\": [\n \"<string>\"\n ],\n \"metadata\": {},\n \"is_active\": true,\n \"first_check\": \"now\",\n \"idempotency_key\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"org_id": "<string>",
"team_id": "<string>",
"name": "<string>",
"frequency": "<string>",
"struct": {},
"tier": "<string>",
"subject_type": "<string>",
"research_plan": "<string>",
"is_active": true,
"disabled_reason": "<string>",
"webhook_url": "<string>",
"webhook_event_types": [
"<string>"
],
"metadata": {},
"last_run_at": "<string>",
"next_run_times": [
"<string>"
],
"row_count": 123,
"active_row_count": 123,
"status": "starting",
"created_at": "<string>",
"updated_at": "<string>",
"monitor_type": "research"
}{
"detail": "Invalid request body",
"code": "bad_request",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "Invalid API key",
"code": "unauthenticated",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour.",
"code": "forbidden",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "<string>",
"feedback": "<string>",
"code": "<string>",
"correlation_id": "<string>"
}{
"detail": "Internal server error",
"code": "internal_error",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}{
"detail": "Could not verify the API key right now. Retry shortly.",
"code": "unavailable",
"correlation_id": "enrich_3f8b2c1e-9d4a-4c1b-8e2f-6a7b5c4d3e21",
"feedback": "Problem with this response? POST /feedback with comment and operation; include correlation_id in your comment."
}Authorizations
Your Sixtyfour API key.
Body
Create one monitor from a table, one row per subject.
A column named after a struct field seeds that field's starting value; other fields are set by the
first check.
Monitor name. Each row is named <name> — <key values>.
1 - 1201100000Field name -> what to find. The same shape enrichment takes: either a sentence, or an object with 'type', 'description' and, for a nested field, 'subfields'.
research, linkedin Upload handle returned by /storage/csv/upload. Use instead of rows.
200200Which enrichment re-derives the fields: 'company' or 'lead'.
2001000002048Which events POST to webhook_url: any of 'monitor.field.changed', 'monitor.execution.completed', 'monitor.execution.failed', 'monitor.run.completed'. Defaults to ['monitor.field.changed']. A monitor's first check records starting values rather than changes, so subscribe to 'monitor.execution.completed' to hear about every finished check.
200When setup runs for rows missing watched values. 'now' triggers setup immediately; 'next_tick' waits for the schedule. Fully supplied rows always start on the schedule: an hourly monitor first runs at the next :00 UTC, a daily one at the next 00:00 UTC. The response's next_run_times says exactly when.
now, next_tick Optional. Resending a request with the same key returns what the first attempt created instead of creating the monitor twice. Reusing a key with different content returns 409. Omitted, a key is derived from the request's own content, so an identical resend replays by default.
255Response
Successful Response
One uploaded table, watched as a single thing.
row_count and active_row_count differ when rows have been switched off.
'starting' while an uploaded file's rows are still being added, 'failed' when adding them failed. Nothing is checked until it becomes 'active'. 'cancelled' means the owner cancelled it; 'paused' means it was switched off without cancellation.
starting, failed, active, paused, cancelled research, linkedin Was this page helpful?