Connectors · MSP & PSA
HaloPSA MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to HaloPSA and the rest of your systems. It gives your agent 465 HaloPSA actions (205 reads, 180 writes and 80 that wait for a confirmation) and holds the HaloPSA credential itself, so the agent never does. It paces HaloPSA's limits and records every call.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "halopsa.tickets.list", intent: "check which HaloPSA account is connected"}# List HaloPSA tickets · read · 1 upstream call- 465actionsin one signed file
- 205readlook, never change
- 180writecreate and update
- 80wait for a yesdestructive, confirmed first
Set up
Connect HaloPSA in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect HaloPSA.
OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in. actionlake stores what you paste write-only, sealed under your tenant's key.
client_idHaloPSA client idclient_secretHaloPSA client secrettenant_hostWhere your HaloPSA lives: your tenant host
account { op: "connections.requirements", service: "halopsa" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "halopsa.tickets.list" }# list halopsa tickets · read · 1 upstream callcheck { action: "halopsa.tickets.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
HaloPSA at a glance
- Sign-in
- OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in.
- You provide
client_idclient_secret- Setup fields
tenant_host- Limits we pace to
- 700 calls per 5 minutes, per connection
- API covered
- HaloPSA API 1, at your HaloPSA instance's API base URL, which you enter when connecting (path /api)
- Built from
- HaloPSA's documentation, read 8 September 2026haloacademy.halopsa.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 205 of 205 reads, for up to an hour; a write clears what it affects
- Ready-made plans
- 11 in the store
- Shared entities
- 22, so ask can line HaloPSA up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in HaloPSA.
465 actions in 20 areas. Every one carries its effect, so a key can allow the reads and hold the rest.
- 205readlook, never change
- 180writecreate and update
- 80destructivewait for a confirmation
CRM
5726 read · 22 write · 9 destructive
List HaloPSA agents · List HaloPSA end users · List HaloPSA clients · List HaloPSA sites
Lookups
5120 read · 21 write · 10 destructive
List HaloPSA SLAs · Create a HaloPSA SLA · Get one HaloPSA SLA · Update a HaloPSA SLA
Config
4116 read · 16 write · 9 destructive
List HaloPSA roles · Create a HaloPSA role · Get one HaloPSA role · Update a HaloPSA role
Billing
4017 read · 16 write · 7 destructive
List HaloPSA invoices · List HaloPSA invoice payments · Create a HaloPSA invoice · Create a HaloPSA invoice payment
Servicedesk
3514 read · 16 write · 5 destructive
List HaloPSA tickets · List HaloPSA ticket actions · Create a HaloPSA ticket · Create a HaloPSA ticket action
Automation
2710 read · 11 write · 6 destructive
List HaloPSA workflows · Create a HaloPSA workflow · Create a HaloPSA webhook · List HaloPSA webhooks
Contracts
2512 read · 9 write · 4 destructive
List HaloPSA client contracts · Create a HaloPSA client contract · Get one HaloPSA client contract · Update a HaloPSA client contract
Sales
2312 read · 8 write · 3 destructive
List HaloPSA quotations · List HaloPSA opportunities · Create a HaloPSA quotation · Get one HaloPSA quotation
12 more areas · 166 actions
- Catalogue 22
- Documents 19
- Procurement 19
- Servicecatalogue 19
- Assets 18
- Knowledge 17
- Scheduling 13
- Time 12
- Reporting 9
- Projects 7
- Email 6
- Compliance 5
Top actions
The HaloPSA API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 398 of HaloPSA's 410 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
halopsa.tickets.listList HaloPSA tickets | List tickets from HaloPSA, filtered by advanced_search, agent_id, asset_id, client_id. | read | service.ticket.list56 connectors |
halopsa.agents.listList HaloPSA agents | List agents from HaloPSA, filtered by activeinactive, client_id, domain, includedisabled. | read | identity.user.list474 connectors |
halopsa.invoices.listList HaloPSA invoices | List invoices from HaloPSA, filtered by advanced_search, asset_id, client_id, contract_id. | read | finance.invoice.list101 connectors |
halopsa.client_contracts.listList HaloPSA client contracts | List client contracts from HaloPSA, filtered by client_id, count, includeinactive, order. | read | service.contract.list23 connectors |
halopsa.actions.listList HaloPSA ticket actions | List ticket actions from HaloPSA, filtered by agentonly, conversationonly, count, end_date. | read | service.ticket_note.list20 connectors |
halopsa.invoice_payments.listList HaloPSA invoice payments | List invoice payments from HaloPSA, filtered by client_id, count, invoice_id, order. | read | finance.payment.list75 connectors |
halopsa.quotations.listList HaloPSA quotations | List quotations from HaloPSA, filtered by client_id, count, order, orderdesc. | read | finance.quote.list52 connectors |
halopsa.slas.listList HaloPSA SLAs | List SLAs from HaloPSA, filtered by showall. | read | service.sla.list12 connectors |
halopsa.tickets.createCreate a HaloPSA ticket | Create a new ticket in HaloPSA. | write | service.ticket.create54 connectors |
halopsa.actions.createCreate a HaloPSA ticket action | Create a new ticket action in HaloPSA. | write | service.ticket_note.create24 connectors |
halopsa.tickets.updateUpdate a HaloPSA ticket | Change fields on an existing ticket in HaloPSA. | write | service.ticket.update50 connectors |
halopsa.tickets.deleteDelete a HaloPSA ticket | Permanently delete a ticket from HaloPSA. | destructive | service.ticket.delete42 connectors |
Try it
Prompts to paste into Claude.
Each one names the HaloPSA actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Which HaloPSA invoices are more than 30 days overdue? Group them by customer with the total owed.
calls
halopsa.invoices.list - Planwrite
Check a client contract and open the renewal conversation in HaloPSA.
calls
halopsa.client_contracts.gethalopsa.clients.gethalopsa.recurring_invoices.listhalopsa.client_contracts.nextrefhalopsa.opportunities.create+1 more - Plandestructive
Onboard a user onto a site and open their setup ticket in HaloPSA. Ask me before anything is sent or changed.
calls
halopsa.users.searchhalopsa.sites.gethalopsa.users.updatehalopsa.user_roles.createhalopsa.tickets.create+1 more - Writewrite
Create a HaloPSA ticket in HaloPSA. Show me exactly what you will send before you save it.
calls
halopsa.tickets.create - Across systemsread
For each customer, how many invoices are in HaloPSA and how many tickets in HubSpot CRM?
calls
halopsa.invoices.listhubspot_crm.tickets.list
Across your systems
HaloPSA, joined to the rest of your business.
One ask fetches from HaloPSA and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.
For each customer, how many invoices are in HaloPSA and how many tickets in HubSpot CRM?
halopsa.invoices.list+hubspot_crm.tickets.list, oncrm.company· HubSpot CRMFor each customer, how many invoices are in HaloPSA and how many tickets in ServiceNow?
halopsa.invoices.list+servicenow_table.incidents.list, oncrm.company· ServiceNow
identity.user 517identity.group 239crm.company 227crm.contact 192work.project 116commerce.product 109identity.role 107finance.invoice 91ask { intent: "for each customer, how many invoices are in HaloPSA and how many tickets in HubSpot CRM", steps: [ { action: "halopsa.invoices.list", as: "inv", input: {}, limit: 100, max_pages: 5 }, { action: "hubspot_crm.tickets.list", as: "tix", input: {}, limit: 100, max_pages: 5 }, { join: { left: "inv", right: "tix", on: "crm.company", group_by: "inv.company_name", select: ["inv.company_name", "count(inv.id) as invoices", "count(tix.id) as tickets"] } } ]}The plan store
Ready-made plans for HaloPSA.
11 plans in the store. Install one and your agent runs it by name; the reply says which connections are still missing. A schedule can run a plan on a timetable. There are no triggers or webhooks, by design.
Close a stale ticket view after a human signs off
Use it when A stale-ticket view has built up and someone wants it cleared out with one sign-off rather than ticket by ticket.
A person decides
Close every ticket in view view id and post the closing note on each.
Triage open tickets and note the ones that need an agent
Use it when An agent starts a shift and wants the client's open tickets read and annotated in one pass.
Audit a client's assets and raise a renewal ticket
Use it when Someone wants a client's asset register checked over and a renewal ticket raised from it.
Approve a quote and turn it into a sales order
Use it when A customer has accepted a quote and it needs approving and converting into a sales order.
A person decides
Approve quote id for client client id and convert it to sales order sales order id.
Review an agent's week and correct a mislogged entry
Use it when An agent's week looks wrong and a single timesheet event needs correcting with the change recorded.
Check a client contract and open the renewal conversation
Use it when A client contract is approaching its end date and the renewal needs opening with the numbers to hand.
Turn a solved ticket into a knowledge base article
Use it when A ticket has been solved in a way worth writing up for the knowledge base.
A person decides
Publish a customer-facing KB article titled 'title' from ticket ticket id.
Raise a purchase order when stock runs low
Use it when Stock for an item has run low and a purchase order needs raising with the supplier.
A person decides
Raise a purchase order with name for item item id.
Declare a service outage and tell the affected users
Use it when A shared service has gone down and the outage needs declaring, broadcasting and tracked to recovery.
Void a duplicate invoice after sign-off
Use it when A customer or the finance team has spotted a duplicate invoice that must be voided.
A person decides
Void invoice id for client client id. Reason: reason.
Onboard a user onto a site and open their setup ticket
Use it when A new starter needs their Halo user record pointed at the right site and a setup ticket raised.
A person decides
Move name to site name and grant role role id.
account { op: "plans.install", slug: "halopsa-close-stale-tickets" }
# then ask for it by name; a schedule can run it on a timetableGovernance for HaloPSA
Destructive actions wait for a yes.
80 HaloPSA actions are destructive. The first 10:
- Delete a HaloPSA ticket
halopsa.tickets.delete - Delete a HaloPSA agent
halopsa.agents.delete - Delete a HaloPSA invoice
halopsa.invoices.delete - Delete a HaloPSA client contract
halopsa.client_contracts.delete - Delete a HaloPSA ticket action
halopsa.actions.delete - Delete a HaloPSA invoice payment
halopsa.invoice_payments.delete - Delete a HaloPSA end user
halopsa.users.delete - Delete a HaloPSA quotation
halopsa.quotations.delete - Delete a HaloPSA client
halopsa.clients.delete - Delete a HaloPSA SLA
halopsa.slas.delete
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
Delete a HaloPSA ticket?
intent: the user asked me to delete a HaloPSA ticket
account { op: "keys.create", name: "halopsa-agent", allowed_actions: ["halopsa.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "halopsa.tickets.delete", approver: "[email protected]" }, { match: "halopsa.agents.delete", approver: "[email protected]" }, { match: "halopsa.invoices.delete", approver: "[email protected]" } ]}Cost
What HaloPSA costs on actionlake.
Every HaloPSA action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call HaloPSA refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 465 HaloPSA actions
- 100actions pageeach page of a long list is one call
- 205reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every HaloPSA action.
465 actions by area: the id your agent calls, what it does, and its effect.
CRM57
halopsa.agents.listList HaloPSA agentsreadhalopsa.clients.listList HaloPSA clientsreadhalopsa.sites.listList HaloPSA sitesreadhalopsa.users.listList HaloPSA end usersreadhalopsa.addressbook.createCreate a HaloPSA address book entrywritehalopsa.addressbook.deleteDelete a HaloPSA address book entrydestructive- and 51 more in this area
Lookups51
halopsa.slas.createCreate a HaloPSA SLAwritehalopsa.slas.getGet one HaloPSA SLAreadhalopsa.slas.listList HaloPSA SLAsreadhalopsa.slas.updateUpdate a HaloPSA SLAwritehalopsa.categories.createCreate a HaloPSA categorywritehalopsa.categories.deleteDelete a HaloPSA categorydestructive- and 45 more in this area
Config41
halopsa.roles.createCreate a HaloPSA rolewritehalopsa.roles.getGet one HaloPSA rolereadhalopsa.roles.listList HaloPSA rolesreadhalopsa.roles.updateUpdate a HaloPSA rolewritehalopsa.custom_buttons.createCreate a HaloPSA custom buttonwritehalopsa.custom_buttons.deleteDelete a HaloPSA custom buttondestructive- and 35 more in this area
Billing40
halopsa.invoice_payments.createCreate a HaloPSA invoice paymentwritehalopsa.invoice_payments.listList HaloPSA invoice paymentsreadhalopsa.invoices.createCreate a HaloPSA invoicewritehalopsa.invoices.listList HaloPSA invoicesreadhalopsa.currencies.createCreate a HaloPSA currencywritehalopsa.currencies.deleteDelete a HaloPSA currencydestructive- and 34 more in this area
Servicedesk35
halopsa.actions.createCreate a HaloPSA ticket actionwritehalopsa.actions.listList HaloPSA ticket actionsreadhalopsa.tickets.createCreate a HaloPSA ticketwritehalopsa.tickets.listList HaloPSA ticketsreadhalopsa.actions.deleteDelete a HaloPSA ticket actiondestructivehalopsa.actions.getGet one HaloPSA ticket actionread- and 29 more in this area
Automation27
halopsa.webhooks.createCreate a HaloPSA webhookwritehalopsa.webhooks.listList HaloPSA webhooksreadhalopsa.workflows.createCreate a HaloPSA workflowwritehalopsa.workflows.listList HaloPSA workflowsreadhalopsa.automations.createCreate a HaloPSA automationwritehalopsa.automations.deleteDelete a HaloPSA automationdestructive- and 21 more in this area
Contracts25
halopsa.client_contracts.createCreate a HaloPSA client contractwritehalopsa.client_contracts.getGet one HaloPSA client contractreadhalopsa.client_contracts.listList HaloPSA client contractsreadhalopsa.client_contracts.updateUpdate a HaloPSA client contractwritehalopsa.client_contracts.approvalHaloPSA: Approve a client contractwritehalopsa.client_contracts.deleteDelete a HaloPSA client contractdestructive- and 19 more in this area
Sales23
halopsa.opportunities.listList HaloPSA opportunitiesreadhalopsa.quotations.createCreate a HaloPSA quotationwritehalopsa.quotations.getGet one HaloPSA quotationreadhalopsa.quotations.listList HaloPSA quotationsreadhalopsa.opportunities.createCreate a HaloPSA opportunitywritehalopsa.opportunities.deleteDelete a HaloPSA opportunitydestructive- and 17 more in this area
Catalogue22
halopsa.items.createCreate a HaloPSA catalogue itemwritehalopsa.items.getGet one HaloPSA catalogue itemreadhalopsa.items.listList HaloPSA catalogue itemsreadhalopsa.items.updateUpdate a HaloPSA catalogue itemwritehalopsa.item_groups.createCreate a HaloPSA item groupwritehalopsa.item_groups.deleteDelete a HaloPSA item groupdestructive- and 16 more in this area
Documents19
halopsa.attachments.deleteDelete a HaloPSA attachmentdestructivehalopsa.attachments.getGet one HaloPSA attachmentreadhalopsa.attachments.listList HaloPSA attachmentsreadhalopsa.attachments.updateUpdate a HaloPSA attachmentwritehalopsa.attachments.createCreate a HaloPSA attachmentwritehalopsa.attachments.document_getHaloPSA: Get an attachment documentread- and 13 more in this area
Procurement19
halopsa.purchase_orders.createCreate a HaloPSA purchase orderwritehalopsa.purchase_orders.getGet one HaloPSA purchase orderreadhalopsa.purchase_orders.listList HaloPSA purchase ordersreadhalopsa.purchase_orders.updateUpdate a HaloPSA purchase orderwritehalopsa.consignments.createCreate a HaloPSA consignmentwritehalopsa.consignments.deleteDelete a HaloPSA consignmentdestructive- and 13 more in this area
Servicecatalogue19
halopsa.service_statuses.createCreate a HaloPSA service statuswritehalopsa.service_statuses.listList HaloPSA service statusesreadhalopsa.services.listList HaloPSA servicesreadhalopsa.services.searchSearch HaloPSA servicesreadhalopsa.service_categories.createCreate a HaloPSA service categorywritehalopsa.service_categories.deleteDelete a HaloPSA service categorydestructive- and 13 more in this area
Assets18
halopsa.assets.createCreate a HaloPSA assetwritehalopsa.assets.getGet one HaloPSA assetreadhalopsa.assets.listList HaloPSA assetsreadhalopsa.assets.updateUpdate a HaloPSA assetwritehalopsa.asset_groups.createCreate a HaloPSA asset groupwritehalopsa.asset_groups.deleteDelete a HaloPSA asset groupdestructive- and 12 more in this area
Knowledge17
halopsa.kb_articles.createCreate a HaloPSA knowledge base articlewritehalopsa.kb_articles.getGet one HaloPSA knowledge base articlereadhalopsa.kb_articles.listList HaloPSA knowledge base articlesreadhalopsa.kb_articles.searchSearch HaloPSA knowledge base articlesreadhalopsa.canned_text.createCreate a HaloPSA canned text snippetwritehalopsa.canned_text.deleteDelete a HaloPSA canned text snippetdestructive- and 11 more in this area
Scheduling13
halopsa.appointments.createCreate a HaloPSA appointmentwritehalopsa.appointments.getGet one HaloPSA appointmentreadhalopsa.appointments.listList HaloPSA appointmentsreadhalopsa.appointments.updateUpdate a HaloPSA appointmentwritehalopsa.appointments.bookingHaloPSA: List bookable appointment slotsreadhalopsa.appointments.deleteDelete a HaloPSA appointmentdestructive- and 7 more in this area
Time12
halopsa.timesheet_events.createCreate a HaloPSA timesheet eventwritehalopsa.timesheet_events.listList HaloPSA timesheet eventsreadhalopsa.timesheet_events.mineHaloPSA: List my timesheet eventsreadhalopsa.timesheet_events.updateUpdate a HaloPSA timesheet eventwritehalopsa.timesheet_events.deleteDelete a HaloPSA timesheet eventdestructivehalopsa.timesheet_events.getGet one HaloPSA timesheet eventread- and 6 more in this area
Reporting9
halopsa.reports.createCreate a HaloPSA reportwritehalopsa.reports.getGet one HaloPSA reportreadhalopsa.reports.listList HaloPSA reportsreadhalopsa.reports.updateUpdate a HaloPSA reportwritehalopsa.reports.bookmarkHaloPSA: Bookmark a reportwritehalopsa.reports.createpdfHaloPSA: Render a report as PDFread- and 3 more in this area
Projects7
halopsa.projects.createCreate a HaloPSA projectwritehalopsa.projects.getGet one HaloPSA projectreadhalopsa.projects.listList HaloPSA projectsreadhalopsa.projects.updateUpdate a HaloPSA projectwritehalopsa.projects.deleteDelete a HaloPSA projectdestructivehalopsa.projects.searchSearch HaloPSA projectsread- and 1 more in this area
Email6
halopsa.mailboxes.createCreate a HaloPSA mailboxwritehalopsa.mailboxes.getGet one HaloPSA mailboxreadhalopsa.mailboxes.listList HaloPSA mailboxesreadhalopsa.mailboxes.outlook_contactsHaloPSA: List a mailbox's Outlook contactsreadhalopsa.mailboxes.deleteDelete a HaloPSA mailboxdestructivehalopsa.mailboxes.updateUpdate a HaloPSA mailboxwrite
Compliance5
halopsa.audit.createCreate a HaloPSA audit entrywritehalopsa.audit.getGet one HaloPSA audit entryreadhalopsa.audit.listList HaloPSA audit entriesreadhalopsa.audit.updateUpdate a HaloPSA audit entrywritehalopsa.audit.deleteDelete a HaloPSA audit entrydestructive
This index shows a sample of each area. All 465 actions, with their inputs and prices, are in the catalogue, which a free sandbox key can search.
Questions
The HaloPSA MCP server, answered.
Is there a HaloPSA MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 465 HaloPSA actions across CRM, lookups, config and billing, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by HaloPSA.
What do I need to connect HaloPSA?
HaloPSA client id and HaloPSA client secret. Plus your tenant host. The free call account { op: "connections.requirements", service: "halopsa" } lists exactly what to paste.
Can an AI agent delete or change things in HaloPSA?
Only if its key allows it, and only with an explicit confirmation. 80 HaloPSA actions are destructive, including delete a HaloPSA ticket, delete a HaloPSA agent and delete a HaloPSA invoice. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.
Will an AI agent use up my HaloPSA API limit?
actionlake paces every call to the limits in the HaloPSA service file: 700 calls per 5 minutes per connection. Repeated reads are answered from cache (205 HaloPSA actions can be), which never reaches HaloPSA.
What does a HaloPSA action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (100 HaloPSA actions page). Cache hits, searches, dry runs and calls HaloPSA refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which HaloPSA API does it cover?
The HaloPSA API 1 at your HaloPSA instance's API base URL, which you enter when connecting (path /api). It is built from HaloPSA's documentation as read on 8 September 2026. 465 actions in 20 areas, each one in the signed service file (version 1.0.0).
Can I combine HaloPSA with my other systems?
Yes. ask joins HaloPSA to HubSpot CRM or ServiceNow on the same customer and returns the answer rather than every row. HaloPSA maps crm.company, which 227 other connectors also map.
Does actionlake keep my HaloPSA data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your HaloPSA credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent HaloPSA today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.