# Reference

> Part of the Cowliss docs. Markdown for every page: append `index.md` to its URL. Site map: /llms.txt

## Errors

Errors come back in Resend's shape, so the SDK's own `error` reports them.

| What you sent | Answer |
| --- | --- |
| No `Authorization` header | 401 `missing_api_key` |
| A key nobody issued | 401 `invalid_api_key` |
| An app that is not yours, or one with no source taking calls | 404 `not_found` |
| A required field left out | 422 `missing_required_field` |
| A field Cowliss does not serve, a template beside `html` or `text`, a subject beside a template, or a template its recipients can turn off | 422 `validation_error` |
| A `from` on a domain you have not verified | 403 `validation_error` |
| A message that reads as spam (the delivery log keeps a `skipped_spam` row with its score) | 422 `validation_error` |
| More mail than your credit covers | 429 `monthly_quota_exceeded` |
| Too many calls too quickly | 429 `rate_limit_exceeded` |
| An id that is not one of your messages | 404 `not_found` |

## What the base URL may end with

The app id, which is what every example here prints. The id of that app's API source (`src_…`) is accepted too, so a base URL configured before app ids were taken keeps working; both send exactly the same message.

## What is not served

Attachments, scheduling and topics are each refused with the field named, and the message says what to do instead: link to the file, send the message when it should arrive (or let an automation's wait do the waiting), and record consent as a purpose.

There is no update or cancel, and no contacts, audiences, broadcasts, domains or API keys under this base URL.

## Where next

- [Sending and delivery](/emails/delivery/): your sending domain, the gates every send passes, and the delivery log.
- [Email templates](/emails/): the template file contract and purposes.
- [Automations](/automations/): the mail that follows a rule rather than a line of your code.
