A map for software, and for the AI
Ask the desk.
Look up a customer, price the job, find a Thursday, send the text. Same commands the office already uses. A key lets your own tools do it too.
The HTTP API is part of the AI plan ($99 a month). Mint a key in the app under Settings → ChalkBot (API keys). Core ($49) cannot mint or use developer keys. Signing into the app is not this API. The website estimator ingest key is a different thing and stays on every plan.
How a call works
Same shop the crew already uses. A key names the business, a scope says how loud it can be, and quiet hours still bind. Nothing here invents a second CRM.
A key for the shop
Mint a key in Settings → ChalkBot (API keys). AI plan ($99) only. It belongs to the business, not to a person signed into a browser. Revoke it and the calls stop.
A scope for the job
read looks. write files the work. send texts a customer. files handles photos. Start tight.
A command you already know
The paths below are the ones the app already runs. Your software hits the same commands the office does.
GET https://app.chalkcrm.com/api/clients/lookup?q=thompson
Authorization: Bearer chk_live_…
Mint that Bearer token in Settings → ChalkBot (API keys). AI plan only.
Four scopes on the key
A Zapier key can read the board without ever sending a text. The loudest scope is send, and even then quiet hours and your channels still apply.
Look up customers, quotes, the schedule, invoices, the inbox and the dashboard. Default on a new key.
Create and edit customers, quotes, jobs, visits, invoices, notes and the price book. Nothing leaves the shop yet.
Text or email a quote, an invoice, a booking, an on-my-way or a reminder. The one that talks to a customer.
Upload and download job photos. Separate so a calendar key does not need the gallery.
The commands
What each call does
Plain paths, same as the app. Merge, refunds, payroll and charging a card on file stay in the office, on purpose. You can archive an invoice, or delete an unpaid one with no payments.
Nothing on the board matches that. Try send, quote, or visit.
Website leads (live now)
Mint it under Settings, Connectors. It files a lead from your own site. It is on every plan, including Core. It is not the $99 developer API, and Core shops keep this one even though they cannot mint developer keys.
/api/ingest/leadSend first_name plus a phone or email, with the key in X-Api-Key.
Customers
Find or create the person before a quote, a lead or a text. The lookup is the one you want from a chat.
/api/clientsOptional ?q= filters the book (name, company, email, phone digits, street). Omit q for the unfiltered list (capped).
/api/clients/lookupQuery q (name, phone fragment, address). Examples: ?q=John ?q=Ball ?q=864. Also still accepts name and phone for the in-app duplicate check. Returns { matches: [...] }.
/api/clients/:idOne customer, with properties and recent work.
/api/clientsAdd a customer.
/api/clients/:idUpdate a name, notes, type or terms.
/api/clients/:id/phonesAdd a phone number.
/api/clients/:id/emailsAdd an email address.
/api/clients/:id/portal-linkHand them their portal without opening the app.
Properties
The job address. Quotes and visits hang off it, not off the person.
/api/propertiesAddresses on file for the shop.
/api/properties/suggestAddress suggestions as you type.
/api/propertiesAdd a property to a customer.
/api/properties/:idFix an address, gate note or geo.
Leads
The funnel from first enquiry to a quote. Move a card, or turn a yes into an estimate.
/api/requestsLeads on the board.
/api/requests/pipelineThe funnel columns, with cards in each.
/api/requests/:idOne lead, with the thread around it.
/api/requestsFile a new enquiry.
/api/requests/:idMove it, rename it, change the stage.
/api/requests/:id/convertTurn a yes into a quote.
Quotes
The whole estimate loop: draft from the price book, send the link, watch them sign, turn it into a job. A measured line is quantity on a price-book measure. Example: 480 sq ft, charge 350, cost you 120, crew pay 100, all cents. Shop must have measurements on. POST and PATCH lines can include measures[] so cost you per sq ft and crew pay per sq ft work.
/api/quotesEstimates in the shop.
/api/quotes/:idOne quote, with lines, extras and line_item_measures.
/api/quotes/:id/materialsWhat the job will take, from the lines.
/api/quotes/:id/pdfThe PDF the customer sees.
/api/quotesDraft with line_items[]. Each line may include product_id and measures[] (product_measure_id, quantity, optional unit_price_cents). Shop must have measurements on. Cost you and crew pay copy from the price book.
/api/quotes/:idSame nested lines, including measures[]. Change extras, deposit or terms.
/api/quotes/:id/sendBody { email: true, sms: true } to send both. Empty body uses the shop default (email) and 400s if the client has no email. { email: false, sms: true } is SMS-only. Office also accepts { channel, to, message }. Uses tpl_quote_sms for the body and tpl_quote_email_subject for the email subject. Needs send.
/api/quotes/:id/linkMint the public link without sending it. Returns { hub_url, app_url }. hub_url is the customer portal. app_url is the office page https://app.chalkcrm.com/quotes/:id.
/api/quotes/:id/approveMark it signed from the office.
/api/quotes/:id/convertTurn an approved quote into a job.
/api/quotes/:id/duplicateCopy last year's deck job as a starting point.
/api/quotes/:id/archiveTake it off the live list.
/api/quotes/:id/unarchivePut it back.
Jobs
Won work. Finish it, then bill it from the same record.
/api/jobsJobs on the books.
/api/jobs/:idOne job, with visits and invoices.
/api/jobsOpen a job without a quote, if you need to.
/api/jobs/:idChange crew, notes or status.
/api/jobs/:id/completeMark the work done.
/api/jobs/:id/invoiceTurn the finished job into an invoice.
/api/jobs/:id/archiveTake it off the live list.
/api/jobs/:id/unarchivePut it back.
/api/jobs/preview-recurrenceSee the next visits before you lock a series.
Schedule
Book, move and confirm visits. This is the core of the desk running itself.
/api/scheduleThe calendar for a range of days.
/api/schedule/my-dayWhat a crew member is running today.
/api/schedule/blackoutsDays the shop is closed. Do not book over them.
/api/schedule/find-timeAsk for the next open slot that fits.
/api/schedule/checkSee if a time collides before you book it.
/api/schedule/visitsPut a visit on the board.
/api/schedule/visits/:idMove it, reassign it, change the window.
/api/schedule/visits/:id/confirmTell the customer they are on the board. Needs send.
/api/schedule/visits/:id/on-my-wayText that the crew is rolling. Needs send.
/api/schedule/visits/:id/completeThe stop is done.
/api/schedule/seriesBook a repeating visit.
/api/schedule/optimizeReorder the day's stops.
Invoices and money
Bill, chase and see what landed. Recording a check is in. You can archive an invoice, or delete an unpaid one with no payments. Paid invoices archive. They do not delete. Charging a saved card, refunds and write-offs stay in the app.
/api/invoicesInvoices in the shop.
/api/invoices/agingWho is late, for chase copy.
/api/invoices/:idOne invoice, with payments.
/api/invoices/:id/pdfThe bill as a PDF.
/api/invoices/:id/receipt.pdfThe receipt after it is paid.
/api/invoicesWrite an invoice by hand.
/api/invoices/:idChange lines or due date while it is still a draft.
/api/invoices/:id/sendSend the pay link. Needs send.
/api/invoices/remindNudge the slow ones. Needs send.
/api/invoices/:id/linkMint the pay link without sending it.
/api/invoices/:id/archiveTake it off the live list. Paid invoices archive. They do not delete.
/api/invoices/:id/unarchivePut it back.
/api/invoices/:idDelete an unpaid invoice with no payments. If money landed, archive it instead.
/api/paymentsMoney that has come in.
/api/payments/in-transitCard payments still on the way to the bank.
/api/paymentsRecord a check or cash the owner was just told about.
/api/payments/cards/:clientIdSee that a card is on file. Charging it is a person in the loop.
Messages
The business number, as an inbox. Replies land here. Sends still respect quiet hours and whether text or email is actually wired.
/api/messagesThreads in the inbox.
/api/messages/threadThe back and forth with one customer.
/api/messages/unreadWhat has not been opened yet.
/api/messages/recipientsWho you can text from here.
/api/messages/sendReply from the business number. Needs send.
/api/messages/readMark a thread read.
/api/connectors/channelsWhether text, email or neither can actually send.
Notes and photos
Gate codes, dog names, call before you come. Before and after shots live on the job. line_items[].description on a quote is the printed line, not an office note. Office notes are GET /api/notes/for-client/:id and POST /api/notes with a message. They are different on purpose.
/api/notes/for-client/:idNotes on a customer.
/api/notesWrite a note on a customer, job or quote. Put the message in body (or message). Quote line descriptions stay on the quote.
/api/notes/:idFix a note.
/api/filesQuery entity_type, entity_id, optional filename. Body is raw bytes, Content-Type: image/jpeg (not JSON). JSON {entity_type, entity_id} is wrong. There is no GET /api/files index (404). List is GET /api/files/list/:type/:id. Fetch one is GET /api/files/:id. Needs files.
/api/files/galleryThe shop gallery, searchable. Needs files.
/api/files/list/:type/:idPhotos on one job or quote.
/api/files/:idFetch one file.
Search and the board
Find Thompson's fence job from a sentence. See what is open today.
/api/searchSearch customers, quotes, jobs and invoices.
/api/dashboard/searchThe same hunt the header bar uses.
/api/dashboardWhat is open: leads, quotes waiting, jobs, money owed.
/api/dashboard/reportsThe numbers, read only.
/api/dashboard/referralsWho sent work, and what those people earned.
/api/usersWho can be assigned. Creating users stays in the app.
/api/notificationsWhat the office bell is holding.
/api/notifications/prefsWhich bells this person wants: leads, approvals, ChalkBot, and the rest of the catalog.
/api/notifications/prefsTurn those types on or off.
ChalkBot
The meter and the minutes. Asking the assistant still happens in the app. Buying extra credits stays in Settings.
/api/assistant/usageCredits used this week, the included 250, and any extra bank.
/api/assistant/time-savedMinutes ChalkBot saved this month, and all time.
Price book and settings
An assistant that quotes without the price book will invent prices. Read the catalog, including measurements, costs you and crew pay. Write hours, templates and follow-ups. Tax, PIN policy and card-fee law stay in the app.
/api/productsThe price book.
/api/products/:idOne item with measurements, costs, crew pay, tiers. 404 if missing.
/api/productsAdd a line the shop actually sells. May include nested measures (measure_type_id, unit_price_cents charge, unit_cost_cents costs you, pay_per_unit_cents crew pay, materials[]) and crew_minimum_cents.
/api/products/:idChange a price or a name. Same nested measures if present. Omit measures to leave them.
/api/products/bulkDuplicate or delete. Delete retires (active=0). Duplicate copies name, price, cost, unit, description, measures and tiers, name suffixed " (copy)".
/api/measures/typesNames of things you count (sq ft, ln ft).
/api/measures/typesAdd a unit you count, like sq ft.
/api/measures/productsEvery measured item's rates.
/api/measures/products/:productIdRates, materials and crew floor for one item.
/api/measures/products/:productIdReplace rates, materials, crew floor.
/api/product-tiers?product_id=Good / better / best prices for one item.
/api/product-tiers/:productIdReplace those tiers.
/api/quote-templatesReuse "deck refresh" instead of rebuilding lines.
/api/job-typesThe kinds of work this shop does.
/api/client-typesResidential, commercial, and the rest of the labels.
/api/pipeline-stagesFunnel columns. Do not make these up.
/api/admin/prefsHours, quiet hours, templates, deposits, follow-ups.
/api/admin/settingsChange hours, templates and visit length. Allowlisted keys only.
When something happens, we tell you
These fire today from Settings, Connectors: a Zapier URL or your own webhook. They are not waiting on developer keys. The names are the ones the funnel actually sends.
lead_createdA new lead arrives, including one from the website form or ingest.
assessment_bookedAn estimate visit is booked.
quote_createdA quote is started.
quote_sentThe quote is sent.
quote_viewedThe customer opens the quote.
changes_requestedThe customer asks for changes.
job_createdThe work is booked in.
What stays in the app
A leaked key should not hire someone, dump the books, or move money with nobody watching. Those doors stay on a signed-in screen.
People and the login
Invites, permissions, PIN resets, trusted devices and closing the account. The API does not hire, lock out, or take over a shop iPad.
Money that needs a person
Charging a card on file, refunds, writing off bad debt, paying the crew. Recording a check is fine. Moving a card is not.
Wiping the books
Merge customers, bulk wipe, and the full export. You can archive an invoice, or delete an unpaid one with no payments. Paid invoices archive. They do not delete.
Wiring the shop
Stripe Connect, the text number, the email domain, and paying Chalk. Plug those in once, in Settings, with your own eyes on it.
FAQ
Can I call this today?
Yes, if you are on the AI plan ($99 a month) and minted a key in Settings, ChalkBot. Core ($49) shops use the browser. The website estimator ingest key is a different thing, and it stays on every plan.
Is this a second API for the AI?
No. The assistant and your own software hit the same commands. Same shop, same rules, same quiet hours. The difference is the key, not a private back door.
What about Core plan shops?
Core ($49) already has the whole toolkit in the browser. It cannot mint or use developer keys. ChalkBot and those keys sit on the AI plan ($99). Website lead forms keep working on Core. There is no Core one-off developer key.
Will a send actually text someone?
Yes, if the shop has a number or email wired, and it is not quiet hours. If neither channel is ready, the call tells you that instead of failing silently.
The board is already live.
Mint a key in Settings → ChalkBot if you are on the AI plan. If you are building against this, say hello.