Claude AI setup
Let Claude answer questions about your portfolio — "how much rent is overdue?", "which contracts expire in the next 60 days?", "summarise open maintenance issues by property". Three integration options below, easiest first.
Always use a read_only key for AI assistants.
An LLM can be coaxed (intentionally or accidentally) into calling write endpoints. A read-only key makes those calls fail with 403 INSUFFICIENT_SCOPE — a hard stop instead of a silent mistake. Generate one in Dashboard → Developer → API keys.
Option 1 — Claude Project knowledge
Works in claude.ai with any plan that includes Projects. Claude uses its built-in web fetcher to call HomeDash and reasons over the JSON. No code, no setup, no MCP.
In Claude: create a Project
Open claude.ai → Projects → Create project. Name it something like "HomeDash assistant".
Paste this into the project's system prompt
Replace hd_live_REPLACE_ME_READ_ONLY_KEY with the read-only key you generated in HomeDash:
You are an assistant for a UK landlord using HomeDash.
You can call the HomeDash Public API to answer questions.
Base URL: https://app.homedash.co.uk/api/public/v1
Auth header: Authorization: Bearer hd_live_REPLACE_ME_READ_ONLY_KEY
Available endpoints (read only):
GET /properties List properties (status, search, page, limit)
GET /properties/{id} Single property
GET /contracts List tenancy contracts (status, propertyId, tenantId, page, limit)
GET /contracts/{id} Single contract
GET /rent Rent payments (status: Paid|Pending|Overdue, contractId, page, limit)
GET /rent/{id}/invoice/pdf Download invoice/receipt PDF for a rent payment (binary PDF response)
Rules:
- Always include the Authorization header on every call.
- Never call any non-GET endpoint. The key is read-only and writes will fail (including POST …/invoice/email).
- Cite the source of every figure (property name, contract id, etc.) in your answer.
- If a request fails, read the "code" field from the JSON error body and explain
the cause to the user.
- For "overdue" / "late" / "behind on rent" queries, call GET /rent?status=Overdue.
- For "expiring contracts" / "renewals" queries, call GET /contracts?status=Active
and filter by endDate yourself (the API does not support endDate filters yet).Ask questions in natural language
Examples that work out of the box:
- "How much rent is overdue right now and which tenants?"
- "Which contracts expire in the next 60 days?"
- "Summarise the maintenance backlog by property."
- "What is the average monthly rent across active tenancies?"
- "Generate a one-paragraph status report for property <id>."
The first call may take a few seconds while Claude discovers the API. Subsequent questions in the same chat are usually faster.
Option 2 — Custom Connector / MCP
For Claude Desktop and any MCP-aware client. You configure HomeDash as a connector once; the client exposes every endpoint as a tool that Claude can call.
Add the following to your MCP client configuration (the exact location depends on the client — for Claude Desktop it is claude_desktop_config.json):
{
"mcpServers": {
"homedash": {
"type": "http",
"url": "https://app.homedash.co.uk/api/public/v1",
"headers": {
"Authorization": "Bearer hd_live_YOUR_READ_ONLY_KEY"
}
}
}
}Restart the client. HomeDash now appears as an available connector. Ask Claude questions like the ones in Option 1 — it will call HomeDash directly.
Option 3 — build your own tool with the Anthropic SDK
For production agents and custom workflows. You define tools matching the HomeDash endpoints and call the Anthropic Messages API yourself.
// Node.js + Anthropic SDK
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const tools = [
{
name: 'list_overdue_rent',
description: 'Returns rent payments with status=Overdue.',
input_schema: { type: 'object', properties: {} },
},
];
const message = await client.messages.create({
model: 'claude-opus-4-1',
max_tokens: 1024,
tools,
messages: [{ role: 'user', content: 'How much rent is overdue this month?' }],
});
// When Claude requests a tool, fetch from HomeDash:
async function listOverdueRent() {
const res = await fetch(
'https://app.homedash.co.uk/api/public/v1/rent?status=Overdue&limit=100',
{ headers: { Authorization: `Bearer ${process.env.HOMEDASH_KEY}` } },
);
return res.json();
}The full endpoint contract lives in the API reference (interactive) and /openapi.yaml (machine-readable). Many agent frameworks can auto-generate tool definitions from OpenAPI directly.
Sample questions to try
- "Which property has the highest rent and who lives there?"
- "Compare this month's collected rent to last month."
- "List vacant properties with their last known asking rent."
- "Draft a renewal email for the contract ending soonest."
- "Summarise overdue rent by property as a markdown table."
Cost and rate-limit awareness
- Claude tends to fetch large pages. Pass
?limit=500(max) rather than relying on the default 20, then usemeta.hasNextPageand?page=for the rest. - On Portfolio, the read budget is 100/min and 10,000/day per key — plenty for ad-hoc Q&A but watch out for chatty agents in a loop.
- If you build an autonomous agent, gate its access with a dedicated read-only key so you can revoke it in one click.