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

# Cold-email compliance checks

> Check each address on an outreach list against its jurisdiction's cold-email rule before you send.

Cold-email rules differ by country. In the United States you can email anyone with a working opt-out. In Germany you need prior consent, even for business addresses. This guide shows how to sort an outreach list into addresses you can email, addresses that need consent first, and addresses to review.

## How Finowl decides

1. **Domain.** A country-code domain like `.de` or `.co.uk`, or a single-country mailbox provider like `web.de`, points to a country. Vanity domains such as `.io` and `.co` are ignored.
2. **Mail servers.** Third-party mail hosts in a country add evidence.
3. **Website.** The homepage's declared language and its `tel:` links add evidence. Finowl ignores redirects to locale paths like `/in`, because those follow the visitor's location rather than the owner's.

One country backed by two independent checks is `confident`. Thinner evidence, or several candidate countries, is `medium`, and the strictest candidate's rule applies. With no evidence the result is `unknown` and the `consent_required` default applies.

## Example

```python theme={null}
import os
import time
import requests

session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['FINOWL_API_KEY']}"

SEND = {"allowed", "allowed_by_policy", "allowed_with_conditions", "safe_to_send"}


def verdict(email):
    for _ in range(5):
        response = session.post(
            "https://api.finowl.co/v1/compliance/email",
            json={"email": email},
            timeout=40,
        )
        response.raise_for_status()
        result = response.json()
        if not result.get("checking"):
            return result
        time.sleep(3)  # provisional: re-checks are free
    return result


def triage(emails):
    send, consent, review = [], [], []
    for email in emails:
        result = verdict(email)
        code = result["recommendation_code"]
        if code in SEND:
            send.append(email)
        elif code in ("consent_required", "prohibited"):
            consent.append(email)
        else:  # exception_required, case_by_case and any new code
            review.append((email, result["recommendation"]))
    return send, consent, review
```

## Showing the result

| `confidence` | What to show |
| - | - |
| `confident` | The country and its rule. |
| `medium` | The rule, noting it is the strictest of the countries in `jurisdictions_applicable`. |
| `unknown` | No country. Show `recommendation` and `main_restrictions` as general guidance. |

`message` is a sentence you can show as is.

<Warning>
  Finowl's rules are guidance compiled from public sources, not legal advice. `allowed_with_conditions` still means you must meet the conditions in `main_restrictions`, such as identifying yourself and honouring opt-outs.
</Warning>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.