API reference
List the Companies table
The Companies table as the user sees it in mySDR: the employers of the people in the Leads table and the companies an agent saved, merged on LinkedIn page and domain. total is the number next to the Companies tab when no filter is set. The Leads and Companies tables are what the user sees in mySDR. Your agent decides what goes in them: search results do not land there by themselves. The user keeps the overview there; your agent reads the same tables here and fills them with POST.
GEThttps://mysdr.app/api/v1/tables/companies
Authentication
Send Authorization: Bearer gtk_…. Create the key under Connect assistant → API keys. Every gtk_ key can call these routes, also while the Signals API is closed. A missing, invalid or revoked key is 401.
Query parameters
qstring— Only rows whose name, title, company, place, signal or one of your own field values contains this text (up to 100 characters).sourcestring— Only rows from the signals on Signals, or only what an agent saved. One of:signal,assistant.limitinteger— How many rows to return, from 1 to 100. Defaults to 50.offsetinteger— Skip this many rows. Passnext_offsetof the previous page.outreachstring— Only companies whose people or general address are in this outreach state;any= with outreach,none= without. One of:scheduled,ongoing,replied,done,any,none.lifecyclestring— Only rows in this state of the Status column the user sees (lifecycleon each row);open=new,scheduled,contacted,replied,interestedandmeeting. Several separated by commas. One of:new,scheduled,contacted,replied,interested,meeting,later,no_reply,not_interested,archived,open.statusstring— Only rows with this status; several separated by commas. A snooze that ended counts asnew. One of:new,needs_decision,snoozed,archived.lead_statusstring— Only rows with this lead status;none= without one. Several separated by commas. One of:interested,meeting,later,not_interested,none.duestring— By next action:today(today and everything overdue),overdue,week(the next 7 days and overdue),any(has one),none. One of:today,overdue,week,any,none.campaignstring— Only rows in this campaign (a campaign id).stagestring— Only rows in these stages (keys from GET /stages);none= without a stage. Several separated by commas.ownerstring— Only rows of these owners:me, a colleague's email address or user id (GET /team), ornone. Several separated by commas.do_not_contactboolean—true= only rows on the exclusions (marked Do not contact in mySDR),false= only rows that may be contacted.agent_signalstring— Only rows your own signals caught (POST /agent-signals/{key}/hits): their keys, separated by commas. A key the organization does not have is a 400.field.{key}string— Only rows whose own field{key}has this value; several separated by commas (any of them). Text without case, a number by its value, true/false or yes/no for a yes/no field. E.g.field.ats=recruitee,teamtailor.field.{key}.gtenumber— Only rows whose field{key}is a number of at least this. E.g.field.fte.gte=200.field.{key}.ltenumber— Only rows whose field{key}is a number of at most this.field.{key}.existsboolean—true= the field has a value,false= it has none. Up to 10 field filters, all must match.
Response
objectstring· required — Alwayslist. One of:list.totalinteger· required — Rows that match this request. Without a filter: the number next to the Companies tab.dataobject[]· required — Rows, most recent activity first.id(the saved row that PATCH takes, or null when the company is there only through its leads),name,linkedin_url,domain,industry,country_code,employees,leads(how many of its people are in the Leads table),people(up to five, withnameandtitle),signals,agent_signals(your own signals that caught it, newest first:key,name,first_at,last_at,summary(what you last saw) andsource_url; empty = none) (on the company or one of its people),technologies,funding(round,amount,currency,date, or null),sources,saved_ids(what DELETE takes; empty when the company is there only through its leads),last_seen_at,lifecycle(the Status column: the state of its most advanced lead, orarchived/laterwhen the company itself is archived or snoozed; read-only), the state (status,status_reason,snooze_until,lead_status,next_action(at,kind,note,emailwhen you planned one, without itstextin a list, or null),out_of_office_until,fields,campaign_ids,stage(a stage key, or null) andowner(id,name,email, or null), pluscontact_points),outreach(its people and general address together) anddo_not_contact(the exclusions on its domain or name, each withtype,reasonandmessage; empty = may be contacted).next_offsetinteger | null· required — The offset of the next page, or null.tableobject· required —companies,with_leads,saved_by_assistant,lifecycle(a count per state of the Status column),status(a count per status),outreach(a count per state, or null),due_today,do_not_contactandcapped.dashboard_urlstring· required — The Companies table in mySDR.
Credits
Free. This call never uses credits.
Errors
- 400
invalid_request— An unknownsource,outreach,lifecycle,status,lead_statusordue, acampaignthat is not an id, astagethat is not a key, anownerwho is not in the organization, anagent_signalthe organization does not have, a field filter that is not valid (paramnames it), ado_not_contactthat is not true or false, alimitoutside 1 to 100, or a negativeoffset. - 401
authentication_error— The Authorization header is missing, or the key is unknown or revoked. - 403
permission_error— API access is not part of your plan, or your account is suspended. - 429
rate_limit_error— More than 60 requests per minute, or more than 3 at the same time, on one key. Wait for the Retry-After header. - 503
service_unavailable— The API is temporarily unavailable. Retry later. - 500
internal_error— Something went wrong on our side.
Example
cURL
curl "https://mysdr.app/api/v1/tables/companies?limit=25" \
-H "Authorization: Bearer $MYSDR_API_KEY"
JavaScript
const response = await fetch('https://mysdr.app/api/v1/tables/companies?limit=25', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.MYSDR_API_KEY}`
}
});
const body = await response.json();
Python
import json
import os
import urllib.request
request = urllib.request.Request(
"https://mysdr.app/api/v1/tables/companies?limit=25",
headers={
"Authorization": f"Bearer {os.environ['MYSDR_API_KEY']}"
},
method="GET",
)
with urllib.request.urlopen(request) as response:
body = json.load(response)
Example response
{
"object": "list",
"total": 1,
"data": [
{
"object": "table_company",
"name": "Acme Analytics",
"linkedin_url": "https://www.linkedin.com/company/acme-analytics",
"domain": "acme.io",
"industry": "Software Development",
"country_code": "BE",
"employees": 85,
"leads": 2,
"people": [
{
"name": "Jane Example",
"title": "CFO"
}
],
"signals": [
"Companies that raised funding · BE"
],
"technologies": [],
"funding": {
"round": "Series A",
"amount": 12000000,
"currency": "EUR",
"date": "2026-10-14"
},
"sources": [
"signal",
"assistant"
],
"saved_ids": [
"cmp_01J9Z6P8C8V0K3W6T2N8R5M1XC"
],
"last_seen_at": "2026-10-23T09:30:00.000Z",
"lifecycle": "contacted"
}
],
"next_offset": null,
"table": {
"companies": 1,
"with_leads": 1,
"saved_by_assistant": 1,
"capped": false
},
"dashboard_url": "https://mysdr.app/en/gtm/companies"
}