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.

Easiest · no code

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.

1

In Claude: create a Project

Open claude.ai Projects → Create project. Name it something like "HomeDash assistant".

2

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).
3

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.

Recommended · light setup

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):

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.

The MCP integration discovers endpoints from the OpenAPI spec at /openapi.yaml. If your client supports OpenAPI-driven discovery, point it there.
Power user · code

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.

claude-tool.ts
// 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 use meta.hasNextPage and ?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.