curl --request POST \
--url https://api.sixtyfour.ai/monitors \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"key_columns": [
"<string>"
],
"struct": {},
"rows": [
{}
],
"source": {
"run_id": "<string>",
"storage_url": "<string>",
"sha256": "<string>",
"row_indices": [
123
]
},
"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": {},
"rows": [{}],
"source": {
"run_id": "<string>",
"storage_url": "<string>",
"sha256": "<string>",
"row_indices": [123]
},
"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 = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
key_columns: ['<string>'],
struct: {},
rows: [{}],
source: {
run_id: '<string>',
storage_url: '<string>',
sha256: '<string>',
row_indices: [123]
},
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' => [
],
'rows' => [
[
]
],
'source' => [
'run_id' => '<string>',
'storage_url' => '<string>',
'sha256' => '<string>',
'row_indices' => [
123
]
],
'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"
],
]);
$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 \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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("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("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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>"
}{
"detail": "Invalid request body"
}{
"detail": "Invalid API key"
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour."
}{
"detail": "<string>"
}{
"detail": "Internal server error"
}{
"detail": "Could not verify the API key right now. Retry shortly."
}Create Monitor
Create one monitor from a table, with a row per subject.
Supplied watched cells become the baseline. Complete rows skip setup; incomplete rows need an initial enrichment before recurring checks.
curl --request POST \
--url https://api.sixtyfour.ai/monitors \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"key_columns": [
"<string>"
],
"struct": {},
"rows": [
{}
],
"source": {
"run_id": "<string>",
"storage_url": "<string>",
"sha256": "<string>",
"row_indices": [
123
]
},
"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": {},
"rows": [{}],
"source": {
"run_id": "<string>",
"storage_url": "<string>",
"sha256": "<string>",
"row_indices": [123]
},
"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 = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
key_columns: ['<string>'],
struct: {},
rows: [{}],
source: {
run_id: '<string>',
storage_url: '<string>',
sha256: '<string>',
row_indices: [123]
},
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' => [
],
'rows' => [
[
]
],
'source' => [
'run_id' => '<string>',
'storage_url' => '<string>',
'sha256' => '<string>',
'row_indices' => [
123
]
],
'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"
],
]);
$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 \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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("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("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"key_columns\": [\n \"<string>\"\n ],\n \"struct\": {},\n \"rows\": [\n {}\n ],\n \"source\": {\n \"run_id\": \"<string>\",\n \"storage_url\": \"<string>\",\n \"sha256\": \"<string>\",\n \"row_indices\": [\n 123\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>"
}{
"detail": "Invalid request body"
}{
"detail": "Invalid API key"
}{
"detail": "This organization no longer has access to Sixtyfour. Contact your representative at Sixtyfour."
}{
"detail": "<string>"
}{
"detail": "Internal server error"
}{
"detail": "Could not verify the API key right now. Retry shortly."
}Headers
Body
Start one monitor per row of a table.
A row column named after a struct field seeds that field's starting value; a field with no matching column is established by the first check.
Base name; the row's key values are appended.
1 - 1201Field name -> what to find. The same shape enrichment takes: either a sentence, or an object with 'type', 'description' and, for a nested field, 'subfields'.
Show child attributes
Show child attributes
Upload handle returned by /storage/csv/upload. Use instead of rows or source.
Which enrichment re-derives the fields: 'company' or 'lead'.
Which 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.
When 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 batch 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.
200Response
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 Was this page helpful?