Connect your AI to Fullday
Ask Claude, Codex or Cursor how your clients are doing, what your cold email is getting back and who to call next, and let it add prospects for you. Or build on the same data with a plain REST API.
What you can do
Ask about your agency
Clients at risk, revenue, the pipeline, cold email results, replies waiting for you, credits left.
Work your pipeline
Add prospects from a conversation, move them through stages, and run lead searches.
Build your own
The same operations over REST, and webhooks to Zapier, Make or your server.
Authentication
Authorization: Bearer fd_live_YOUR_KEY- Keys look like
fd_live_followed by 32 letters and numbers. You see a key once, when you make it. We keep only a hash of it, so we can't show it again either. - A key is read only, or read and write. Write keys can add and move prospects and run lead searches, which spend credits.
- Revoke a key any time in Integrations. It stops working on the next request.
- Keep keys out of code you share and chats. Anyone with a key can use your account.
Quick start
/api/mcp.Claude Code
- Run this in a terminal.
- Open Claude Code and type /mcp to check it says connected.
- Ask something like "How are my clients doing this week?"
claude mcp add --transport http --scope user fullday /api/mcp --header "Authorization: Bearer fd_live_YOUR_KEY"--scope user makes it work in every project. Leave it out to add it to this folder only.
Claude Code saves the key in your user settings file (~/.claude.json).
Tools
Agency keys
Agency overviewget_agency_overviewA snapshot of the agency: how many clients it has (live, setting up, paused, at risk), monthly recurring revenue from clients, the open sales pipeline by stage, and the credit balance.Inputs
A snapshot of the agency: how many clients it has (live, setting up, paused, at risk), monthly recurring revenue from clients, the open sales pipeline by stage, and the credit balance. Start here when asked how the agency is doing.
No inputs.
Over REST: GET /v1/overview
List clientslist_clientsThe agency's clients: name, business type, city, monthly price, health (healthy, watch, at_risk) with a short note, status and bookings in the last 30 days.Inputs
The agency's clients: name, business type, city, monthly price, health (healthy, watch, at_risk) with a short note, status and bookings in the last 30 days. Newest first. Use get_client for one client's details.
status- "setting_up" | "live" | "paused"Only clients in this state.
health- "healthy" | "watch" | "at_risk"Only clients with this health.
limit- whole number 1–100How many to return (1 to 100, default 25).Default 25
Over REST: GET /v1/clients
Get a clientget_clientOne client in detail: price, usage cost, health, which AI services are on, phone number, and when the client has a full account, its plan, bookings and new leads in the last 30 days.Inputs
One client in detail: price, usage cost, health, which AI services are on, phone number, and when the client has a full account, its plan, bookings and new leads in the last 30 days.
client_idrequired- stringThe client's id, from a list tool.
Over REST: GET /v1/clients/{client_id}
List prospectslist_prospectsThe agency's own sales pipeline: businesses it's trying to sign, with contact, stage (new, contacted, demo, proposal, won, lost), the monthly value being discussed, source and next step.Inputs
The agency's own sales pipeline: businesses it's trying to sign, with contact, stage (new, contacted, demo, proposal, won, lost), the monthly value being discussed, source and next step. Newest first.
stage- "new" | "contacted" | "demo" | "proposal" | "won" | "lost"Only prospects at this stage.
limit- whole number 1–100How many to return (1 to 100, default 25).Default 25
Over REST: GET /v1/prospects
Add a prospectadd_prospectNeeds write accessAdd a business to the agency's pipeline.Inputs
Add a business to the agency's pipeline. It shows up in the dashboard's Pipeline right away. Only `business` is required. `value` is the monthly price being discussed, in US dollars. Fires the prospect.created webhook. Needs a key with write access.
businessrequired- stringThe business's name.
contact- stringWho you're talking to.
emailphone- string
type- "dental" | "medspa" | "plastic" | "ortho" | "home" | "legal" | "salon" | "other"What kind of business.
city- stringCity and state, like "Austin, TX".
value- number 0–1000000Monthly price being discussed, USD.
stage- "new" | "contacted" | "demo" | "proposal" | "won" | "lost"Default "new"
source- "Whop ad" | "Cold email" | "Lead finder" | "Referral" | "Outbound" | "Website" | "Event" | "Added by hand"Default "Added by hand"
note- stringA first note on the prospect.
Over REST: POST /v1/prospects
Move a prospectmove_prospectNeeds write accessMove a prospect to another pipeline stage, with an optional note saying why.Inputs
Move a prospect to another pipeline stage, with an optional note saying why. The move is logged on the prospect, as in the dashboard. Needs a key with write access.
prospect_idrequired- stringThe prospect's id, from a list tool.
stagerequired- "new" | "contacted" | "demo" | "proposal" | "won" | "lost"
note- string
Over REST: POST /v1/prospects/{prospect_id}/move
Find leadsfind_leadsNeeds write accessSearch public sources for local businesses of one type in a city and return them with a fit score and the reasons behind it.Inputs
Search public sources for local businesses of one type in a city and return them with a fit score and the reasons behind it. Results come back to you; to keep them as a lead list, open Find leads in the dashboard. Spends credits from the agency's balance (about 10 per 100 businesses; check get_credit_balance first). Needs a key with write access.
typerequired- "dental" | "medspa" | "plastic" | "ortho" | "home" | "legal" | "salon" | "other"What kind of business to look for.
cityrequired- stringCity and state, like "Austin, TX".
radius_miles- whole number 1–50Default 10
limit- whole number 1–500Most leads to save (1 to 500).Default 100
Over REST: POST /v1/leads/search
List found leadslist_leadsBusinesses the lead finder found: name, type, city, website, email (and whether it's verified), fit score 0 to 100 with reasons, an opening line for cold email, and status (new, in_sequence, prospect, skipped).Inputs
Businesses the lead finder found: name, type, city, website, email (and whether it's verified), fit score 0 to 100 with reasons, an opening line for cold email, and status (new, in_sequence, prospect, skipped). Highest score first. Also lists the agency's lead lists (use a list's id as list_id).
list_id- stringOnly leads from this lead list.
status- "new" | "in_sequence" | "prospect" | "skipped"
min_score- whole number 0–100Only leads scoring at least this.
limit- whole number 1–100How many to return (1 to 100, default 25).Default 25
Over REST: GET /v1/leads
List cold email sequenceslist_sequencesThe agency's cold email sequences: name, status, how many steps, who they target, and sent, replied and interested counts.Inputs
The agency's cold email sequences: name, status, how many steps, who they target, and sent, replied and interested counts.
status- "draft" | "active" | "paused" | "done"
Over REST: GET /v1/sequences
Sequence resultsget_sequence_statsResults for one cold email sequence: sent, replied, interested, bounced and unsubscribed, with reply, interested and bounce rates.Inputs
Results for one cold email sequence: sent, replied, interested, bounced and unsubscribed, with reply, interested and bounce rates.
sequence_idrequired- stringThe sequence's id, from a list tool.
Over REST: GET /v1/sequences/{sequence_id}/stats
List replieslist_repliesReplies to the agency's cold emails, newest first, each labelled interested, question, not_now, unsubscribe or out_of_office.Inputs
Replies to the agency's cold emails, newest first, each labelled interested, question, not_now, unsubscribe or out_of_office. Unsubscribes are already suppressed: never email those addresses again.
label- "interested" | "question" | "not_now" | "unsubscribe" | "out_of_office"
unread_only- booleanDefault false
limit- whole number 1–100How many to return (1 to 100, default 25).Default 25
Over REST: GET /v1/replies
List ad campaignslist_campaignsAd campaigns the agency runs to win clients for itself: status, daily budget, and spend, leads and booked calls over the last 7 days.Inputs
Ad campaigns the agency runs to win clients for itself: status, daily budget, and spend, leads and booked calls over the last 7 days.
status- "draft" | "in_review" | "active" | "paused"
Over REST: GET /v1/campaigns
Credit balanceget_credit_balanceHow many credits the agency has left, and its auto-recharge setting.Inputs
How many credits the agency has left, and its auto-recharge setting. Credits pay for lead searches, AI images and videos.
No inputs.
Over REST: GET /v1/credits
Business keys
Todayget_todayToday at the business, in its own time zone: calls the AI answered, bookings made for today, and new leads, with the next few appointments.Inputs
Today at the business, in its own time zone: calls the AI answered, bookings made for today, and new leads, with the next few appointments.
No inputs.
Over REST: GET /v1/today
List leadslist_leadsThe business's leads, newest first: name, how they found the business, stage (new, contacted, booked, showed, won, lost), service and value.Inputs
The business's leads, newest first: name, how they found the business, stage (new, contacted, booked, showed, won, lost), service and value.
stage- "new" | "contacted" | "booked" | "showed" | "won" | "lost"
limit- whole number 1–100How many to return (1 to 100, default 25).Default 25
Over REST: GET /v1/leads
Waiting for approvallist_pending_approvalsChanges the AI team has proposed and is waiting for the owner to approve, such as budget changes or new ads, with the reason for each.Inputs
Changes the AI team has proposed and is waiting for the owner to approve, such as budget changes or new ads, with the reason for each.
limit- whole number 1–50How many to return (1 to 50, default 20).Default 20
Over REST: GET /v1/approvals
Business overviewget_businessThe whole account at a glance: plan and billing status, AI credits, whether the front desk and follow-up are on, phone numbers, the website, connected apps and their status, and any failed renders this week.Inputs
The whole account at a glance: plan and billing status, AI credits, whether the front desk and follow-up are on, phone numbers, the website, connected apps and their status, and any failed renders this week.
No inputs.
Over REST: GET /v1/business
Add a leadadd_leadNeeds write accessAdd a lead to the business's CRM.Inputs
Add a lead to the business's CRM. The follow-up agent starts on it like any new lead.
namerequired- string
phone- stringMobile number, ideally +1 and 10 digits.
emailservice- stringWhat they're interested in, in the business's own words.
source- "Phone call" | "Text" | "Instagram DM" | "Website chat" | "Meta ad" | "Google ad" | "Google search" | "ChatGPT" | "Referral" | "Imported"
note- string
Over REST: POST /v1/leads
Update a leadupdate_leadNeeds write accessMove a lead to a new stage (new, contacted, booked, showed, won, lost) and/or add a note to its timeline.Inputs
Move a lead to a new stage (new, contacted, booked, showed, won, lost) and/or add a note to its timeline.
lead_idrequired- stringThe lead's id, from a list tool.
stage- "new" | "contacted" | "booked" | "showed" | "won" | "lost"
note- string
Over REST: POST /v1/leads/{lead_id}
Approve or reject a changedecide_approvalNeeds write accessApprove or reject a change the AI team proposed (from list_pending_approvals), such as a budget change or launching new ads.Inputs
Approve or reject a change the AI team proposed (from list_pending_approvals), such as a budget change or launching new ads. Confirm with the person first.
action_idrequired- stringThe approval's id, from a list tool.
decisionrequired- "approve" | "reject"
Over REST: POST /v1/approvals/{action_id}
Set how much the ads agent does aloneset_ads_modeNeeds write accesshands_off: the ads agent makes, launches and tunes ads on its own inside the monthly budget.Inputs
hands_off: the ads agent makes, launches and tunes ads on its own inside the monthly budget. small_moves: only budget changes and pauses happen alone. ask_first: everything waits for approval. Optionally set the monthly ad budget in dollars.
moderequired- "hands_off" | "small_moves" | "ask_first"
monthly_budget- whole number 100–100000
Over REST: POST /v1/ads/mode
Change the front deskupdate_front_deskNeeds write accessTurn the AI front desk on or off, change its greeting, or what it does after hours (answer, take a message, or forward).Inputs
Turn the AI front desk on or off, change its greeting, or what it does after hours (answer, take a message, or forward).
on- boolean
greeting- string
after_hours- "answer" | "message" | "forward"
Over REST: POST /v1/front-desk
Change the websiteedit_websiteNeeds write accessAsk for any change to the business's website in plain words (headline, colors, sections, hours, a Meta Pixel or Google tag ID).Inputs
Ask for any change to the business's website in plain words (headline, colors, sections, hours, a Meta Pixel or Google tag ID). Uses about 1 AI credit. The owner publishes from the Website page.
requestrequired- string
Over REST: POST /v1/website/edit
Make new adsmake_adsNeeds write accessMake new ad images in the business's brand from a short brief.Inputs
Make new ad images in the business's brand from a short brief. Strength light (4 ads, 4 credits), medium (8), hard (16) or extra (6 ads, 30 credits). Uses AI credits: confirm with the person first. Saved as drafts.
briefrequired- string
strength- "light" | "medium" | "hard" | "extra"Default "light"
format- "square" | "story"Default "square"
Over REST: POST /v1/ads/make
Check ChatGPT, Perplexity and Googlerun_search_checkNeeds write accessAsk ChatGPT, Perplexity and Google every tracked question now and record where the business is named.Inputs
Ask ChatGPT, Perplexity and Google every tracked question now and record where the business is named. Uses 2 AI credits per question: confirm with the person first.
No inputs.
Over REST: POST /v1/search/check
REST API
/api/v1. GET filters go in the query string; POST bodies are JSON. Answers are JSON objects, and amounts are US dollars per month unless a field says otherwise.Agency keys
- GET
/v1/meWhich key this is and what it belongs to. - GET
/v1/overviewAgency overview - GET
/v1/clientsList clients - GET
/v1/clients/{client_id}Get a client - GET
/v1/prospectsList prospects - POST
/v1/prospectsAdd a prospect - POST
/v1/prospects/{prospect_id}/moveMove a prospect - POST
/v1/leads/searchFind leads - GET
/v1/leadsList found leads - GET
/v1/sequencesList cold email sequences - GET
/v1/sequences/{sequence_id}/statsSequence results - GET
/v1/repliesList replies - GET
/v1/campaignsList ad campaigns - GET
/v1/creditsCredit balance
Business keys
- GET
/v1/todayToday - GET
/v1/leadsList leads - GET
/v1/approvalsWaiting for approval - GET
/v1/businessBusiness overview - POST
/v1/leadsAdd a lead - POST
/v1/leads/{lead_id}Update a lead - POST
/v1/approvals/{action_id}Approve or reject a change - POST
/v1/ads/modeSet how much the ads agent does alone - POST
/v1/front-deskChange the front desk - POST
/v1/website/editChange the website - POST
/v1/ads/makeMake new ads - POST
/v1/search/checkCheck ChatGPT, Perplexity and Google
curl /api/v1/clients?health=at_risk \
-H "Authorization: Bearer $FULLDAY_API_KEY"curl /api/v1/prospects \
-H "Authorization: Bearer $FULLDAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"business": "Lakeway Family Dental", "city": "Lakeway, TX", "type": "dental", "value": 1497}'curl /api/v1/prospects/PROSPECT_ID/move \
-H "Authorization: Bearer $FULLDAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"stage": "proposal", "note": "Sent the proposal after the demo."}'Webhooks
prospect.createdA business lands in your pipeline (from an ad, a reply, or by hand).reply.receivedSomeone replies to one of your sequences.client.createdYou add a client or a prospect signs.payment.succeededA client's invoice is paid.lead_list.createdThe lead finder finishes a search.
Every delivery carries X-Fullday-Signature: t=<unix time>,v1=<signature>. The signature is a hex HMAC-SHA256 of the time, a dot, and the raw body. Refuse deliveries more than 5 minutes old. We don't follow redirects and give up after 10 seconds, and addresses must be public https.
import crypto from "node:crypto";
// rawBody: the request body exactly as received (before JSON.parse)
export function verify(rawBody, header, secret) {
const parts = Object.fromEntries((header ?? "").split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const given = Buffer.from(parts.v1 ?? "");
return given.length === expected.length && crypto.timingSafeEqual(given, Buffer.from(expected));
}Rate limits
- 120 requests a minute per key, MCP and REST together. Over that, you get a 429 with a
Retry-Afterheader in seconds. - 30 tries with a wrong key per minute from one address, then a short wait.
- Lead searches also spend credits, and stop when the balance runs out.
Errors
{ "error": "insufficient_scope", "message": "This key is read-only. Create a key with write access in Integrations to use this tool." }- 400
invalid_inputA field is missing or wrong. The message says which. - 401
unauthorizedNo key, a mistyped key, or a revoked key. - 403
insufficient_scopeThe key is read-only and the call changes data. - 404
not_foundNo such endpoint, or no such record in your account. - 429
rate_limitedToo many requests. Wait for the number of seconds in Retry-After. - 503
not_availableThat part of the API isn't switched on yet.
Over MCP, a problem your AI can fix (a wrong field, a record that isn't yours, a read-only key) comes back as a normal tool result with isError: true and that same sentence, so it can try again. Problems with the request itself are JSON-RPC errors: -32602 unknown tool or bad params, -32601 unknown method, -32020 headers that don't match the body, -32022 a protocol version we don't speak, and -31001 a missing or wrong key (with a 401).
Versions
- The REST API is version 1, at
/api/v1. Within v1 we only add things: new endpoints, new optional inputs, new fields in answers. Anything that would break your code gets a new version, announced ahead of time. - The MCP server speaks the current MCP spec,
2026-07-28(stateless, no handshake), and the earlier handshake versions2025-11-25, 2025-06-18, 2025-03-26, so older clients keep working. It answers with JSON over Streamable HTTP; it doesn't open server-sent event streams. - Tools only gain optional inputs and new output fields within a version of the server. If a tool has to change shape, it gets a new name and the old one keeps working for a while.
Ready to connect?
Make a key and copy the setup for your AI tool. It takes about a minute.