MCP App Store
by KeenEthics

Overview

Crono is the Sales Execution Layer for B2B revenue teams and AI agents. Its MCP server connects AI assistants to your sales workspace, bringing prospect data, CRM history, buying signals and sales activity into the context of every task. With read and write access, your assistant can help you: • Find and enrich prospects and contacts. • Review deals, identify stalled opportunities and prioritize follow-ups. • Manage multichannel sequences. • Use buying signals to identify relevant outreach opportunities. • Access sales analytics to understand team performance. Ask questions about your pipeline or take action using natural language. For example: “Review deals closing this month, flag those with no recent activity and draft re-engagement messages.” Works with MCP-compatible clients, including Claude, ChatGPT, Cursor and custom AI agents, so your team can work with Crono directly from the tools they already use.

Tools

AddAccountsToList

ChatGPT
Add one or more companies (accounts) to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects account ObjectIds (string, NOT integer Id). First search for the list by name to get its ListId (int), and search for companies to get their ObjectIds (string). Users provide list names and company names, not IDs directly. Example: 'Add Microsoft and Google to my Enterprise Clients list'.

AddAccountsToMultipleLists

ChatGPT
Add one or more companies (accounts) to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), but ObjectIds field expects account ObjectIds (string). First search for the lists by name to get their ListIds (int), and search for companies to get their ObjectIds (string). Users provide list names and company names, not IDs directly. Example: 'Add Apple Inc to both Enterprise Clients and Tech Companies lists'.

AddMultipleProspectsToStrategy

ChatGPT
Enroll multiple prospects into an EXISTING, reusable outreach strategy sequence simultaneously. This endpoint does NOT create a sequence: the strategy must already exist and you must resolve its Id first. If the sequence does not exist yet, or you are specifying the steps and copy yourself, use CreateSingleUseStrategy per contact instead, which creates the sequence and enrolls the contact in a single call. The Prospects field expects a list of entries, each with the prospect's ProspectId (ObjectId, string) and AccountId (ObjectId, string); StrategyId expects the strategy's Id (int, NOT ObjectId). First search for the prospects to get their ObjectIds and search for the strategy to get its Id. Users provide prospect identifiers and strategy names, not IDs directly. The optional StartDate field schedules the sequences to start on a specific day instead of immediately: each first step lands on that date, ignoring its configured delay. Send it ONLY when the user asks for a start date, as a date-only value in 'yyyy-MM-dd' format (today or future, within one year); do not convert it to a UTC timestamp. Example: 'Add all prospects from Microsoft to the Enterprise Follow-up sequence', where that sequence already exists.

AddProspectToStrategy

ChatGPT
Enroll a prospect into an EXISTING, reusable outreach strategy sequence. This endpoint does NOT create a sequence: the strategy must already exist and you must resolve its Id first. If the sequence does not exist yet, or you are specifying the steps and copy yourself, or the content is personalized for this one contact, call CreateSingleUseStrategy instead, which creates the sequence and enrolls the contact in a single call. The prospect MUST be owned by the current user. The ProspectId field expects the prospect's ObjectId (string), and StrategyId field expects the strategy's Id (int, NOT ObjectId). First search for the prospect to get their ObjectId and search for the strategy to get its Id. Users provide prospect names/emails and strategy names, not IDs directly. The optional StartDate field schedules the sequence to start on a specific day instead of immediately: the first step lands on that date, ignoring its configured delay. Send it ONLY when the user asks for a start date, as a date-only value in 'yyyy-MM-dd' format (today or future, within one year); do not convert it to a UTC timestamp. Example: 'Add John Smith from Microsoft to the Cold Outreach for SaaS sequence', where that sequence already exists.

AddProspectsToList

ChatGPT
Add one or more prospects to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects prospect ObjectIds (string, NOT integer Id). First search for the list by name to get its ListId (int), and search for prospects to get their ObjectIds (string). Users provide list names and prospect names, not IDs directly. Example: 'Add John Smith from Microsoft to my Hot Prospects list'.

AddProspectsToMultipleLists

ChatGPT
Add one or more prospects to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), but ObjectIds field expects prospect ObjectIds (string). First search for the lists by name to get their ListIds (int), and search for prospects to get their ObjectIds (string). Users provide list names and prospect names, not IDs directly. Example: 'Add Sarah Johnson to both Hot Prospects and Q4 Pipeline lists'.

AddStageToPipeline

ChatGPT
Add a new stage to an existing sales pipeline. Stages represent steps in the sales process with configurable names and probability percentages (0-100%). Common stages include Qualified Lead, Discovery, Demo/Meeting, Negotiation, Proposal, and Closed Won. The PipelineId field expects an integer Id. First retrieve pipelines to find the correct PipelineId, then add a stage with a name and probability value. Example: 'Add a new stage called Technical Review with 70% probability to the Enterprise Sales pipeline'.

AddStrategiesToList

ChatGPT
Add one or more strategies to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects strategy Ids (int). First search for the list by name to get its ListId (int), and search for strategies to get their Ids (int). Users provide list names and strategy names, not IDs directly. Example: 'Add ABM Starter and Inbound Nurture to my Enterprise Clients list'.

AddStrategiesToMultipleLists

ChatGPT
Add one or more strategies to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), and the Ids field expects strategy Ids (int). First search for the lists by name to get their ListIds (int), and search for strategies to get their Ids (int). Users provide list names and strategy names, not IDs directly. Example: 'Add Q4 Expansion Play to both Strategic Accounts and Q4 Pipeline lists'.

AddStrategyStep

ChatGPT
Add a new step to a strategy using the integer StrategyId. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Returns the created step as StrategyStepGetDto. If the task is type Generic, you MUST fill the subject field. ScheduleTime for automatic step is in format "HH:mm+hh:mm" or "HH:mm-hh:mm", the first part is the time of the day, the second part is the timezone. Example: 'add an email step at the 3rd position

AddStrategyStepTemplate

ChatGPT
Add AB Testing templates to a strategy step. StrategyStepTemplate is an AB Testing template bound to a step. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. It can refer to StrategyStep or to a StrategyStepConditinal and always require a templateId. Returns created StrategyStepTemplate items.Example: 'add an AB Testing template to the 3rd step, use the template Sample Template' TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.

AddTemplatesToList

ChatGPT
Add one or more templates to a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects template Ids (int). First search for the list by name to get its ListId (int), and search for templates to get their Ids (int). Users provide list names and template names, not IDs directly. Example: 'Add Outbound Sequence A and Event Follow-up to my Q4 Pipeline list'.

AddTemplatesToMultipleLists

