Every key of an object, and how to select and filter on it
curl --request GET \
--url https://api.letterdrop.com/api/v2/fields \
--header 'api-key: <api-key>'const options = {method: 'GET', headers: {'api-key': '<api-key>'}};
fetch('https://api.letterdrop.com/api/v2/fields', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.letterdrop.com/api/v2/fields"
headers = {"api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"object": "account",
"description": "A company with competitor signals: one row of the table. Contacts (with their signals), the buying committee and the job-postings rollup are nested in it.",
"endpoints": [
"/accounts",
"/accounts/lookup",
"/accounts/{account_id}"
],
"select": "fields=<key>,<key>; dotted keys reach into lists (contacts.contact_name).",
"filter": [
"On /accounts: filter[<key>]=<value> or filter[<key>][<operator>]=<value>."
],
"keys": [
{
"key": "account_competitors",
"group": "Account",
"type": "string",
"description": "Every competitor with signals at this account, comma-joined (\"Common Room, G2\"), as the webhook sends it.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
],
"fast_operators": [
"eq"
],
"values": [
"HubSpot",
"Salesforce"
],
"filter_parameters": [
"account_competitors"
]
},
{
"key": "account_priority",
"group": "Account",
"type": "string",
"description": "How soon to act, as the Competitor Monitoring table shows it. The webhook sends this as signal_priority.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
],
"fast_operators": [
"eq"
],
"values": [
"High",
"Medium",
"Nurture"
],
"filter_parameters": [
"account_priority"
]
},
{
"key": "crm_latest_opp_amount",
"group": "CRM",
"type": "number",
"nullable": true,
"description": "Its amount.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"gt",
"gte",
"lt",
"lte",
"exists"
]
},
{
"key": "crm_custom_fields",
"group": "CRM",
"type": "object",
"description": "The CRM columns you added to the table, keyed \"<crm>:<object>:<field>\" (e.g. \"hubspot:company:Tier\"), each a list of values.",
"selectable": true,
"filterable": false,
"filter_parameters": [
"crm_custom_fields"
],
"custom_fields": [
{
"key": "hubspot:company:Tier",
"label": "Tier",
"crm_type": "hubspot",
"object_type": "company",
"name": "Tier",
"field_type": "text",
"values": [
"A",
"B"
]
}
]
},
{
"key": "contacts.contact_job_title",
"group": "Contact",
"type": "string",
"description": "Current job title.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
]
}
],
"filter_parameters": [
{
"parameter": "search",
"description": "Free-text match on company and contact names."
},
{
"parameter": "preset",
"description": "A prebuilt view of the table. CRM presets replace crm_latest_opp_stage with their own rule.",
"values": [
"pilot",
"advertising",
"capacity_based_outbound",
"sell_now",
"competitor_aware_tam",
"customers_at_risk",
"competitive_deals"
]
},
{
"parameter": "crm_has_opp",
"description": "false = accounts with no CRM opportunity. true is the same as listing every crm_latest_opp_stage."
},
{
"parameter": "crm_has_account",
"description": "true = the account was already in your CRM when we found it, false = net new (it was not). An account added to the CRM later can have crm_account_url set and still be net new."
}
],
"sort": [
"latest_signal_date",
"account_priority",
"crm_latest_opp_created_date",
"crm_latest_opp_close_date"
],
"connected_crms": [
"hubspot"
]
},
"meta": {
"api_version": "2",
"data_as_of": "2026-11-02T09:36:28.016Z",
"cache": "hit"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}Filters
Every key of an object, and how to select and filter on it
Call this first. With object=account (or contact, signal, …) it lists every key the object carries: its type, whether fields= can select it and filter[…] can filter on it, the operators, and the values it takes, with this workspace’s competitors, opportunity stages, owners and custom CRM fields filled in. Without object, it lists the objects.
GET
/
fields
Every key of an object, and how to select and filter on it
curl --request GET \
--url https://api.letterdrop.com/api/v2/fields \
--header 'api-key: <api-key>'const options = {method: 'GET', headers: {'api-key': '<api-key>'}};
fetch('https://api.letterdrop.com/api/v2/fields', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.letterdrop.com/api/v2/fields"
headers = {"api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"object": "account",
"description": "A company with competitor signals: one row of the table. Contacts (with their signals), the buying committee and the job-postings rollup are nested in it.",
"endpoints": [
"/accounts",
"/accounts/lookup",
"/accounts/{account_id}"
],
"select": "fields=<key>,<key>; dotted keys reach into lists (contacts.contact_name).",
"filter": [
"On /accounts: filter[<key>]=<value> or filter[<key>][<operator>]=<value>."
],
"keys": [
{
"key": "account_competitors",
"group": "Account",
"type": "string",
"description": "Every competitor with signals at this account, comma-joined (\"Common Room, G2\"), as the webhook sends it.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
],
"fast_operators": [
"eq"
],
"values": [
"HubSpot",
"Salesforce"
],
"filter_parameters": [
"account_competitors"
]
},
{
"key": "account_priority",
"group": "Account",
"type": "string",
"description": "How soon to act, as the Competitor Monitoring table shows it. The webhook sends this as signal_priority.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
],
"fast_operators": [
"eq"
],
"values": [
"High",
"Medium",
"Nurture"
],
"filter_parameters": [
"account_priority"
]
},
{
"key": "crm_latest_opp_amount",
"group": "CRM",
"type": "number",
"nullable": true,
"description": "Its amount.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"gt",
"gte",
"lt",
"lte",
"exists"
]
},
{
"key": "crm_custom_fields",
"group": "CRM",
"type": "object",
"description": "The CRM columns you added to the table, keyed \"<crm>:<object>:<field>\" (e.g. \"hubspot:company:Tier\"), each a list of values.",
"selectable": true,
"filterable": false,
"filter_parameters": [
"crm_custom_fields"
],
"custom_fields": [
{
"key": "hubspot:company:Tier",
"label": "Tier",
"crm_type": "hubspot",
"object_type": "company",
"name": "Tier",
"field_type": "text",
"values": [
"A",
"B"
]
}
]
},
{
"key": "contacts.contact_job_title",
"group": "Contact",
"type": "string",
"description": "Current job title.",
"selectable": true,
"filterable": true,
"operators": [
"eq",
"ne",
"contains",
"exists"
]
}
],
"filter_parameters": [
{
"parameter": "search",
"description": "Free-text match on company and contact names."
},
{
"parameter": "preset",
"description": "A prebuilt view of the table. CRM presets replace crm_latest_opp_stage with their own rule.",
"values": [
"pilot",
"advertising",
"capacity_based_outbound",
"sell_now",
"competitor_aware_tam",
"customers_at_risk",
"competitive_deals"
]
},
{
"parameter": "crm_has_opp",
"description": "false = accounts with no CRM opportunity. true is the same as listing every crm_latest_opp_stage."
},
{
"parameter": "crm_has_account",
"description": "true = the account was already in your CRM when we found it, false = net new (it was not). An account added to the CRM later can have crm_account_url set and still be net new."
}
],
"sort": [
"latest_signal_date",
"account_priority",
"crm_latest_opp_created_date",
"crm_latest_opp_close_date"
],
"connected_crms": [
"hubspot"
]
},
"meta": {
"api_version": "2",
"data_as_of": "2026-11-02T09:36:28.016Z",
"cache": "hit"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}Authorizations
WorkspaceKeyBearerAuth
Scopes
mcp.read
Query Parameters
The object whose keys to list. Omit to list the objects.
Available options:
account, contact, signal, buying_committee, outreach, opportunity, job_postings true = only keys filter[...] accepts.
Available options:
true, false