---
url: https://saas.dev/docs/customers
md: https://saas.dev/docs/customers.md
reads: [every Noun, Offer.pro]
generates: 5 of 34 outputs
next: https://saas.dev/docs/how-it-works.md
---

# What your Customers get

> Each Customer gets your API, MCP and Docs on your own domain, with their own key, Limit and Tenant, and a sign-in that sets what people and agents may do.

## Your own domain

Every [Customer](https://startupbuilder.dev/business/nouns/customer) meets Leaseclock at leaseclock.com. The definition that runs your Admin also serves your Customers' API, MCP server and Docs there, under your name.

| Interface | On leaseclock.com | Each Customer gets |
| --- | --- | --- |
| API | `https://leaseclock.com/api` | 18 operations on Leases and Units |
| MCP | `https://leaseclock.com/mcp` | `search`, `fetch` and `do` |
| Docs | `https://leaseclock.com/docs` | A page per Noun and Verb, each with a Markdown twin |
| llms.txt | `https://leaseclock.com/llms.txt` | Their agent's front door: the types, the tools and every page |

These are your Customers' [base URLs](https://saas.dev/docs/interfaces.md#base-urls); yours stay on api.sb.

No address, key, header or refusal names the platform. When you publish a new [Version](https://startupbuilder.dev/business/nouns/version), the API, MCP and Docs move to it together.

## Keys and Limits

Each Customer holds [API Keys](https://startupbuilder.dev/business/nouns/api-key) for their own Tenant. A key signs calls to the API and MCP, and rolling or revoking one is a single Verb, from the Admin or any Interface.

The [Offer](https://startupbuilder.dev/business/nouns/offer) a Customer buys sets their [Limits](https://startupbuilder.dev/business/nouns/limit). Leaseclock Pro writes `limits: { Unit: 200 }`, so the 201st Unit is refused before anything runs:

```bash title="Terminal"
curl -X POST https://leaseclock.com/api/units \
  -H "authorization: Bearer $LEASECLOCK_KEY" -H 'content-type: application/json' \
  -d '{"label":"14C","building":"Harbor Court"}'
```

```json title="403 · application/problem+json"
{
  "type": "https://leaseclock.com/docs/errors/limit-exceeded",
  "status": 403,
  "title": "Limit exceeded",
  "code": "limit",
  "detail": "Leaseclock Pro holds up to 200 units; this Tenant holds 200"
}
```

A refused call stores nothing and costs nothing. The count belongs to the Tenant, and every Interface refuses with the same code: the SDK, MCP's `do` and the SaaS App's Create form. Leaseclock's Docs list each code with its fix at leaseclock.com/docs/errors, generated from the hub's [refusal catalog](https://startupbuilder.dev/code/api/errors).

## Tenants

Each Customer gets one [Tenant](https://startupbuilder.dev/business/nouns/tenant): their own Leases and Units, apart from every other Customer's. The key carries the Tenant, so no request names it.

The Property manager's key lists their Tenant's active Leases, soonest first:

```bash title="Terminal"
curl -G https://leaseclock.com/api/leases -H "authorization: Bearer $LEASECLOCK_KEY" \
  --data-urlencode status=active --data-urlencode sort=endsOn
```

```json title="200 · application/json"
{
  "leases": [
    {
      "$id": "https://leaseclock.com/api/leases/4b",
      "$type": "Lease",
      "unit": "4b",
      "renter": "maya.ortiz@example.com",
      "endsOn": "2026-11-15",
      "status": "active"
    },
    {
      "$id": "https://leaseclock.com/api/leases/12",
      "$type": "Lease",
      "unit": "12",
      "renter": "sam.lee@example.com",
      "endsOn": "2027-03-31",
      "status": "active"
    }
  ],
  "meta": { "total": 2 }
}
```

The API applies the Tenant to every call, so the SaaS App, the SDK and an agent see these records and no others. A record from another Tenant answers `404`, as if it did not exist. Your team's Admin reaches every Tenant; a Customer's key reaches one.

## Customer sign-in

Customers sign in on leaseclock.com, under Leaseclock's name and theme. Each person holds one [Access level](https://startupbuilder.dev/business/nouns/access-level) in their Tenant, and the API checks it on every call.

| [Persona](https://startupbuilder.dev/business/nouns/persona) | Access level | In their Tenant |
| --- | --- | --- |
| Property manager | `owner` | Buys Leaseclock Pro and invites the team |
| Leasing coordinator | `member` | Records Leases and renews them |

The Property manager adds the Leasing coordinator with [Tenant.invite](https://startupbuilder.dev/business/nouns/tenant/invite). Signed in, each person works in the [SaaS App](https://saas.dev/docs/app.md#saas-app): your Admin's screens, scoped to their Tenant and Access level.

## Your Customers' agents

A Customer adds Leaseclock to their agent with one config:

```json title="MCP config"
{ "mcpServers": { "leaseclock": { "url": "https://leaseclock.com/mcp" } } }
```

The client opens sign-in on leaseclock.com; the agent holds its person's Access level, in that person's Tenant.

Three tools cover every Noun and Verb. `search` finds records, `fetch` reads one, and `do` runs a Verb. The Leasing coordinator's agent finds the Leases ending by November 30, previews each renew in try mode, and commits once the coordinator agrees.

The agent meets the same refusals a person does, in the same words. At the 201st Unit it reads "Leaseclock Pro holds up to 200 units" and stops.

Read next: [How generation works](https://saas.dev/docs/how-it-works.md)