---
title: "Check an email | Proxy Mail QA"
description: "Developer docs for Proxy Mail QA: the MCP server for coding agents, the REST API for test suites, and the Chrome extension."
url: https://proxymail.qa/docs/reference/operations/checkemail
---

# Check an email

GET

/v1/addresses/{address}/checks

```js
const url = 'https://api.proxymail.qa/v1/addresses/k7f2x9ab12cd%40mailclub.dev/checks?expect_host=staging.example.com&expect_text=Welcome%2C%20Maya&expect_language=de&type=code';
const options = {
  method: 'GET',
  headers: {
    'Proxy-Mail-QA-Test': 'sign-up%20%E2%80%BA%20sends%20one%20code',
    Authorization: 'Bearer <token>'
  }
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```sh
curl --request GET \
  --url 'https://api.proxymail.qa/v1/addresses/k7f2x9ab12cd%40mailclub.dev/checks?expect_host=staging.example.com&expect_text=Welcome%2C%20Maya&expect_language=de&type=code' \
  --header 'Authorization: Bearer <token>' \
  --header 'Proxy-Mail-QA-Test: sign-up%20%E2%80%BA%20sends%20one%20code'
```

Runs checks on one email the address received: the one named by `email_id`, or the newest matching the filters. Doesn’t wait: wait for the email first (`/code`, `/link` or `/count`). Each check passes, fails, warns or is skipped, with a one-line reason: SPF, DKIM and DMARC (the receiving server’s verdicts), links to localhost or a private address (also after a redirect), plain http links, the site its sign-in, verify, reset or invite link goes to (`expect_host`), whether it says when its code or link expires, a plain-text version, the HTML’s size against Gmail’s 102 KB limit, image-only emails, whether it fits a phone, and, when asked, given phrases (`expect_text`) and the language (`expect_language`). Verdicts only: never the email’s text or its links (reasons name at most a domain or a link’s host).

## Authorizations

- **[apiKey](https://proxymail.qa/docs/reference.html#apikey)**

## Parameters

### Path Parameters

**address**

required

string format: email

The test address, URL-encoded. A variant also works: capitals, or a +tag (k7f2x9ab12cd+o’[brien@mailclub.dev](mailto:brien@mailclub.dev)). It acts on the plain address; waiting on a +tag variant, or listing its messages, only finds mail sent to that variant.

#### Example 

```plaintext
k7f2x9ab12cd@mailclub.dev
```

### Query Parameters

**email\_id**

string format: uuid

The email to check, as /count gives it. Default: the newest that matches.

**since**

string format: date-time

Only email received at or after this time.

**expect\_host**

string

The site its sign-in, verify, reset or invite link should go to, after any redirect (subdomains count). Without it, that check is skipped.

#### Example 

```plaintext
staging.example.com
```

**expect\_text**

Array<string>

<= 10 items

A phrase the subject or body should contain; repeat for more (up to 10). Case, curly quotes and spacing don’t matter, and the answer names only the missing ones.

#### Example 

```plaintext
?expect_text=Welcome%2C%20Maya
```

**expect\_language**

string

The language it should be in, such as de or pt-BR. Without it, that check is skipped.

#### Example 

```plaintext
de
```

**service**

string

Only email from this service, by name or domain (e.g. ‘spotify’).

**type**

string

Allowed values: code link

Only emails with a code, or with a link. Codes leave out coupons, and links count verify, magic\_signin, invite and reset, unless subtype says otherwise.

**subtype**

string

With type, comma-separated: otp or coupon for codes; verify, magic\_signin, invite, reset or other for links; or any.

### Header Parameters

**Proxy-Mail-QA-Run**

string format: uuid

A run’s id (POST /v1/runs): adds what this call saw to the run. If it can’t be added (the run finished, or isn’t in this project), the call still works and the Proxy-Mail-QA-Run-Warning response header says why.

**Proxy-Mail-QA-Test**

string

<= 600 characters

With Proxy-Mail-QA-Run: the test this call belongs to, percent-encoded (encodeURIComponent), up to 200 characters once decoded. The run’s report shows it beside what the call saw.

#### Example 

```plaintext
sign-up%20%E2%80%BA%20sends%20one%20code
```

## Responses

### 200

The checks

Media typeapplication/json

### object

**address**

string

**email**

Which email was checked, without its content.

### object

**id**

string format: uuid

**received\_at**

string format: date-time

**service**

string | null

**service\_domain**

string | null

**type**

Its main code or link.

string | null

Allowed values: code link

**subtype**

string | null

**passed**

No check failed. Warnings don’t count.

boolean

**failed**

Array<string>

**warnings**

Array<string>

**checks**

Array<object>

### object

**check**

string

Allowed values: spf dkim dmarc local\_links plain\_http expected\_host expiry plain\_text size images\_only layout expected\_text language

**status**

string

Allowed values: pass fail warn skip

**detail**

string

#### Example 

```json
{
  "email": {
    "type": "code"
  },
  "checks": [
    {
      "check": "spf",
      "status": "pass",
      "detail": "The sending server is allowed to send for acme.example."
    }
  ]
}
```

### 400

An error

Media typeapplication/json

### object

**error**

string

**message**

string

#### Example generated

```json
{
  "error": "example",
  "message": "example"
}
```

### 404

An error

Media typeapplication/json

### object

**error**

string

**message**

string

#### Example generated

```json
{
  "error": "example",
  "message": "example"
}
```

[Previous Unusual versions of the address, for testing sign-up forms](https://proxymail.qa/docs/reference/operations/getvariants.html) [Next Check why mail is or isn't arriving](https://proxymail.qa/docs/reference/operations/checkdelivery.html)