ChatGPT
Add one or more templates to multiple specified lists simultaneously. The ListIds field expects integer Ids (CronoList doesn't have ObjectId), and the Ids field expects template Ids (int). First search for the lists by name to get their ListIds (int), and search for templates to get their Ids (int). Users provide list names and template names, not IDs directly. Example: 'Add Onboarding Sequence to both Enterprise Clients and Q1 Pipeline lists'.

CreateAgent

ChatGPT
Create a new AI agent for the user. An agent is a job that runs on its own, without anybody watching it. It is made of two layers: the AGENT TYPE, which is the skill and is picked from a fixed catalogue, and the INSTRUCTIONS, which are the job you are writing for this user — what to work on, what to do, when to stop. AgentTypeSlug is REQUIRED and must be one of the slugs returned by SearchAgentTypes — ALWAYS call SearchAgentTypes first and pick the type whose purpose matches the request; never invent a slug. Name and Instructions are required too. ASK FIRST, BUT ONLY WHEN YOU MUST. Ask the user before creating ONLY when you cannot answer both of these from what they said: WHICH records the agent should work on, and WHAT it should do to them. Those two are what make Instructions work at all, and no sensible default exists for either. Ask at most three short questions, in their words, and prefer offering a concrete reading over an open question — 'contacts with no activity in the last 90 days, or also the ones still in a sequence?' beats 'which contacts?'. If a third thing is genuinely unclear — what counts as finished — ask that too. Everything else you do NOT ask: it has a default and you confirm it afterwards. THEN THE TWO-STEP FLOW — FOLLOW IT: create the agent with whatever the user specified, then ask about what they did not. Do NOT interrogate the user about configuration before creating, and do NOT invent values for the fields they left out: create first, then confirm. Anything the user did not mention takes a silent default — SupervisionMode becomes Autonomous (the agent acts WITHOUT asking for approval), InvocationType becomes Manual (it only runs when started by hand), and with no UserIds the agent is assigned to its creator alone — which also decides who its runs act as. The response echoes the values that were actually applied. After creating you MUST (1) show the user the Instructions you wrote, in plain words, so they can correct the job itself and not just its settings, and (2) tell them which defaults were used — the Autonomous one especially, since it means unattended actions — and ask whether they want to change the supervision mode, the assigned users, the schedule or the credit limit. If they do, call PatchAgent with the Id from this response; do NOT create a second agent. The user is redirected to the new agent automatically, so do not also call RedirectTo. HOW A RUN WORKS — Instructions is the whole job description, so write it against these facts: - ONE RUN PER EVENT. A Trigger agent starts a separate run for every matching event, a Scheduled agent one run per scheduled time, a Manual agent one run per start. - RUNS ARE ISOLATED. Two runs of the same agent cannot talk to each other, pass data, see what the other did or split work between them, and a run remembers nothing of the previous ones. Anything that has to survive between runs must be written into Crono — a note, a task, a list, a status, a custom property — and read back from there on the next run. So never write 'remember which companies you already handled'; write 'before acting, check whether the contact already has a note titled X'. - A RUN ACTS AS ONE USER: the assigned user it fired for, or the first assigned user when the event belongs to nobody. It sees and changes only what that user may, and many write actions are refused on records owned by somebody else — enrolling a contact in a sequence above all. A job meant to cover a whole team needs the agent assigned to each of them, which produces one independent run per user, never one run over everybody. - A RUN IS NOT A CHAT. Nobody is on the other side: it cannot ask a question while running, cannot see the screen, and cannot use what the user has selected, filtered or opened in the UI. 'the list I am looking at', 'the selected contacts', 'this company' mean nothing inside a run — name the list, the saved view, the status or the filter explicitly. - A RUN RECEIVES EXACTLY FOUR THINGS: the Instructions, today's date, whether it is supervised, and — for Trigger agents only — the record …

CreateAutomation

ChatGPT
Create a new automation rule (Settings > Automations). Automations run in the background: whenever the trigger fires on a contact, lead or company, Crono performs the action automatically. Use this for requests like 'when a contact replies positively, set their status to Interested', 'when a deal moves to Closed Lost, stop the sequences of that company' or 'when a company starts hiring, create a call task'. PAYLOAD SHAPE — a rule reads as 'IF <trigger> [AND <trigger filter>] THEN <action>', plus up to 5 optional EXCEPT guards. Only the fields belonging to the chosen TriggerType and ActionType are read; everything else is ignored and cleared. Send the trigger block AND the action block that match your TriggerType / ActionType — a rule with a missing block is rejected. ALWAYS REQUIRED: Name (string), TriggerType, ActionType. TableType: the entity the ACTION applies to — Account (company), Prospect (contact) or Lead. Required for the UpdateField action when setting a default status. Shared: only Managers can create subscription-wide (shared) rules; for anyone else it is silently forced to false. 1) TRIGGER CONFIG — send only the block matching TriggerType: - StartNewSequence / MeetingScheduled / EmailBounced / LinkedInInvitationAccepted / SignalRoleChange / SignalCompanyChange / SignalWebsiteVisit / SignalHiring / SignalInterestedOpen / SignalInterestedClick: no extra trigger config at all. - Replied: optional ReplySentiments (Positive, Negative, Neutral) to fire only on those reply sentiments; omit to fire on any reply. NEVER send CallSentiments together with ReplySentiments. - CallConnected: optional CallSentiments (NotInterested, CallBack, SendEmail, MeetingScheduled, NotRightContact); omit to fire on any connected call. - SequenceStopped: SequenceStopReasons is REQUIRED (at least one) — e.g. Reply, MeetingScheduled, OptOut, AccountStatusChange, OpportunityStageChange, ChangeOwner, Finished, User. - AccountStatusChangedTo: send EXACTLY ONE of (a) TriggerAccountStatuses — one or more of Inactive, Nurture, Working, CallScheduled, OpenOpportunity, Customer — or (b) TriggerExternalPropertyId + TriggerFieldValues. Sending both, or neither, is rejected. The trigger property must belong to the Account table and be a List/MultiSelect (the status property is also accepted), and every value in TriggerFieldValues must be one of that property's Options. - ContactFieldChangedTo: same exclusive either/or, for contacts/leads: (a) TriggerProspectStatuses — one or more of New, Qualified, Interested, NotInterested, BadFit, OptedOut — or (b) TriggerExternalPropertyId + TriggerFieldValues on a Prospect/Lead property. - OpportunityStageChangedTo: PipelineExternalName AND StageExternalNames are both REQUIRED, and the stages must be ACTIVE stages of that exact pipeline. Get both with GetPipelines. 2) ACTION CONFIG — send only the block matching ActionType: - UpdateField: Targets is the list of fields the rule writes, at most 5, applied together in a single update. Each entry is either (a) a custom-field target - TargetExternalPropertyId + TargetFieldValues, where a List property accepts EXACTLY ONE value, a MultiSelect accepts one or more, and every value must be one of the property's Options; or (b) a default-status target - TableType plus AccountDefaultStatus (when TableType = Account) or ProspectDefaultStatus (when TableType = Prospect or Lead). The same property cannot appear twice, and only one entry may set the default status. ALWAYS use Targets, and on an update send it complete - it REPLACES the whole list, which is what the full-replace rule above means for this action. Do NOT use the older flat form (TargetExternalPropertyId / TargetFieldValues / AccountDefaultStatus / ProspectDefaultStatus at the top level): it is kept only for clients that predate Targets, and an update sent that way rewrites just the first field of the rule. - StopSequences: StopScope is REQUIRED — ThisContact (stop only the triggering contact) or AllCompanyContacts (stop the active sequences of every contact of their company). - CreateTask: TaskType is REQUIRED (…

CreateList

ChatGPT
Create a new list for organizing prospects, companies, templates, or strategies. Specify the list name, type (prospect/account/template/strategy), and optional description. CronoList uses only Id (int), NOT ObjectId. Optionally populate the list on creation by providing ObjectIds (string array for accounts/prospects) or Ids (int array for templates/strategies) based on the list type. If populating, first search for the entities (prospects, accounts, templates, or strategies) to get their IDs/ObjectIds, then include them in the request. Users provide entity names, not IDs directly. Example: 'Create a new prospect list called Q1 2024 Pipeline and add John Smith and Sarah Johnson to it'. IMPORTANT: From frontendcontext, if the integrationtype is salesforce, you must notice if the user is meaning a Lead type ot a Prospect type

CreateSingleUseStrategy

ChatGPT
Create a single-use (one-off) personalized strategy/sequence on a specific contact. Prefer this endpoint when the user wants to create a unique sequence for a specific contact with personalized content, and doesn't need to reuse the same sequence for other contacts. This creates a strategy that is NOT reusable — it will only be visible in the contact's card and list. The contact is enrolled in this sequence as part of this same call: do NOT follow up with AddProspectToStrategy. Provide the contact's ProspectId (ObjectId, string) and AccountId (ObjectId, string). Plus a list of steps that reflects the quantity the user wants (if provided), using specific days delays, if requested. Each step can reference an existing TemplateId or provide inline Subject + Content to auto-create a single-use template. The strategy Name is optional. ScheduleTime for automatic step is in format "HH:mm+hh:mm" or "HH:mm-hh:mm", the first part is the time of the day, the second part is the timezone. Task subtype is needed only when Linkedin type is used. Example: 'Create a custom 3-step email sequence for John Smith with personalized content'. TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text. PRECONDITIONS: the contact must be owned by the acting user and must not already be in an active sequence, otherwise the call fails with "Contact not owned by user" or "Contact already in an active sequence". Check the prospect's owner first and pick a different contact or reassign it if it is not yours; stop any running sequence with StopProspectSequence before creating a new one. Neither error is retryable — re-sending the same payload fails again.

CreateSingleUseTemplate

ChatGPT
Create a single-use (one-off) template and return its TemplateId. This endpoint only ever creates single-use templates; for a reusable one use GenerateTemplate / the normal template creation flows instead. Use case: when creating an Email or LinkedIn InMail task and you want the content already written as a draft, you can first create a single-use template here (provide subject + body/content and any relevant template metadata), then use the returned Id as TemplateId when creating the task. Important: single-use templates are hidden/one-off and are only accessible by Id (they do not appear in template search or lists). Example: 'Create an email TASK with subject "Quick question about {{Company}}" and a short intro + CTA, then use it for a follow-up email task to John Smith.' TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.

CreateTask

ChatGPT
Create a new task (follow-up activity) for a prospect with details like task type (email, call, LinkedIn message), activity date, associated template, and automation settings. The AccountId and ProspectId fields expect ObjectIds (string, NOT integer Id) because these are CRM-mapped entities. First search for the prospect and account to get their ObjectIds. Returns the created task with its integer Id. If the task is an Email or LinkedIn InMail and you want the message content pre-written (draft-style), you MUST provide TemplateId. If you don't have an existing template to use, you can create a one-off draft template by calling the CreateSingleUseTemplate endpoint with the desired subject + body content (and any other relevant template metadata). The CreateSingleUseTemplate response returns an Id; use that Id as TemplateId when creating the task. Note: SingleUseTemplates are one-off/hidden templates and are only retrievable/usable by Id (they do not appear in template search or lists). FORMATTING: Description is the to-do body and is PLAIN TEXT: no HTML tags and no Markdown. PersonalizedSubject/PersonalizedContent are the Email or InMail message instead, and PersonalizedContent is HTML (<b>, <i>, <br>, <p>, <ul>/<li>), never Markdown. Example: 'Create a follow-up email task for John Smith at Microsoft tomorrow at 10am using the cold outreach template' or 'Add a LinkedIn message task for the CTO at TechCorp next week'. IMPORTANT: ProspectId field MUST be filled if 'Type' field is not 'Generic'. 'Subject' field is MANDATORY to fill: if it's not provided in the request, you MUST generate it based on the context of the task. PRECONDITIONS: ActivityDate must not be in the past — the comparison is date-only against today in UTC, so today itself is accepted. Ownership depends on ProspectId: with one, the contact must be owned by the acting user, unless you set AssignToUser = true, which assigns the task to the contact's owner and only requires the company to be in your subscription; without one, only the company is checked. Failures report "Activity date cannot be in the past" or "contact not owned" and are not retryable unchanged.

DeleteAccount

ChatGPT
Deactivate or archive a single company record. Optionally, also remove it from the CRM if requested. The account remains in the system but is no longer active. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the company by name to get its ObjectId. Users provide company names, not IDs directly. Example: 'Deactivate the company TechWave Solutions and remove it from Salesforce.'

DeleteAgent

ChatGPT
Delete an agent permanently. AgentId expects the integer agent Id (agents have no ObjectId) — call SearchAgents first to resolve it by name. Only the agent's owner may delete it. This cannot be undone and the agent stops running immediately, so ALWAYS confirm the agent's name with the user before calling this when their request is at all ambiguous. If they only want to stop it temporarily, use PatchAgent with Active = false instead and say so. Example: 'Delete my deal follow-up agent'.

DeleteAutomation

ChatGPT
Delete an automation rule. The Id field expects the integer automation Id (NOT an ObjectId) — call SearchAutomations first to find the rule by name. Only the OWNER of a rule may delete it: a shared rule created by another user cannot be removed. Once deleted the rule stops firing and cannot be restored, so confirm the rule name with the user when their request is ambiguous. Example: 'Delete the automation that stops sequences when a deal is lost'.

DeleteFindNewSearch

ChatGPT
Delete a 'Find New' search configuration. The FindNewSearchId field expects an integer Id, NOT ObjectId (FindNewSearch doesn't have ObjectId). First search for the configuration by name to get its Id, then use it to delete. Users provide search names, not IDs directly. Example: 'Delete the Find New search for German CTOs'.

DeleteList

ChatGPT
Delete an existing list. The Id field expects an integer Id (CronoList doesn't have ObjectId). First search for the list by name to get its Id (int). Users provide the list name, not the ID directly. Example: 'Delete the Old Prospects list'.

DeleteMultipleAccounts

ChatGPT
Deactivate or archive several companies at once. Optionally, apply the same change in the CRM. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the companies to get their ObjectIds. Users provide company identifiers, not IDs directly. Example: 'Archive all companies from the old prospecting list and remove them from the CRM.'

DeleteMultipleProspects

ChatGPT
Deactivate or archive multiple prospect records at once. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospects to get their ObjectIds, then deactivate them. Optionally apply the same change in the CRM. Users provide prospect identifiers, not IDs directly. Example: 'Archive all prospects from the old Q3 campaign and remove them from the CRM'.

DeleteOpportunity

ChatGPT
Delete or archive an opportunity record. Optionally, also remove it from the CRM if requested. The opportunity remains in the system but is no longer active. The OpportunityId field expects the ObjectId (string), NOT the integer Id. First search for opportunities to get the correct ObjectId. Users provide opportunity identifiers or company context, not IDs directly. Example: 'Delete the stale opportunity for Widget Corp and remove it from Salesforce.'

DeletePipeline

ChatGPT
Delete or archive a sales pipeline from the system. This will deactivate the pipeline and it will no longer appear in active pipeline lists. The PipelineId field expects an integer Id. First retrieve pipelines to find the correct PipelineId, then delete it. Warning: This operation may affect opportunities associated with this pipeline. Example: 'Delete the old 2023 Sales Pipeline' or 'Remove the unused SMB Pipeline'.

DeleteProspect

ChatGPT
Deactivate or archive a single prospect record. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospect by name/email/company to get the ObjectId. The prospect remains in the system but is no longer active. Optionally remove from CRM if requested. Users provide prospect names/emails, not IDs directly. Example: 'Deactivate the prospect Jane Doe from TechWave Solutions'.

DeleteStrategy

ChatGPT
Delete an email/outreach strategy by its integer Id. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Returns a base response with any potential errors. Example: 'Delete the sequence XYZ'.

DeleteStrategyStep

ChatGPT
Delete a single step from a strategy using the integer StrategyId and the integer StepId. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'Delete the 3rd step from sequence XYZ'. Users will ask to delete the Xth step of the sequence, so you should retrieve the id from the step Once deleted, the StepId is permanently invalid: do not reuse it in PatchStrategyStep. To put a different step in its place, call AddStrategyStep after deleting.

DeleteStrategyStepTemplate

ChatGPT
Delete an A/B Testing template associated to a strategy step using StrategyStepTemplateId (int).First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'Delete the second AB Testing template from the 2st step

DeleteTemplate

ChatGPT
Delete a template permanently. The TemplateId field expects the integer template Id (NOT ObjectId). First search for the template by name/subject to get its integer Id. This will remove the template from the system and it cannot be recovered. Example: 'Delete the old Introduction template' or 'Remove the template named Q3 Campaign Draft'.

EnrichCompany

ChatGPT
Enrich company information for a company NOT yet in Crono. Provide Name and/or Domain and/or LinkedinUrl. Do NOT use this endpoint if the company already exists in Crono — use Enrich/Company/ByAccount instead. Example: 'Enrich company data for TechWave Solutions at techwave.com'.

EnrichCompanyByAccount

ChatGPT
Enrich company information for a company that ALREADY EXISTS in Crono. Pass AccountId — the server fetches name, domain, and LinkedIn automatically from the stored account. Optionally provide Name, Domain, or LinkedinUrl to override the account's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for companies not yet in Crono — use Enrich/Company instead. Example: 'Enrich the company data for account with id abc123'.

FindEmail

ChatGPT
Search for and discover the email address of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or LinkedinUrl. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Email/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned fields forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapeId: set to Id from this response - EmailStatus: set to VerificationStatus from this response Do NOT skip these fields. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindLinkedin and FindPhone on the same person too. Example: 'Find the email for John Smith who works as CTO at TechCorp (techcorp.com)'.

FindEmailByProspect

ChatGPT
Search for and discover the email address of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name, domain, and LinkedIn automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, LinkedinUrl, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Email instead. Example: 'Find the email for the prospect with id abc123'.

FindLinkedin

ChatGPT
Search for and discover the LinkedIn profile URL of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or Email. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Linkedin/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned field forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapeId: set to Id from this response Do NOT skip this field. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindEmail and FindPhone on the same person too. Example: 'Find the LinkedIn profile for Mike Chen, VP of Sales at DataTech'.

FindLinkedinByProspect

ChatGPT
Search for and discover the LinkedIn profile URL of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name and domain automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Linkedin instead. Example: 'Find the LinkedIn profile for the prospect with id abc123'.

FindPhone

ChatGPT
Search for and discover the phone number of a prospect NOT yet in Crono. Provide FirstName, LastName, and at least Domain or LinkedinUrl. Do NOT use this endpoint if the prospect already exists in Crono — use Find/Phone/ByProspect instead. IMPORTANT: After calling this endpoint, always carry the returned field forward — whether you then create a new prospect (POST CoreAI/Prospect) or patch an existing one (POST CoreAI/Prospect/Patch): - ProspectScrapePhoneId: set to Id from this response Do NOT skip this field. FirstName and LastName are a real person's name. NEVER put a job title there: "Sales Director", "Head of Sales" or "CEO" are not names, and a lookup built from one cannot succeed no matter how often you retry it. If you do not have a name yet, find the person first - search the discovery database for contacts at that company, or look them up on the web - and only then call this with what you found. Guessing common names against a domain is not a search. Every attempt costs an enrichment credit whether or not it matches, and the person it returns may work somewhere else entirely: always check that the company and the job title on the result are the ones you were looking for before you use it. Never repeat a call you have already made with the same parameters. If it succeeded, you already have the answer - use it and move on to the next step. If it failed, it will fail the same way: record the person as not found and continue. This applies to FindEmail and FindLinkedin on the same person too. Example: 'Find the phone number for Sarah Johnson at Microsoft'.

FindPhoneByProspect

ChatGPT
Search for and discover the phone number of a prospect that ALREADY EXISTS in Crono. Pass ProspectId — the server fetches name, domain, and LinkedIn automatically from the stored prospect. Optionally provide FirstName, LastName, Domain, LinkedinUrl, or Email to override the prospect's stored values. Use this when you have more accurate or up-to-date data from external sources (e.g., web scraping). Do NOT use this endpoint for prospects not yet in Crono — use Find/Phone instead. Example: 'Find the phone number for the prospect with id abc123'.

GenerateAiVariables

ChatGPT
Generate AI-powered personalized variables for prospects or accounts in bulk using a background job. Provide the list of prospect/account IDs and specify which AI variables to generate (e.g., icebreaker, pain points, value proposition). This queues a background job and returns a job ID for tracking progress. The AI analyzes available data (company info, LinkedIn, etc.) to create personalized content. Example: 'Generate icebreaker variables for prospects in my Q4 enterprise sequence' or 'Create personalized pain point variables for all prospects in TechCorp account'.

GenerateStrategy

ChatGPT
Generate a new email/outreach strategy (sequence) with AI assistance. Specify the strategy name, number of steps, and types of steps to include (Email, LinkedIn, Task, etc.). When users say 'short' use 4 steps, 'medium' use 8 steps, 'long' use 12 steps. This creates a new strategy structure that can be further customized. Example: 'Generate a short cold outreach sequence for SaaS companies' or 'Create a new normal lenght follow-up strategy with email and LinkedIn steps'. For the field StepTypesToUse, NEVER use 'Generic', even when the users says to use all the channels. Ignore that.

GetAccount

ChatGPT
Retrieve ONE specific company (also referred to as account or organization) by its ObjectId (string, NOT the integer Id). Returns the full record including CRM external properties, which is where flags such as competitor or do-not-contact markers live. USE THIS INSTEAD OF SearchAccounts whenever you already know which company you need — most importantly when this execution was triggered on a company, because the trigger payload already gives you the accountId. When you are fetching the CONTACT anyway, skip this call entirely: GetProspect already returns that contact's company with its external properties, so calling both just pays twice for the same data. NEVER call SearchAccounts without filters and then read data from whichever company happens to come back first: that record is not guaranteed to be the one you want, and acting on it produces wrong decisions. Only fall back to SearchAccounts when you must DISCOVER companies from criteria you cannot resolve to an ObjectId (a name, an industry, a filter). To fetch several known companies at once, call SearchAccounts with the ObjectIds filter rather than calling this endpoint repeatedly. Example: 'Qualify this contact' — fetch the contact with GetProspect, then fetch its company with this endpoint using the accountId you already have.

GetAccountScore

ChatGPT
Retrieve the current stored score for a specific account (without recomputing it). Users will reference an account by name/domain (not by id). First search for the account to obtain its AccountId (ObjectId string), then call this endpoint to fetch the saved score. Use Account/Refresh if the user explicitly asks to recompute. Example: 'What is the score for TechCorp?' or 'Show me the account score for Microsoft'.

GetAgent

ChatGPT
Retrieve the full configuration of a single agent by its integer AgentId (agents have no ObjectId) — call SearchAgents first to resolve it by name. Returns everything SearchAgents returns plus the description, the instructions, the full schedule, the trigger rules, the assigned users and the creation date. Use this when the user asks how an agent is configured, or before describing an agent's behaviour, rather than guessing from the search result. Optional flags add run statistics: WithInvocationStats, WithConsumedCredits, IncludeAverageTiming and IncludeFunctionCallCount (the last two are ignored unless WithInvocationStats is true). Example: 'How is my deal follow-up agent set up?' or 'Is my agent supervised?'.

GetExternalProperties

ChatGPT
Retrieve custom fields and properties (external properties) configured in the CRM system. These properties can be filtered by entity type (Prospect, Account, Opportunity), usage type (insert, tag, AI variable, filter), or specific categories like status fields. External properties represent custom fields from connected CRMs (Salesforce, HubSpot, etc.) or custom variables defined for data enrichment and automation. The response includes property metadata such as field name, type (text, number, picklist, etc.), options, editability, and synchronization status. RESOLVING VALUES — IMPORTANT: the externalValues carried by a contact, company or opportunity hold only an externalPropertyId and a raw value; they carry NO name, type, option or label. This endpoint is where that metadata comes from. To read a record's custom fields, call it with ExternalPropertyIds set to the ids you saw on that record — one call resolves as many ids as you pass — and match each raw value against the returned Options entries to get its human-readable Label. Do NOT fetch the whole property list to resolve a handful of ids. FORMATTING — IMPORTANT: when a property has RenderHtml = true, its value is rendered as HTML. Any value you write into that property (for example via PatchProspect, PatchAccount, PatchMultipleProspect or PatchMultipleAccountsWithExternal) must use HTML tags for formatting: <b>, <i>, <br>, <p>, <ul>/<li>. NEVER use Markdown in those values: markers such as bold, headings or - bullets are NOT interpreted and will be shown to the user as literal characters. Properties with RenderHtml = false take plain text. Optional filter parameters: - ExternalPropertyIds: Return exactly these properties, by id. Pass every id you need in a single call. Status fields are returned by id even without WithStatus - NameContains: Case-insensitive substring matched against either the display name or the CRM field name, so 'lifecycle' finds 'Lifecycle Stage'. Use it when the user names a field instead of giving an id - TableType: Filter by entity type (Prospect, Account, Opportunity) - OnlyInsert: Include only properties used during record creation - OnlyTag: Include only properties used as tags - OnlyAiVariables: Include only AI-generated variables - WithLead: Include lead-related properties - WithStatus: Include status fields - IsFilter: Include only properties available for filtering Filters combine with AND. With no filter at all every property of the subscription is returned, which is large — prefer ExternalPropertyIds or NameContains whenever you already know what you are looking for. Example: 'Show me all custom properties for contacts', 'What fields are available for companies in the CRM?' or resolving the custom fields shown on a contact you just fetched.

GetFindNewSearch

ChatGPT
Get detailed information about a specific 'Find New' search configuration. The FindNewSearchId field expects an integer Id, NOT ObjectId (FindNewSearch doesn't have ObjectId). First search for the configuration by name to get its Id, then use it here. Users provide search names, not IDs directly. Example: 'Show me the details of the German CTO search'.

GetMe

ChatGPT
Returns context information about the authenticated user and the workspace (company) they belong to. Resolves the bearer token identity scopes (uid_<userId>, sid_<subscriptionId>) into the corresponding user and subscription, and exposes basic profile data useful to ground the AI in the current user's identity and workspace. Returns: the integer user id, the integer subscription id, the user profile (email, first/last name, full name, roles, CRM integration type), and the company profile (id, name, website, LinkedIn URL, subscription type, CRM integration type, allowed email domains). Call it once at the start of a conversation when the AI needs to address the user by name, sign outgoing messages, mention the company, or tailor responses to the user's role or connected CRM. Does NOT return secrets, settings, or per-feature configuration.

GetPipelines

ChatGPT
Retrieve all sales pipelines in the system. Each pipeline contains stages that represent different steps in the sales process (e.g., Qualified Lead 20%, Demo/Meeting 40%, Negotiation 60%, Closed Won 100%). Returns all active pipelines with their associated stages, including pipeline names, IDs, and stage details. Use this to list available pipelines or find a pipeline ID before performing operations. Example: 'Show me all our sales pipelines' or 'What pipelines do we have?'

GetProspect

ChatGPT
Retrieve ONE specific prospect (individual contact) by its ObjectId (string, NOT the integer Id). Returns the full record: contact details, CRM external properties, sequence enrollment, activity counts and the linked company. WithAccount and WithExternalProperties are both ON by default, and the company that comes back carries its own CRM external properties — the competitor, do-not-contact and lifecycle flags included. Do NOT follow this call with GetAccount for that same company: everything it would return is already here, and it costs several thousand extra tokens because GetAccount spells out the full option vocabulary of every tag property. Call GetAccount only for a DIFFERENT company than the contact's own. USE THIS INSTEAD OF SearchProspects whenever you already know which contact you need — most importantly when this execution was triggered on a contact, because the trigger payload already gives you its objectId. Searching in that situation wastes tokens and risks reading data from the wrong record. Only fall back to SearchProspects when you must DISCOVER contacts from criteria you cannot resolve to an ObjectId (a name, a job title, a filter). To fetch several known contacts at once, call SearchProspects with the ObjectIds filter rather than calling this endpoint repeatedly. Example: 'Qualify this contact' when the execution was triggered on a contact, or any follow-up step that needs the current state of a contact you already identified.

GetProspectScore

ChatGPT
Retrieve the current stored score for a specific prospect (without recomputing it). Users will reference a prospect by name/email (not by id). First search for the prospect to obtain their ProspectId (ObjectId string), then call this endpoint to fetch the saved score. Use Prospect/Refresh if the user explicitly asks to recompute. Example: 'What is John Smith's score?' or 'Show me the score for sarah.johnson@company.com'.

GetStrategy

ChatGPT
Retrieve the full structure of a strategy, including all steps, stepConditionals, stepTemplates and settings. If not explicitly requested to calculate active/stopped etc. counts, use CalculateCounters = false for better performance. Strategy uses only Id (int), NOT ObjectId. This should be used when a change to any step, or conditionals or AB Testing templates are required to retrieve the specific stepId

GetStrategyDetails

ChatGPT
Retrieve contacts enrolled in a strategy with their current status. Returns minimal information for each contact: sequence name, prospect ID, and sequence status. First, use Search endpoint to find the strategy by name and get its Id (int), then use this endpoint to get the enrolled contacts. Strategy uses only Id (int), NOT ObjectId. Use this method preferably for questions like 'get contacts inside strategy XYZ and add them in a list'. Example: 'Show me all contacts in the Cold Outreach sequence' or 'List prospects enrolled in the Enterprise Follow-up strategy'. OWNERSHIP — OnlyMyProspects DEFAULTS TO TRUE here: leave it unset and you get only the contacts owned by the current user, which is what 'my contacts' means. Set OnlyMyProspects = false whenever the question is about the sequence as a whole ('how many contacts are in this sequence', 'everyone enrolled', team-wide reporting) — otherwise you will report the user's own subset as if it were the total. OnlyMySequences is a different filter: it scopes by who owns the enrolment, not by who owns the contact.

GetSummarizeContext

ChatGPT
Retrieve all context needed to generate a comprehensive AI summary for a Contact, Company, or Deal in a single call. Pass the ObjectId (CRM string ID) and the ObjectType (Contact=0, Company=1, Deal=2). For a Contact: returns full contact info, their deals, and recent tasks. For a Company: returns full company info with contacts and all linked deals. For a Deal: returns full deal info, the linked company, the pipeline/stage details, and recent tasks. Use this endpoint instead of making multiple separate calls when the user asks to generate a comprehensive summary on a contact, company, or deal.

GetUserTasksAnalytics

ChatGPT
Retrieve analytics and statistics about the current user's tasks, including counts of pending, completed, and overdue tasks, as well as task distribution by type and time period. This provides a dashboard view of the user's task workload and productivity metrics. Example: 'Show me my task analytics' or 'How many pending tasks do I have?'.

InsertAccount

ChatGPT
Create a new company (also referred to as account or organization) with details such as name, website, LinkedIn, country, industry, employee count, revenue, and owner. Optionally enrich it automatically or create it in the connected CRM. Returns the created account with both Id (int) and ObjectId (string). Always use the ObjectId (string) for subsequent CRUD operations. Example: 'Add a new company called Acme Inc. in the United States, 200 employees, website acme.com, and assign it to Sarah.'

InsertNote

ChatGPT
Create a new note and attach it to a prospect, company, or opportunity. The AccountId, ProspectIds, and OpportunityId fields expect ObjectIds (string, NOT integer Id) because these are CRM-mapped entities. First search for the entities to get their ObjectIds. Users provide entity names, not IDs directly. FORMATTING — IMPORTANT: a note Description is rendered as HTML. Use HTML tags for any formatting: <b> for bold, <i> for italic, <br> for line breaks, <p> for paragraphs, <ul>/<li> for lists. NEVER use Markdown: markers such as bold, headings, - bullets or --- rules are NOT interpreted and will be shown to the user as literal characters. Write the whole body as markup: wrap each paragraph in <p>...</p> rather than opening with a bare sentence, so the note reads the same as one a person writes in the editor. Keep the note concise and readable — it is a CRM note, not a report. Example: 'Add a note to John Smith saying we discussed pricing on the call today' or 'Add a note to Microsoft account about their Q4 budget approval'.

InsertOpportunity

ChatGPT
Create a new sales opportunity/deal for a company with details like name, value, stage, close date, and assigned owner. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the company to get its ObjectId. Returns the created opportunity with both Id and ObjectId identifiers. Example: 'Add a new opportunity for TechWave Solutions worth $50,000, in Discovery stage, expected to close next month, assigned to Sarah.'

InsertProspect

ChatGPT
Create a new prospect (individual contact) with details like name, email, job title, phone, LinkedIn profile, and company. Returns the created prospect with both Id (int) and ObjectId (string). Always use the ObjectId (string) for subsequent CRUD operations. COMPANY — DO NOT CREATE THE COMPANY FIRST. Send the employer details on this request instead: Company (name, required unless you already have AccountId), CompanyLinkedin, CompanyLinkedinNumericId, CompanyWebsite, CompanyIndustry, CompanyCountry, CompanyNumberOfEmployees. This endpoint resolves them itself — it links the prospect to the existing Crono account when one matches on LinkedIn id, website or email domain, and creates the account from those same fields when none does, so passing more of them means a better match and a richer company record. Set AccountId ONLY when you already hold the ObjectId of a specific existing account (the user named it, or a dedup check returned it); when AccountId is set the company fields above are ignored for resolution. Creating a company up front and passing its ObjectId is the slow path and risks duplicates. If you have neither a company name nor any company identifier, ask the user which company to link the contact to before proceeding. IMPORTANT: If a data enrichment was performed before creating this prospect (e.g., via Find/Email, Find/Phone, or Find/Linkedin), you MUST pass the following fields from the scrape response: - ProspectScrapeId: set to Id from the email or LinkedIn scrape result - ProspectScrapePhoneId: set to Id from the phone scrape result - EmailStatus: set to VerificationStatus from the email scrape result This ensures the data source is correctly tracked in Crono. Do NOT skip these fields if a scrape was performed. Example: 'Create a new prospect John Smith, CTO at Microsoft, email john.smith@microsoft.com'. IMPORTANT: If you see, from the frontendcontext, that the integrationType is SalesForce, you have to use createAsLead=true if the user says 'Lead' instead of 'Contact', as in salesforce they are two different types

PatchAccount

ChatGPT
Update an existing company by applying partial changes. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the company to get its ObjectId, then use it for the update. You can modify fields like name, status, website, owner, employee count, or any custom property without replacing the entire record. Users provide company names, not IDs directly. Example: 'Update the company Acme Inc. to set the owner to John and change the industry to Manufacturing.' CUSTOM PROPERTIES: each ExternalValues entry must match that property's declared type — call GetExternalProperties first to read it. A numeric property rejects prose, so a numeric "fit score" field cannot take a written rationale: put the number in the numeric property and the explanation in a note or a text property. STATUS - a workspace either uses the built-in status or replaces it with a custom status property, never both, so only one of these two fields does anything. Read the record with GetAccount first and look at its status: externalPropertyId and value present means a CUSTOM status, which you write through ExternalValues keyed by that numeric id - setting Status does nothing there. defaultStatus present instead means the BUILT-IN status, so set Status and leave ExternalValues alone. Match what the user asked for against the property options before writing, and if it matches none of them say so instead of inventing a value.

PatchAgent

ChatGPT
Update an existing agent by applying partial changes. The Id field expects the integer agent Id (agents have no ObjectId) — use the Id returned by CreateAgent, or call SearchAgents first to find the agent by name. This is a true PATCH: only the fields you send are changed, everything else is left alone. Use it to answer the follow-up question after CreateAgent — for example setting SupervisionMode to Supervised, assigning UserIds, adding a schedule or setting a credit limit. Active = false pauses the agent without deleting it. OMIT Instructions ENTIRELY WHENEVER YOU ARE NOT CHANGING THE JOB — omitting a field leaves it untouched, so a change of supervision, schedule or assignees must not carry the text along. Never re-send it summarised, reformatted or rebuilt from memory. WHEN YOU DO CHANGE IT, IT REPLACES THE WHOLE TEXT — it is not appended to and not merged, because Instructions is one single field with no diff. When the user asks to add, remove or tweak one part of the job, call GetAgent first, take the current Instructions, edit that text and send the complete result. Sending only the new sentence silently deletes everything else the agent knew, with no error. An empty string wipes it for the same reason: to leave it alone, leave it out. Changing Instructions or Description also RE-ELECTS the agent's tools and, when supervised, the action that needs approval. So an edit that drops the sentence naming an action can take that action's tool away even though nothing else changed, and a run that used to work starts failing. After editing the text, re-read it and check every action the agent still has to perform is still named in plain words. When switching InvocationType you must send the fields the new type requires in the same call, since the consistency rules below are validated against the resulting agent. HOW A RUN WORKS — Instructions is the whole job description, so write it against these facts: - ONE RUN PER EVENT. A Trigger agent starts a separate run for every matching event, a Scheduled agent one run per scheduled time, a Manual agent one run per start. - RUNS ARE ISOLATED. Two runs of the same agent cannot talk to each other, pass data, see what the other did or split work between them, and a run remembers nothing of the previous ones. Anything that has to survive between runs must be written into Crono — a note, a task, a list, a status, a custom property — and read back from there on the next run. So never write 'remember which companies you already handled'; write 'before acting, check whether the contact already has a note titled X'. - A RUN ACTS AS ONE USER: the assigned user it fired for, or the first assigned user when the event belongs to nobody. It sees and changes only what that user may, and many write actions are refused on records owned by somebody else — enrolling a contact in a sequence above all. A job meant to cover a whole team needs the agent assigned to each of them, which produces one independent run per user, never one run over everybody. - A RUN IS NOT A CHAT. Nobody is on the other side: it cannot ask a question while running, cannot see the screen, and cannot use what the user has selected, filtered or opened in the UI. 'the list I am looking at', 'the selected contacts', 'this company' mean nothing inside a run — name the list, the saved view, the status or the filter explicitly. - A RUN RECEIVES EXACTLY FOUR THINGS: the Instructions, today's date, whether it is supervised, and — for Trigger agents only — the record that fired it. Nothing else. Scheduled and Manual agents get no record at all, so their Instructions must say how to FIND the records to work on. - Supervised runs pause on their main action and wait for approval; Autonomous runs never pause. WRITING Instructions — this text decides what the agent CAN do, not only what it should: - Instructions (with Description) is analysed on every save to elect which tools the agent may call, and which action needs approval when supervised. Text that never names its actions leaves the agent without the tools for them, and the run fails…

PatchList

ChatGPT
Update an existing list's properties like name, description, or settings. The Id field expects an integer Id (CronoList doesn't have ObjectId). First search for the list by name to get its Id (int), then apply the changes. Users provide the list name, not the ID directly. Example: 'Rename the Q4 Pipeline list to Q1 2024 Pipeline and update its description'.

PatchMultipleAccountsWithExternal

ChatGPT
Update several companies at once by providing a list of changes for each. The AccountId field expects the ObjectId (string), NOT the integer Id. First search for the companies to get their ObjectIds, then use them for batch updates. Supports batch modification of fields like owner, status, or custom properties. Users provide company identifiers, not IDs directly. STATUS - a workspace either uses the built-in status or replaces it with a custom status property, never both, so only one of these two fields does anything. Read the record with SearchAccounts and the ObjectIds filter first and look at its status: externalPropertyId and value present means a CUSTOM status, which you write through ExternalValues keyed by that numeric id - setting Status does nothing there. defaultStatus present instead means the BUILT-IN status, so set Status and leave ExternalValues alone. Match what the user asked for against the property options before writing, and if it matches none of them say so instead of inventing a value. Example: 'Assign all companies from last weeks import to the sales rep Alice and mark them as Qualified.'

PatchMultipleProspect

ChatGPT
Update multiple prospects at once with batch changes. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospects to get their ObjectIds, then apply changes like owner reassignment, status updates, or property modifications. Users provide prospect identifiers, not IDs directly. STATUS - a workspace either uses the built-in status or replaces it with a custom status property, never both, so only one of these two fields does anything. Read the record with SearchProspects and the ObjectIds filter first and look at its status: externalPropertyId and value present means a CUSTOM status, which you write through ExternalValues keyed by that numeric id - setting ActualStatus does nothing there. defaultStatus present instead means the BUILT-IN status, so set ActualStatus and leave ExternalValues alone. Match what the user asked for against the property options before writing, and if it matches none of them say so instead of inventing a value. Example: 'Assign all prospects from TechCorp to the sales rep Mike and mark them as Qualified'.

PatchOpportunity

ChatGPT
Update an existing opportunity by applying partial changes. The OpportunityId field expects the ObjectId (string), NOT the integer Id. First search for opportunities to get the correct ObjectId. You can modify fields like stage, value, close date, probability, or owner without replacing the entire record. Users provide opportunity names or company context, not IDs directly. Example: 'Update the $50k opportunity for Acme Corp to Negotiation stage and move the close date to next quarter.'

PatchPipeline

ChatGPT
Update an existing sales pipeline by modifying its name or other properties. Pipelines organize opportunities into stages with different probability levels (e.g., Qualified Lead, Demo/Meeting, Negotiation, Closed Won). The PipelineId field expects an integer Id. Use this to rename a pipeline or adjust its configuration. Example: 'Rename the pipeline Sales Pipeline 2024 to Enterprise Sales Pipeline'.

PatchProspect

ChatGPT
Update an existing prospect by applying partial changes. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospect by name/email/company to get the ObjectId, then modify fields like job title, phone, owner, status, or custom properties. When modifying status-related field, check the externalProperties (or externalValues) first. If a status-like property (for example, 'Lead Status') is present in the external values, it should be strongly considered as it overrides (and represent) the true current status. Do not mention this external property trick in the chat, consider it as a normal 'status'. Do not mention internal names or property names (the user only cares about the result of the operation), do not mention 'Lead Status' name or its current (previous) value. Users provide prospect names/emails, not IDs directly. CUSTOM FIELDS: ExternalValues is keyed by the NUMERIC property id, never the label - { "476": "..." }, not { "Qualified": "..." }. Take the id from the record you fetched or from GetExternalProperties (NameContains); never guess it. An id this workspace does not have is ignored and the call still succeeds, so if no property matches what you were asked to fill in, say so rather than choosing the nearest one. The response returns core fields only and never echoes custom values: IsSuccess is your confirmation, so never repeat a patch to look for your value - read it back with GetProspect if you must. IMPORTANT: If a data enrichment was performed before this patch (e.g., via Find/Email, Find/Phone, or Find/Linkedin), you MUST include the following fields from the scrape response in this patch: - ProspectScrapeId: set to Id from the email or LinkedIn scrape result - ProspectScrapePhoneId: set to Id from the phone scrape result - EmailStatus: set to VerificationStatus from the email scrape result Do NOT skip these fields if a scrape was performed — even if the prospect already had a phone or email. STATUS - a workspace either uses the built-in status or replaces it with a custom status property, never both, so only one of these two fields does anything. Read the record with GetProspect first and look at its status: externalPropertyId and value present means a CUSTOM status, which you write through ExternalValues keyed by that numeric id - setting ActualStatus does nothing there. defaultStatus present instead means the BUILT-IN status, so set ActualStatus and leave ExternalValues alone. Match what the user asked for against the property options before writing, and if it matches none of them say so instead of inventing a value. Example: 'Update John Smith from Microsoft to change his title to VP of Engineering and assign him to Sarah'.

PatchStrategy

ChatGPT
Patch a strategy by Id. Consider that StrategyTags refers ExternalProperties. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'Update strategy XYZ to name MAD and make it private (it's the opposite of shared)

PatchStrategyStep

ChatGPT
Patch a single step of a strategy using integer StrategyId and a StrategyStepPatch payload. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Provide StepId inside Data along with the fields to update. Users will ask to update the Xth step of the sequence, so you should retrieve the id from the sequenceSteps. ScheduleTime for automatic step is in format "HH:mm+hh:mm" or "HH:mm-hh:mm", the first part is the time of the day, the second part is the timezone. If user wants to change template you should retrieve templateId from Template/Search. Example: 'set the 3rd step of the sequence to automatic and add the template 'Sample Template' UPDATES AN EXISTING STEP ONLY. It cannot create one, and a StepId that has been deleted is gone permanently — patching it fails with "Step not found". To replace a step, call DeleteStrategyStep and then AddStrategyStep; never delete a step and then patch the id you just removed. After any add or delete, re-read the strategy to get the current step ids before patching.

PatchStrategyStepConditional

ChatGPT
Patch the conditional configuration of a strategy step using integer StrategyId and a StrategyStepConditionalPatch payload. First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Provide StrategyId and StrategyStepId and the conditional fields to update.Example: 'Set the conditional of the 3rd step to automatic'

PatchStrategyStepTemplate

ChatGPT
Enable or disable an A/B Testing template variant attached to a strategy step using StrategyStepTemplateId (int). First, search for the strategy by name to get its ID (int). Strategy uses only integer Ids, not ObjectIds. Example: 'disable the second AB Testing template of the 3rd step'. TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.

PatchTask

ChatGPT
Update an existing task by applying partial changes. The Id field expects the integer task Id (NOT ObjectId). First search for the task to get its integer Id. You can modify fields like activity date, completion status, task type, template assignment, automation settings, or delay without replacing the entire record. Description is the to-do body and is PLAIN TEXT: no HTML tags and no Markdown. Example: 'Mark the email task for John Smith as completed' or 'Reschedule the call task to tomorrow at 2pm'.

PatchTaskMultiple

ChatGPT
Update multiple tasks at once with batch changes. The Id field expects the integer task Id (NOT ObjectId). First search for the tasks to get their integer Ids, then apply changes like completion status, activity dates, or automation settings across all selected tasks. Example: 'Mark all pending email tasks for Microsoft prospects as completed' or 'Reschedule all calls from today to next Monday'.

PatchTemplates

ChatGPT
Update an existing template by applying partial changes. The Id field expects the integer template Id (NOT ObjectId). First search for the template by name/subject to get its integer Id. You can modify fields like title, subject, content, language, template step, sharing settings, or attached recordings without replacing the entire record. Example: 'Update the Introduction template to change the subject line to New partnership opportunity' or 'Modify the follow-up template content to be more casual'. TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text.

PersonalizeTemplates

ChatGPT
Personalize the messages of the sequence a contact is ALREADY enrolled in, one entry per step, in a single call. Each entry replaces the message for that step FOR THIS CONTACT ONLY — the sequence's shared templates are untouched, so no other enrolled contact is affected. This is the tool for personalizing an existing sequence; never edit the shared template to do it. Use CreateSingleUseStrategy instead when the contact is NOT in a sequence: that one creates the sequence and enrolls them. HOW TO BUILD THE PAYLOAD: first get the contact's pending tasks for the sequence (SearchTasks with the contact's ProspectId) so you have, per step, its integer task Id and the TemplateId it currently uses. Then send one entry per step you want to change: - TaskTodoId (required): the integer Id of that step's task. - TemplateId (required): the Id of the template that step currently uses, i.e. the one you are personalizing. - Subject and Content: the personalized message. Subject applies to Email and InMail steps only; LinkedIn messages and voice notes display Content alone. Content is HTML — use <b>, <i>, <br>, <p>, <ul>/<li>, never Markdown, which is shown to the user as literal characters. - StrategyStepConditionalId: ONLY when personalizing the conditional branch of a step (the InMail alternative). Leave it out for the step's main message. - OnBehalf: set true when the contact is not owned by the current user. Managers only; it attributes the personalization to the task owner. Steps you leave out keep the sequence's shared template, so send only what you actually rewrote. A task that is already completed cannot be personalized. Calling this again on the same step replaces the personalization and keeps the previous one in history. Example: 'personalize the sequence for John Smith' — get his pending tasks, write a subject and body per step, then send them all in one call. TEMPLATE VARIABLES: use only {{PROSPECT_NAME}}, {{PROSPECT_SURNAME}}, {{PROSPECT_TITLE}}, {{PROSPECT_LOCATION}}, {{PROSPECT_TIMEZONE}}, {{PROSPECT_OWNER}}, {{COMPANY_NAME}}, {{COMPANY_WEBSITE}}, {{COMPANY_SIZE}}, {{COMPANY_INDUSTRY}}, {{COMPANY_COUNTRY}}, {{COMPANY_OWNER}}, {{USER_NAME}}, {{USER_SURNAME}}, {{USER_COMPANY_NAME}}, plus any {{EP_<id>_<name>}} custom property you have actually seen in the data (a contact's or company's external values carry it as templateVariable). Never invent a variable: an unknown one is not substituted and reaches the recipient as literal text. Subject is REQUIRED on every entry, including LinkedIn steps that do not display one — omitting it fails the whole call with "The Subject field is required". Reuse the step's existing subject when you are only changing the body.

RefreshAccountScore

ChatGPT
Recalculate (refresh) the score for a specific account and persist the updated score instance. Users will reference an account by name/domain (not by id). First search for the account to obtain its AccountId (ObjectId string), then call this endpoint to recompute the score and save it. Example: 'Refresh the score for the TechCorp account' or 'Recompute the account score for Microsoft'.

RefreshProspectScore

ChatGPT
Recalculate (refresh) the score for a specific prospect and persist the updated score instance. Users will reference a prospect by name/email (not by id). First search for the prospect to obtain their ProspectId (ObjectId string), then call this endpoint to recompute the score (signals/rules/settings) and save it. Example: 'Refresh the score for John Smith at TechCorp' or 'Recompute the lead score for sarah.johnson@company.com'.

RemoveAccountsFromAllList

ChatGPT
Remove one or more companies (accounts) from all lists where they are currently present. The ObjectIds field expects account ObjectIds (string). First search for companies to get their ObjectIds (string). Users provide company names, not IDs directly. Example: 'Remove Microsoft from all lists'.

RemoveAccountsFromList

ChatGPT
Remove one or more companies (accounts) from a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects account ObjectIds (string). First search for the list by name to get its ListId (int), and search for companies to get their ObjectIds (string). Users provide list names and company names, not IDs directly. Example: 'Remove Microsoft from my Enterprise Clients list'.

RemoveProspectsFromAllList

ChatGPT
Remove one or more prospects from all lists where they are currently present. The ObjectIds field expects prospect ObjectIds (string). First search for prospects to get their ObjectIds (string). Users provide prospect names, not IDs directly. Example: 'Remove John Smith from all lists'.

RemoveProspectsFromList

ChatGPT
Remove one or more prospects from a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), but ObjectIds field expects prospect ObjectIds (string). First search for the list by name to get its ListId (int), and search for prospects to get their ObjectIds (string). Users provide list names and prospect names, not IDs directly. Example: 'Remove John Smith from my Hot Prospects list'.

RemoveStrategiesFromAllLists

ChatGPT
Remove one or more strategies from all lists where they are currently present. The Ids field expects strategy Ids (int). First search for strategies to get their Ids (int). Users provide strategy names, not IDs directly. Example: 'Remove ABM Starter strategy from all lists'.

RemoveStrategiesFromList

ChatGPT
Remove one or more strategies from a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects strategy Ids (int). First search for the list by name to get its ListId (int), and search for strategies to get their Ids (int). Users provide list names and strategy names, not IDs directly. Example: 'Remove ABM Starter from my Enterprise Clients list'.

RemoveTemplatesFromAllLists

ChatGPT
Remove one or more templates from all lists where they are currently present. The Ids field expects template Ids (int). First search for templates to get their Ids (int). Users provide template names, not IDs directly. Example: 'Remove Onboarding Sequence template from all lists'.

RemoveTemplatesFromList

ChatGPT
Remove one or more templates from a specified list. The ListId field expects an integer Id (CronoList doesn't have ObjectId), and the Ids field expects template Ids (int). First search for the list by name to get its ListId (int), and search for templates to get their Ids (int). Users provide list names and template names, not IDs directly. Example: 'Remove Outbound Sequence A from my Q4 Pipeline list'.

RestartSequenceInstance

ChatGPT
Restart a prospect's email sequence from the beginning or a specific step. The ProspectId field expects the prospect's ObjectId (string, NOT integer Id). First search for the prospect to get their ObjectId, then restart their sequence. Users provide prospect names/emails, not IDs directly.\nExample: 'Restart the email sequence for Jane Doe at DataCorp from the beginning'.

ResumeSequenceInstances

ChatGPT
Resume multiple paused email sequences for prospects. The ProspectIds field expects prospect ObjectIds (string, NOT integer Id). First search for the prospects to get their ObjectIds, then resume their paused sequences. Users provide prospect identifiers, not IDs directly.\nExample: 'Resume email sequences for all prospects from the Q3 campaign that were paused'.

ScrapeBulkCompany

ChatGPT
Bulk enrich multiple companies simultaneously with additional data like employee count, revenue, industry details, and contact information. Provide a list of companies with their details (name, domain, location) to enrich. This queues the bulk enrichment job and returns a job ID for tracking. Use this for processing multiple companies efficiently. Example: 'Enrich company data for all accounts in the tech industry segment'.

ScrapeBulkProspect

ChatGPT
Bulk search for emails, phone numbers, or LinkedIn profiles for multiple prospects simultaneously. Provide one entry per prospect with its ProspectId — name, company domain and LinkedIn url are resolved server-side from the stored prospect and its account. Only set FirstName, LastName, Domain or LinkedinUrl to override those stored values with more accurate data (e.g. from web scraping). Specify what to find with FindEmail, FindPhone and FindLinkedin. This queues the bulk scraping job and returns a job ID for tracking: per-prospect outcomes are NOT part of the response, so do not report to the user whether anything was found. Example: 'Find emails for 50 prospects from the enterprise list'.

SearchAccounts

ChatGPT
Search companies (also referred to as accounts or organizations) in Crono by any combination of the filters below. Returns all matching records with both Id (int) and ObjectId (string). Accounts are CRM-mapped entities, so always use the ObjectId (string) for CRUD operations, NOT the Id. This endpoint is for DISCOVERING companies from criteria. If you already know the ObjectId of the company you need, do NOT search: call GetAccount for a single company, or pass the ObjectIds filter below for several. Never call this endpoint with no filters and then use whichever company comes back first — the result order is arbitrary and the record you read may not be the one you meant. Exact-match filters, for resolving companies you already have identifiers for: ObjectIds, LinkedinPublicId, and ExactName (case-insensitive, still no partial match). Website matches partially. LIST FILTERS — these are easy to confuse, read carefully: - ListId: return only companies belonging to ONE specific saved list. Resolve the list by name with SearchLists first to get its integer Id. - InList: true = the company belongs to at least one saved list; false = it belongs to none. It does NOT mean 'the list currently open on the user's screen'. NEVER map phrases like 'this list', 'the current list', 'the actual list' or 'the list I am looking at' onto InList. Apart from the row selection described below, you cannot see the user's screen, and there is NO filter for the currently displayed saved list or view. If the user refers to a list without naming it, either ask which saved list they mean or search without any list filter and state that you searched all companies. SELECTED ROWS: when the user is on the companies table, frontendContext.screenState.listsPage carries what they have selected — activeTab ('Contact', 'Lead' or 'Company'), selectedCount, selectedObjectIds and selectedNames. Phrases like 'the selected companies', 'these companies' or 'the ones I ticked' mean exactly those selectedObjectIds, and they only apply when activeTab is 'Company' — on the other two tabs the selection is contacts, not companies. They are already ObjectIds, so do NOT search by name to resolve them: pass them straight to the endpoint that does the work (PatchMultipleAccountsWithExternal, DeleteMultipleAccounts, …), or to the ObjectIds filter here when you need to read them first. If the user refers to a selection and listsPage is absent or selectedCount is 0, say there is no active selection instead of guessing. The selection is only ever the rows on the page the user is looking at, so never present it as 'all companies matching the filters'. SCORE FILTER: there is NO numeric score filter, and the boundaries between ScoreLevels' three levels are configured per subscription, so you CANNOT convert a numeric request such as 'score > 30' into levels. If the user asks for a numeric threshold, do NOT use ScoreLevels at all: set WithScore = true and Sort = ScoreDesc, then read the numeric score of each returned record and stop paging once it drops below the threshold. Tell the user how you interpreted the request. Never report 'no records found' for a numeric threshold you approximated with levels. Minimal parameter (default: true): when true, only Id, ObjectId, Name, UserId, AccountStatus are returned. STATUS: read accountStatus.label and quote THAT to the user. It is already resolved to what the user sees. Never use defaultStatus or any internal enum name: the displayed labels differ from them (Working is shown as "Prospecting", CallScheduled as "Meeting", Inactive as "Not in target"), and when the subscription defines its own status property defaultStatus is null because the built-in status does not apply at all — externalPropertyId and value then identify that property. Minimal = false returns the whole record plus every linked contact with its sequence enrolments and custom values, which on five companies runs to tens of thousands of characters. Ask for it only when you need those nested details, and lower Limit when you do. For a few extra fields on one company, keep Mini…

SearchAgentInvocations

ChatGPT
List the past executions (runs) of a single agent, newest first. AgentId is REQUIRED and is the integer agent Id — call SearchAgents first to resolve it by name. Use this to report how an agent has been performing or what it did recently. Optional filters: Statuses restricts to runs that are running, completed or pendingUserApproval (values are ORed; empty means all). ChatIds restricts to specific runs. Limit (default 10, max 100) and Offset paginate. FunctionCalls controls how much per-run detail comes back: None (default, just the runs), Last (only each run's final action) or All (every action of every run — verbose, ask for it only when the user wants the details). Example: 'How did my deal follow-up agent do this week?' or 'Is anything waiting for my approval?' (Statuses = [pendingUserApproval]).

SearchAgentTypes

ChatGPT
List the agent types available to the subscription — the catalogue of agents that can be created. Each entry returns Slug, DisplayName, Description and InvocationTypes (which of Manual, Scheduled and Trigger that type supports). ALWAYS call this before CreateAgent: AgentTypeSlug is required there and must be one of the Slug values returned here. Read the Description of each type to pick the one matching what the user wants the agent to do, and check InvocationTypes before proposing a schedule or a trigger, because a type that does not support Scheduled will reject a scheduled agent. NEVER invent or guess a slug. Only types enabled for the subscription are returned, so an empty result means the user cannot create agents yet — tell them rather than attempting a create. Limit (default 10) and Offset paginate. Example: 'What kinds of agents can I create?' or as the first step of 'create an agent that follows up on stale deals'.

SearchAgents

ChatGPT
Search the AI agents the user can see, to find one by name or to list what they have. Agents use only Id (int), NOT ObjectId. Call this before PatchAgent, DeleteAgent, GetAgent or SearchAgentInvocations to resolve the agent's Id. Optional filters: FilterByName (partial match on the agent name), FilterByUserId / UserIds / UserListIds (agents assigned to those users), Limit (default 20) and Offset. Set WithInvocationStats = true to also get how many times each agent ran, how many runs are in flight and how many are waiting for approval. Each result carries Id, Name, AgentTypeSlug, InvocationType, SupervisionMode, assigned UserIds, the credit limit and whether it is Enabled. Example: 'What agents do I have?' or 'Find my deal follow-up agent'.

SearchAutomations

ChatGPT
Search the automation rules (Settings > Automations) visible to the user: their own rules plus the shared rules of their subscription. An automation runs in the background as 'IF <trigger> THEN <action>' on a contact, lead or company. StatusChangeAutomation uses only Id (int), NOT ObjectId. Optional filters: TriggerTypes (e.g. Replied, CallConnected, SequenceStopped, AccountStatusChangedTo, ContactFieldChangedTo, OpportunityStageChangedTo, AccountAddedToList, ContactAddedToList, SignalRoleChange, SignalCompanyChange, SignalWebsiteVisit, SignalHiring, SignalInterestedOpen, SignalInterestedClick, StartNewSequence, MeetingScheduled, EmailBounced, LinkedInInvitationAccepted), ActionTypes (UpdateField, StopSequences, CreateTask), Text (case-insensitive match on the rule name), Limit (default 25) and Offset. Each returned rule carries its full trigger and action configuration, so ALWAYS call this first when you need to update or delete a rule: UpdateAutomation is a full replace and needs the complete current configuration, and DeleteAutomation needs the integer Id. UserId tells you who owns the rule — only the owner may update or delete it — and ConflictingSharedRule flags a rule that overlaps a shared one. Example: 'Which automations do I have?' or 'Show me the rules that stop sequences when a deal stage changes'.

SearchFindNewSearches

ChatGPT
Search for existing 'Find New' search configurations using filters like name, creation date, or search criteria. Use this to find searches before performing other operations. FindNewSearch uses only Id (int), NOT ObjectId. Returns search configurations with their Ids. Example: 'Show me all Find New searches created this month' or 'Find the search for German software companies'.

SearchLists

ChatGPT
Search for existing lists using filters like name, type, creation date, or owner. Use this to find lists before performing other operations like adding prospects/companies. CronoList uses only Id (int), NOT ObjectId. Returns lists with their Ids. Minimal parameter (default: true): when true, only Id, Name are returned. Set Minimal = false to retrieve the full item including type, sharing settings, and shared user details. Example: 'Show me all prospect lists' or 'Find the list called Hot Prospects'.

SearchOpportunitiesByAccountId

ChatGPT
Search opportunities associated with a specific company/account. Returns all deals, sales opportunities, or pipeline items linked to the account with details like stage, value, close date, and owner. Use the account's ObjectId (string), NOT the integer Id. Users typically reference companies by name. Minimal parameter (default: true): when true, only Id, ObjectId, Name, UserId, AccountId are returned. Set Minimal = false to retrieve the full item including stage, amount, linked prospects, CRM properties, notes count, and activity dates. Example: 'Find all open opportunities for Acme Corp that are in negotiation stage.'

SearchOpportunitiesListView

ChatGPT
Search opportunities (also referred to as deals) in list view with pagination. Returns a paginated list of deals/opportunities with filtering options such as stage, close date range, owner, pipeline, and more. Supports filtering by name to find specific deals by their title. Use this to browse or filter the full opportunity list. DEAL OUTCOME: omit isClosed and isWon to get every deal, closed ones included. isClosed false returns only open deals; isClosed true only closed ones. isWon true returns won deals and isWon false lost ones — isWon implies a closed deal, so it never returns open ones and needs no isClosed alongside it. Answer any 'open', 'in progress' or 'still in the pipeline' question with isClosed false instead of fetching everything and dropping the closed deals yourself: the filter is what makes Total the count of matching deals and lets paging reach all of them. CUSTOM FIELDS: ExternalPropertyIds (list of int, optional) chooses which custom-field values come back in each deal's externalValues. Omit it to keep the default (no custom fields unless WithTags or WithExternalValuesNoTags is set). Set it to the ids of only the properties you need, taken from GetExternalProperties, to keep the response small; an empty list returns no custom fields. The status property is always included, so the resolved status is never affected. AGENT MEMORY: ExcludeAlreadyProcessed (default: on when omitted). Leave it unset to skip the deals this agent already worked on in its recent invocations — that default is what stops successive runs of the same agent covering the same ground. Set it to false when the user asks for the whole population again ('go through all my deals again', 'start over'), when they name specific deals or their current selection, and for any count or total question, since the memory shrinks 'total' exactly as it shrinks the page. It has no effect outside an agent invocation, so never tell the user that results were filtered on the strength of this flag alone. A search that passes Name is never filtered by the memory, so looking a deal up by its title always returns it. Example: 'Show me all open deals in Negotiation stage closing this quarter.' or 'Find the opportunity named Acme renewal.'

SearchProspects

ChatGPT
Search for prospects (individual contacts) in Crono by any combination of the filters below. Returns all matching records with both Id (int) and ObjectId (string). Prospects are CRM-mapped entities, so always use the ObjectId (string) for CRUD operations, NOT the Id. This endpoint is for DISCOVERING contacts from criteria. If you already know the ObjectId of the contact you need, do NOT search: call GetProspect for a single contact, or pass the ObjectIds filter below for several. Exact-match filters, for resolving contacts you already have identifiers for: ObjectIds and LinkedinPublicId. Email matches partially. LIST FILTERS — these are easy to confuse, read carefully: - ListId: return only contacts belonging to ONE specific saved list. Resolve the list by name with SearchLists first to get its integer Id. - InList: true = the contact belongs to at least one saved list; false = it belongs to none. It does NOT mean 'the list currently open on the user's screen'. - AccountListId / AccountInList: the same two filters applied to the contact's company instead of the contact. NEVER map phrases like 'this list', 'the current list', 'the actual list' or 'the list I am looking at' onto InList. Apart from the row selection described below, you cannot see the user's screen, and there is NO filter for the currently displayed saved list or view. If the user refers to a list without naming it, either ask which saved list they mean or search without any list filter and state that you searched all contacts. SELECTED ROWS: when the user is on the contacts table, frontendContext.screenState.listsPage carries what they have selected — activeTab ('Contact', 'Lead' or 'Company'), selectedCount, selectedObjectIds and selectedNames. Phrases like 'the selected contacts', 'these contacts' or 'the ones I ticked' mean exactly those selectedObjectIds, and they only apply when activeTab is 'Contact' or 'Lead' — on 'Company' the selection is companies, not contacts. They are already ObjectIds, so do NOT search by name to resolve them: pass them straight to the endpoint that does the work (PatchMultipleProspect, DeleteMultipleProspects, …), or to the ObjectIds filter here when you need to read them first. If the user refers to a selection and listsPage is absent or selectedCount is 0, say there is no active selection instead of guessing. The selection is only ever the rows on the page the user is looking at, so never present it as 'all contacts matching the filters'. SCORE FILTER: there is NO numeric score filter, and the boundaries between ScoreLevels' three levels are configured per subscription, so you CANNOT convert a numeric request such as 'score > 30' into levels. If the user asks for a numeric threshold, do NOT use ScoreLevels at all: set WithScore = true and Sort = ScoreDesc, then read the numeric score of each returned record and stop paging once it drops below the threshold. Tell the user how you interpreted the request. Never report 'no records found' for a numeric threshold you approximated with levels. Minimal parameter (default: true): when true, only Id, ObjectId, Name, Email, UserId, AccountId, Title, ProspectStatus are returned. STATUS: read prospectStatus.label and quote THAT to the user. It is already resolved to what the user sees. Never use defaultStatus or any internal enum name (New, NotInterested, BadFit): the displayed labels differ from them, and when the subscription defines its own status property defaultStatus is null because the built-in status does not apply at all — externalPropertyId and value then identify that property. Minimal = false returns contact details, CRM properties, sequence enrolment, activity counts and scores for every contact on the page. Ask for it only when you need those for all of them, and lower Limit when you do. For one contact, keep Minimal = true and read it with GetProspect. CUSTOM FIELDS: ExternalPropertyIds chooses which custom-field values come back in each contact's externalValues. Omit it to keep the default (every custom field). Set it to the ids of only the properties you need, taken f…

SearchSignals

ChatGPT
The buying signals Crono raised for the CURRENT user - events saying a contact or company is worth reaching out to now. Only this user's own signals: there is no owner filter, so it cannot answer what a colleague has. Types (omit for all): RoleChange and CompanyChange (a known contact changed role or employer, details on the suggestion), WebsiteVisit (a company already in Crono visited the site), InterestedOpen and InterestedClick (a contact opened or clicked our email), Hiring (a matching job post), UnknownCompanyVisit. UnknownCompanyVisit has accountId and prospectId null BY DESIGN - the company is not in Crono. Read the websiteVisit block instead (name, domain, LinkedIn id, industry, size, country, pages viewed) and treat it as a new account to create, not as a missing record. Empty company fields there mean the visitor was never identified and there is nothing to act on. Handled: false for what is still to work on, true for what is done, omit for both. Nothing here marks a signal as handled, so never say you closed one. WEBSITE-VISIT FILTERS - these narrow the WebsiteVisit and UnknownCompanyVisit signals by the company behind the visit, and leave every other type untouched, so combine them with Types when you want visits alone. websiteVisitFrom/To bound the VISIT's own time, not the signal's, which is written once Crono has finished processing the session. websiteVisitWholeSubscription widens the feed from this user's visits to every visit the workspace received, deduplicated to one row per visit. ONLY IF you filter by industry or country: those two do NOT list their allowed values here - several hundred each - so call FindNew's Filters/Resolve first with your own synonyms (Industry and/or Country in one call) and pass the returned Value strings verbatim into websiteVisitCompanyIndustries and websiteVisitCompanyCountryCodes. Never invent one: a value you did not get from there is rejected and the whole call fails. Skip that step entirely when the search does not use those two filters - websiteVisitCompanySizes carries its own values and needs no resolving. A visit recorded before Crono started storing these attributes carries none of them, so it matches no industry, size or country filter whatever its displayed label says. Narrowing a search this way can therefore hide older visits, and a company you know visited may be missing for that reason rather than because it did not. Newest first. Read 'total' to answer 'how many', never the number of rows returned.

SearchStrategies

ChatGPT
Search for email/outreach strategies (sequences) using filters like name, type, owner, or status. Use this to find strategies before adding prospects or performing other operations. Strategy uses only Id (int), NOT ObjectId. Returns strategies with their Ids. Minimal parameter (default: true): when true, only Id, Name, Archived are returned. Set Minimal = false to retrieve the full item including all steps, settings, analytics counters, tags, and automation details. Example: 'Show me all active email sequences' or 'Find the strategy called Cold Outreach for SaaS'.

SearchTasks

ChatGPT
Search for tasks (follow-up activities, to-dos, scheduled actions) using filters such as date, prospect, account, opportunity, task type (email, call, LinkedIn, etc.), completion status, or automation settings. Tasks use only Id (int), NOT ObjectId. Returns tasks with their integer Ids. ProspectId, AccountId, and OpportunityId in filters expect ObjectIds (string) because these are CRM entities. Minimal parameter (default: true): when true, only ObjectId, UserId, Subject, Type, Subtype, ActivityDate, AccountId, ProspectId, OpportunityId are returned. Set Minimal = false to retrieve the full item including email/call/LinkedIn logs, linked entity details, and description. AGENT MEMORY: ExcludeAlreadyProcessed (default: on when omitted). Leave it unset to skip the tasks this agent already worked on in its recent invocations — that default is what stops successive runs of the same agent covering the same ground. Set it to false when the user asks for the whole population again ('go through all my tasks again', 'start over'), when they name specific tasks or their current selection, and for any count or total question, since the memory shrinks 'total' exactly as it shrinks the page. It has no effect outside an agent invocation, so never tell the user that results were filtered on the strength of this flag alone. A search scoped to one record with ProspectId, AccountId or OpportunityId is never filtered by the memory, so the tasks of a contact, company or deal you ask about always come back. Example: 'Show me all pending email tasks for prospects at Microsoft' or 'Find completed calls from last week'.

SearchTemplates

ChatGPT
Search for email and message templates using filters like name, type, subject, language, or owner. Use this to find templates for email sequences, follow-ups, or other communications. Template uses only Id (int), NOT ObjectId. Returns templates with their Ids.\n\nMinimal parameter (default: true): when true, only Id, Title, Type, Language, UserId, Step are returned. Set Minimal = false to retrieve the full item including the template body content, subject, analytics, tags, and personalization settings.\n\nExample: 'Show me all cold email templates' or 'Find templates with subject containing follow up'.

SearchTimeline

ChatGPT
Retrieve the activity timeline of a contact, a company or a deal: logged emails, calls, LinkedIn messages, InMails, meetings, notes and the open tasks still to be done. Use it to answer 'what happened with X', 'when did we last talk to X', 'what is scheduled next for X' or to summarise a relationship before writing an email. ENTITY FILTER — REQUIRED: exactly one of AccountId (company ObjectId, string), ProspectId (contact ObjectId, string) or OpportunityId (deal ObjectId, string) must be provided; the call is rejected without one. These are ObjectIds (string), NOT integer Ids — resolve them first with SearchProspects, SearchAccounts or SearchOpportunities. Note that ProspectId returns the contact's activities across every company they belonged to, while AccountId is applied only when no ProspectId or OpportunityId is given. SECTIONS — AT LEAST ONE REQUIRED: the timeline is split in two independently paginated halves and the call is rejected when both are omitted. Pass Past ({ Limit, Offset }) for what already happened, newest first — this is the one to use for history questions. Pass Future ({ Limit, Offset }) for what is scheduled plus every still-open task, oldest first. Ask for only the half you need. Each returned section carries its own Data, Total, Limit, Offset and Next, so page a section by resending its Offset. OPTIONAL FILTERS: Types restricts the item kinds (Email, Call, Linkedin, InMail, Generic, Meeting, Note, LinkedinInvitation, LinkedinVoiceNote, LinkedinProfileView, LinkedinLikeLastPost for logged activity; TaskTodoEmail, TaskTodoCall, TaskTodoInMail, TaskTodoGeneric, TaskTodoLinkedinInvitation, TaskTodoLinkedinMessage, TaskTodoLinkedinVoiceNote, TaskTodoLinkedinProfileView, TaskTodoLinkedinLikeLastPost for open tasks) — omit it for every kind. ReplyTypes adds the incoming replies of a channel on top of Types and accepts only Email and Linkedin; to get replies ALONE, pass ReplyTypes with an EMPTY Types array. Since and To bound the item date (inclusive). UserId, UserIds or UserListIds filter by owner, and ProspectIds narrows to several contacts. Minimal parameter (default: true): when true each item is a flat summary — ItemDate, Type, Subject, UserId, AccountId, ProspectId, OpportunityId, IsReply and SequenceName. Set Minimal = false ONLY when you genuinely need the full payload (email and LinkedIn bodies, call outcomes, full task and meeting records): it is very large, so prefer the summary and read a single record with another endpoint when you need its content. IsReply on an item tells you the direction: true means the contact answered, false or null means it went out from Crono. Use it to tell 'we contacted them' apart from 'they replied'. Example: 'What happened with John Smith in the last month?' → resolve his ProspectId, then send Past = { Limit: 25, Offset: 0 } with Since set to a month ago.

SearchUsers

ChatGPT
Search for Crono users in the current subscription/workspace. Returns a list of users with their Id (integer) and info. Use this endpoint when you need to find users for ownership assignment or reassignment. The returned user Id (integer) should be used in the UserId field when creating or updating entities like Prospects, Accounts or Opportunities — Crono derives the matching CRM owner from it.

StopProspectSequence

ChatGPT
Stop/pause a prospect's currently running email sequence (strategy). The ProspectId field expects the prospect's ObjectId (string, NOT integer Id). First search for the prospect to get their ObjectId, then stop their active sequence. Users provide prospect names/emails, not IDs directly.\nExample: 'Stop the email sequence for John Smith at TechCorp' or 'Pause the outreach sequence for sarah.johnson@microsoft.com'.

UpdateAutomation

ChatGPT
Update an existing automation rule. The Id field expects the integer automation Id (NOT an ObjectId) — call SearchAutomations first to find the rule by name. IMPORTANT — THIS IS A FULL REPLACE, NOT A PATCH: the whole trigger and action configuration is cleared and rebuilt from this payload, so you MUST resend every field you want to keep, not only the ones that change. Take the rule returned by SearchAutomations, apply the user's edit on top of its current configuration and send the complete result. Sending a partial payload silently wipes the missing configuration. Only the OWNER of a rule may update it: a shared rule created by another user is read-only and returns an error. PAYLOAD SHAPE — a rule reads as 'IF <trigger> [AND <trigger filter>] THEN <action>', plus up to 5 optional EXCEPT guards. Only the fields belonging to the chosen TriggerType and ActionType are read; everything else is ignored and cleared. Send the trigger block AND the action block that match your TriggerType / ActionType — a rule with a missing block is rejected. ALWAYS REQUIRED: Name (string), TriggerType, ActionType. TableType: the entity the ACTION applies to — Account (company), Prospect (contact) or Lead. Required for the UpdateField action when setting a default status. Shared: only Managers can create subscription-wide (shared) rules; for anyone else it is silently forced to false. 1) TRIGGER CONFIG — send only the block matching TriggerType: - StartNewSequence / MeetingScheduled / EmailBounced / LinkedInInvitationAccepted / SignalRoleChange / SignalCompanyChange / SignalWebsiteVisit / SignalHiring / SignalInterestedOpen / SignalInterestedClick: no extra trigger config at all. - Replied: optional ReplySentiments (Positive, Negative, Neutral) to fire only on those reply sentiments; omit to fire on any reply. NEVER send CallSentiments together with ReplySentiments. - CallConnected: optional CallSentiments (NotInterested, CallBack, SendEmail, MeetingScheduled, NotRightContact); omit to fire on any connected call. - SequenceStopped: SequenceStopReasons is REQUIRED (at least one) — e.g. Reply, MeetingScheduled, OptOut, AccountStatusChange, OpportunityStageChange, ChangeOwner, Finished, User. - AccountStatusChangedTo: send EXACTLY ONE of (a) TriggerAccountStatuses — one or more of Inactive, Nurture, Working, CallScheduled, OpenOpportunity, Customer — or (b) TriggerExternalPropertyId + TriggerFieldValues. Sending both, or neither, is rejected. The trigger property must belong to the Account table and be a List/MultiSelect (the status property is also accepted), and every value in TriggerFieldValues must be one of that property's Options. - ContactFieldChangedTo: same exclusive either/or, for contacts/leads: (a) TriggerProspectStatuses — one or more of New, Qualified, Interested, NotInterested, BadFit, OptedOut — or (b) TriggerExternalPropertyId + TriggerFieldValues on a Prospect/Lead property. - OpportunityStageChangedTo: PipelineExternalName AND StageExternalNames are both REQUIRED, and the stages must be ACTIVE stages of that exact pipeline. Get both with GetPipelines. 2) ACTION CONFIG — send only the block matching ActionType: - UpdateField: Targets is the list of fields the rule writes, at most 5, applied together in a single update. Each entry is either (a) a custom-field target - TargetExternalPropertyId + TargetFieldValues, where a List property accepts EXACTLY ONE value, a MultiSelect accepts one or more, and every value must be one of the property's Options; or (b) a default-status target - TableType plus AccountDefaultStatus (when TableType = Account) or ProspectDefaultStatus (when TableType = Prospect or Lead). The same property cannot appear twice, and only one entry may set the default status. ALWAYS use Targets, and on an update send it complete - it REPLACES the whole list, which is what the full-replace rule above means for this action. Do NOT use the older flat form (TargetExternalPropertyId / TargetFieldValues / AccountDefaultStatus / ProspectDefaultStatus at the top level): it is kept only for clients that predate Targets, and a…

UpdateProspectAccount

ChatGPT
Move a prospect (individual contact) from one company to another. The ProspectId field expects the ObjectId (string), NOT the integer Id. First search for the prospect by name/email/company to get its ObjectId. Then set the target company: pass AccountId (the company's ObjectId, string) when the company already exists in Crono — search the company by name to get it — or pass AccountInsert with the new company's details when it does not exist yet. If the user does not specify which company to move the contact to, you MUST ask before proceeding. By default the contact's active sequences are stopped because the account changed; set StopStrategy = false to keep them running. Example: 'Move John Smith to Acme Corp' or 'Reassign the contact Jane Doe to a new company called TechWave'.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

109

Tools

3

Prompts

ChatGPT

Platforms

Category

CRM Records

Works with

ChatGPT

Data refreshed daily