Scheduled messages, calendar, tasks, contact details and the auto-reply log for your AI assistant
A connected AI assistant can manage the messages you scheduled, work on shared calendar events and tasks, fill in a contact's details, see who opted out, and read the log of automatic replies. This page lists every tool, the permission it needs, what the Free plan includes, and what each refusal means in plain words.
New to connecting an assistant? Start with Connect ChatGPT, Claude or another AI assistant to Spun.
At a glance
- Nothing here sends a message by itself. Changing a scheduled message changes what goes out later, under your approval settings. Calendar invitations and cancellation notices go out only after a person approves them.
- The assistant works on shared items only. A private scheduled message, a private event or a task in a private project answers
not_found, as if it did not exist. - Recurring events are changed in Spun. Every calendar change refuses a repeating series.
- Opted-out contacts stay protected. The assistant can see that a contact opted out, but no tool adds or removes the DONOTSEND label, and a preview of a send to an opted-out contact says it would be blocked.
- The auto-reply log is read-only. It shows which rule answered which chat and when, never the message text.
Permissions for these tools
A key only reaches the tools its permissions allow. A tool the key has no permission for is hidden from the assistant. You tick permissions when you create or edit a key in Settings → AI Assistant (MCP) → Manage API keys.
| Permission | Scope | What it lets the assistant do | In an access level |
|---|---|---|---|
| Schedule Sends | schedule_message | Reschedule, cancel and retry scheduled messages | Assistant with sends |
| Read Calendar | read_calendar | Read events and check for conflicts | All three |
| Manage Calendar | manage_calendar | Create and change events, attendees, reminders and status. Asking for invitations to be sent also needs Propose Sends | Assistant, no sends and Assistant with sends |
| Propose Sends | mcp_send_message | Together with Manage Calendar: ask for invitations to be sent, and for attendees to be told about a cancellation | Assistant with sends |
| Read Tasks & Projects | read_tasks | Read tasks, projects and comments | All three |
| Manage Tasks | manage_tasks | Change tasks, checklists, followers and archive state | Assistant, no sends and Assistant with sends |
| Create & Update Contacts | mcp_manage_contacts | Create contacts and fill in their details | Assistant, no sends and Assistant with sends (since 10 November 2026) |
| Read Contacts | read_contacts | Read contacts, including their opt-out state | All three |
| Read Bots & Auto-Reply Rules | read_bots | Read the auto-reply log | Assistant, no sends and Assistant with sends |
Reading the list of scheduled messages needs Read Conversations, which all three access levels include. An app you connected earlier gains nothing by itself. For a key, add the permission to it, or select its access level again. For an app that signed in with your Spun account, an organization manager presses Review and update access under Settings → AI Assistant (MCP) → Connected AI apps. Then let the assistant read the tool list again, as described in What's new for connected AI assistants.
Free plan
On the Free plan, every successful tool call counts toward your 100 Connected AI calls a month. Failed or refused calls do not count.
| Area | Free plan | Starter and up |
|---|---|---|
| Scheduled messages | List them | Also reschedule, cancel and retry |
| Calendar | Reads are coming to the Free plan. Until they reach your account, a Free key gets plan_required | Read, check conflicts and change events |
| Tasks | Reads are coming to the Free plan. Until they reach your account, a Free key gets plan_required | Read and change tasks |
| Contact details and opt-out | Read, create and update, with every new field | The same |
| Auto-reply log | Not included | Read |
When a tool is on a paid plan, the assistant gets the refusal plan_required with a sentence such as "Scheduled sends are on paid plans." or "Changing calendar events from Connected AI is on the Starter plan and up." Nothing changes. Automatic replies do not run on the Free plan, so there is no log to read there.
Scheduled messages
| Tool | What it does | Permission |
|---|---|---|
list_scheduled_messages | Lists the messages waiting to go out, from the inbox and from the assistant | Read Conversations |
reschedule_scheduled_message | Moves a scheduled message to a new time, changes its text, or both | Schedule Sends |
cancel_scheduled_message | Cancels one scheduled message. Cancelling one that is already cancelled is not an error | Schedule Sends |
cancel_scheduled_messages | Cancels up to 100 scheduled messages for one chat or one contact in a call, with a result for each | Schedule Sends |
retry_scheduled_message | Tries a failed inbox message again | Schedule Sends |
What the assistant can reach. Only the messages list_scheduled_messages shows it. A message someone scheduled privately in the inbox is not visible and cannot be changed. There is no pause tool: cancel the message and schedule it again.
New times. A new time must be at least 60 seconds ahead and no more than 90 days out.
Messages the assistant scheduled itself. A request that is a draft, approved, or held for quiet hours can be changed. Changing the time of an approved request keeps the approval. Changing its text sends it back for approval, and the answer says so. A request already waiting for a person to decide cannot be changed: cancel it and schedule again.
Cancelling many at once. Give either a chat or a contact, not both. When more than 20 messages match, nothing is cancelled until the assistant asks again with confirmation. When more than 100 match, the answer says more remain, and the assistant calls again.
Retrying. Only an inbox message that failed can be retried. A request the assistant scheduled is never retried: schedule it again instead.
| Refusal | What it means | What to do |
|---|---|---|
not_found | There is no such scheduled message, or it is private | Check the id with list_scheduled_messages |
invalid_params | No new time or text was given, the time is less than 60 seconds ahead or more than 90 days out, the text is empty, or both a chat and a contact were given for a bulk cancel | Fix the request |
confirm_required | More than 20 messages match the bulk cancel | Check with the person, then ask again with confirmation |
conflict | The message cannot be changed in its current state. The reason comes with it, see the next table | Follow the reason |
plan_required | Changing scheduled messages is on a paid plan | See Pricing |
The reason that comes with conflict:
| Reason | What it means | What to do |
|---|---|---|
not_pending | The message already went out, failed or was cancelled. Its status comes with it. In a bulk cancel, a message in this state gets this code in its own result and the others still go ahead | Nothing to change, or schedule a new one |
managed_by_group_schedule | The message belongs to a group schedule | Change the schedule in the inbox |
not_whatsapp | It is a scheduled email | Change it in the inbox |
pending_approval | The request is waiting for a person to decide | Cancel it and schedule again |
no_retry_unconfirmed | The message may already have been delivered, so it is never retried | Check the chat before sending again |
not_retryable | Only a failed inbox message can be retried. A request the assistant scheduled is never retried | Schedule a new message |
permanent_failure | Retrying would fail the same way. The failure comes with it: the number was rejected, blocked or invalid, the contact has no phone, there is nothing to send to, the line is unknown, the text or status content is empty, or a forward has nothing to forward | Fix the target and schedule a new message |
| (no reason) | The request changed while the assistant was editing it | Read it again and retry |
A failure caused by a passing send error, a line that was not connected, or a trial pause can be retried.
Calendar
| Tool | What it does | Permission |
|---|---|---|
check_calendar_conflicts | Lists the events that overlap a time window, including the occurrences of repeating events. The window can be up to 62 days, and up to 200 events come back | Read Calendar |
add_event_attendees | Adds up to 50 attendees: team members, or contacts by phone number. Sends nothing | Manage Calendar |
remove_event_attendee | Takes one attendee off the event. Sends nothing | Manage Calendar |
set_event_reminders | Replaces the event's reminders, up to 10, each at most 28 days before | Manage Calendar |
send_event_invites | Asks for invitations, or an update to people already invited, to go out on WhatsApp | Manage Calendar and Propose Sends |
cancel_calendar_event | Cancels an event. Nothing is deleted. It can also ask for attendees to be told | Manage Calendar. Telling attendees also needs Propose Sends |
restore_calendar_event | Brings back a cancelled event, or one moved to the trash in the last 30 days | Manage Calendar |
The same permissions cover the tools that were already there: list_calendar_events and get_calendar_event with Read Calendar, create_calendar_event and update_calendar_event with Manage Calendar. When a date range holds more events than the list returns, the answer carries truncated: true and a note to narrow the range or ask for more. Giving update_calendar_event a new start time alone moves the event and keeps its length; a new end time alone changes only the end.
Invitations and cancellation notices need a person. send_event_invites, and cancel_calendar_event when it is asked to tell the attendees, send nothing themselves. They file a request in Spun Tools → Automate → AI Sends, and a person approves or rejects it there. Asking again while the same request is still waiting reuses it. Requests are approved one at a time and cannot be edited before approval; if the event changed after the request was filed, the request no longer applies and a new one is needed. When a cancelled event has nobody to tell, it is cancelled straight away and the answer says so.
Which events. Any shared event, whoever created it. An event the assistant creates is always shared; a private event is made in Spun. Changes are recorded under the key's name and reach Google Calendar the same way as changes made in the app. A repeating series, deleting an event, meeting links and answering an invitation on someone's behalf stay in Spun.
| Refusal | What it means | What to do |
|---|---|---|
not_found | There is no such event, it is private, it left the trash more than 30 days ago, or the attendee is not on the event | Check the id |
recurring_not_supported | The event is part of a repeating series | Change it in Spun |
invalid_params | The request does not fit: more than 50 attendees, someone who is not a member of your team, a hidden number instead of a phone number, a repeated or too many reminders, a window that ends before it starts or is over 62 days, a new event asked for as private, a time zone on an all-day event, an event that would run longer than 14 days, an event that is neither cancelled nor in the trash for a restore, a cancelled event for invitations, or nobody waiting for an invitation (the answer lists who was skipped and why) | Fix the request |
feature_not_ready | Sending invitations through an approval request is not switched on for this workspace yet | A person sends them from the event in Spun |
plan_required | Calendar changes are on the Starter plan and up | See Pricing |
Tasks
| Tool | What it does | Permission |
|---|---|---|
add_checklist_item | Adds an item to a task's checklist, up to 200 items, 500 characters each | Manage Tasks |
archive_task | Archives a task. It is hidden, not deleted | Manage Tasks |
unarchive_task | Brings back an archived task | Manage Tasks |
set_task_followers | Adds and removes followers, up to 50 in a call, from your team | Manage Tasks |
bulk_update_tasks | Changes the status or the person responsible on up to 50 tasks, with a result for each. Tasks that fit are changed even when others are refused | Manage Tasks |
The same permissions cover the tools that were already there: list_tasks, get_task, list_projects and list_task_comments with Read Tasks & Projects, and create_task, update_task, complete_task, create_project, add_task_comment and toggle_checklist_item with Manage Tasks. Task history shows these changes as made by "API key" and the key's name. Deleting a task and inviting a guest to it stay in Spun.
| Refusal | What it means | What to do |
|---|---|---|
not_found | There is no such task, it is in a private project, or there is no active team member with that id | Check the id |
invalid_params | The checklist is full, a follower is not an active member of your team or is both added and removed, there is nothing to add or remove, more than 50 tasks were given, or no status or person was given | Fix the request |
plan_required | Task changes are on the Starter plan and up | See Pricing |
Contact details and opt-out
update_contact fills in more of the contact card:
| Field | What it holds |
|---|---|
company | The company, saved the same way as on the contact card |
birthday | A full date, or a month and day without a year |
address | A postal address |
website | A web address starting with http or https |
tags_add, tags_remove | Tags, up to 50 in a call and 60 characters each |
custom_fields | Your own named details, up to 50 in a call. A name is up to 60 characters and a value up to 500. A contact holds up to 30 of them |
Setting a field to empty (null) clears it, and in custom_fields it removes that detail. Notes stay append-only: the assistant can add a note but never change or remove one. The answer lists the fields that were written.
get_contact and search_contacts return these fields too, plus whether the contact opted out and how (today, by the DONOTSEND label). search_contacts and list_conversations can filter by opted out or not.
Opt-out is protected. No tool adds or removes the DONOTSEND label, and update_labels refuses any system label. create_label refuses the reserved names DONOTSEND, SPUN SUPPORT and GROUP ADMIN. A send preview to an opted-out contact answers that it would not be submitted, with the reason contact_opted_out, and queues nothing.
| Tool | Permission |
|---|---|
update_contact, create_contact | Create & Update Contacts |
get_contact, search_contacts | Read Contacts |
list_conversations | Read Conversations |
preview_send | Propose Sends |
| Refusal | What it means | What to do |
|---|---|---|
invalid_params | A field does not fit: the website is not http or https, a tag or detail is too long, too many were given, the contact would hold more than 30 custom details (the answer says how many it holds), or a label name is reserved | Fix the request, or remove a detail first |
ai_protected_label_immutable | The label is a system label, such as DONOTSEND, that an assistant may not add or remove | A person changes it in Spun |
not_found | There is no such contact | Check the id |
Auto-reply log
| Tool | What it does | Permission |
|---|---|---|
list_auto_reply_log | Lists when an auto-reply rule answered a chat, newest first: the rule, its current name, the chat and the time | Read Bots & Auto-Reply Rules |
The assistant can filter by chat, by rule and by a start time, and read up to 100 entries a call (20 when it does not say). A rule deleted since shows no name. The log never includes the message text, and it only shows chats the key may see: its lines, groups and labels apply.
| Refusal | What it means | What to do |
|---|---|---|
invalid_params | More than 100 entries were asked for, the start time is not a valid date and time, or the rule id is not a number | Fix the request |
invalid_cursor | The page marker belongs to another list or another organization, or is damaged | Start from the first page |
missing_scope | The key does not have Read Bots & Auto-Reply Rules | Add it to the key in Settings |
plan_required | The auto-reply log is on a paid plan | See Pricing |
Refusals that can come from any of these tools
The refusals every tool can give, such as missing_scope, tool_not_enabled, plan_limit_reached, kill_switch_engaged, key_inactive and rate_limited, are listed with what to do in Pipeline, Circles, reminders and the contact timeline.