Skip to content

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

Everything goes through one API key and sees only your own account: an agency key sees that agency, a business key sees that business.

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

Make a key in your dashboard under Integrations, then API keys. Send it on every request as a bearer token. The MCP server and the REST API take the same keys.
Header
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

Pick your AI tool. In your dashboard, Integrations then Connect an AI gives you these same steps with your key already filled in. The server address is /api/mcp.

Claude Code

  1. Run this in a terminal.
  2. Open Claude Code and type /mcp to check it says connected.
  3. Ask something like "How are my clients doing this week?"
Run in a terminal
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

What your AI can do once it's connected. It sees only the tools your key allows: write tools need a key with write access. Every tool answers with structured JSON, and the same JSON as text for tools that don't read structure.

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.
email
email
phone
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.
email
email
service
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

The same operations as plain HTTP and JSON, at /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
Clients that need attention
curl /api/v1/clients?health=at_risk \
  -H "Authorization: Bearer $FULLDAY_API_KEY"
Add a prospect (write 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}'
Move a prospect
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

Add a webhook in Integrations to get a POST when something happens. Zapier's Catch Hook works as is. Your own server can check each delivery's signature with the secret you got when you added it.
  • 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.

Check a signature (Node.js)
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-After header 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

REST errors are JSON with a short code and a sentence you can show a person.
An error
{ "error": "insufficient_scope", "message": "This key is read-only. Create a key with write access in Integrations to use this tool." }
  • 400invalid_inputA field is missing or wrong. The message says which.
  • 401unauthorizedNo key, a mistyped key, or a revoked key.
  • 403insufficient_scopeThe key is read-only and the call changes data.
  • 404not_foundNo such endpoint, or no such record in your account.
  • 429rate_limitedToo many requests. Wait for the number of seconds in Retry-After.
  • 503not_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 versions 2025-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.

Go to Integrations