> ## Documentation Index
> Fetch the complete documentation index at: https://api.lawtte.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors and rate limits

> Status codes Lawtte returns, and the guardrails on outbound calling.

## Status codes

| Code  | Meaning                                                   | What to do                                                           |
| ----- | --------------------------------------------------------- | -------------------------------------------------------------------- |
| `200` | Success.                                                  | —                                                                    |
| `400` | The request body or query is invalid.                     | Read `error` in the response; fix the field it names.                |
| `401` | Missing, malformed, or revoked credentials.               | Check the `Authorization` header; rotate the key if needed.          |
| `403` | Authenticated, but not allowed for this firm or role.     | Confirm the `firmSlug` matches your key.                             |
| `404` | No such record for this firm.                             | Verify the ID — IDs are scoped per firm.                             |
| `429` | Too many requests, or a calling limit was reached.        | Back off and retry; see calling limits below.                        |
| `503` | A dependency (auth store, telephony, CRM) is unavailable. | Retry with backoff. Call-placing paths fail closed rather than dial. |

Errors return JSON with a human-readable message:

```json theme={null}
{ "error": "That number is on the firm's Do Not Call list." }
```

## Calling limits

Outbound calling is deliberately conservative — your firm's number is the thing
being protected.

<AccordionGroup>
  <Accordion title="50 calls per firm per day" icon="phone">
    The counter resets at UTC midnight. The 51st call is refused before dialing.
  </Accordion>

  <Accordion title="One call per number every two hours" icon="clock">
    A repeat within the window is refused, so a retry loop cannot pester a client.
  </Accordion>

  <Accordion title="9:00 a.m. to 8:00 p.m. in the recipient's time zone" icon="sun">
    The window is derived from the recipient's area code. If the zone cannot be
    determined, the call is refused rather than guessed.
  </Accordion>

  <Accordion title="Do Not Call is absolute" icon="ban">
    Numbers on the firm's DNC list are never dialed, and the check fails closed if
    the list cannot be read.
  </Accordion>
</AccordionGroup>

<Note>
  High call volume can get a number labeled as spam by carriers, which no API
  limit can undo. Spread campaigns out.
</Note>

## Idempotency

Call creation is not idempotent: two identical requests create two calls, subject
to the two-hour repeat rule. Store the returned `call_id` and reconcile against it
rather than retrying blindly.


## Related topics

- [Limits and safety](/mcp/limits-and-safety.md)
- [Quickstart](/quickstart.md)
- [Lists contacts for a firm with optional search and pagination](/api-reference/contacts/lists-contacts-for-a-firm-with-optional-search-and-pagination.md)
- [Lists ended calls for a specific firm with pagination support](/api-reference/voice-&-chat/lists-ended-calls-for-a-specific-firm-with-pagination-support.md)
- [Scans call logs for a firm, uses AI to extract lead information (name, phone, email, case type), deduplicates, and creates Supabase lead records](/api-reference/leads/scans-call-logs-for-a-firm-uses-ai-to-extract-lead-information-name-phone-email-case-type-deduplicates-and-creates-supabase-lead-records.md)
