---
title: "Summarize email delivery per document"
method: GET
path: "/companies/{company}/emails/indicators"
tags: ["Emails"]
---

# Summarize email delivery per document

`GET /companies/{company}/emails/indicators`

## Request

- Base URL: `https://api.factuarea.com/v1`
- URL: `https://api.factuarea.com/v1/companies/{company}/emails/indicators`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Summarize email delivery for a batch of documents in one call: emails sent, last status, last hand-off and failures per document.
- `last_status` and `last_sent_at` describe the hand-off to the outgoing SMTP server, not real delivery.
- A `sent` email may still bounce.

## Path parameters

- `company` string, uuid, required

## Query parameters

- `related_entity_ids[]` string[], required
- `related_entity_type` 'invoice' | 'quote' | 'proforma' | 'delivery_note' | 'purchase_invoice' | 'recurring_invoice'

## Headers

- `Factuarea-Version` string, date

## Response `200`

`EmailDeliveryIndicatorsV1Resource`

- EmailDeliveryIndicators: Email summary of a batch of documents (`{ data }`). It does NOT paginate: you asked for a bounded batch (up to 100 ids) and you get one entry per document that HAS emails. Documents without any email, and ids that do not belong to a document of your company, are OMITTED — never returned with zeros — so `data` can be shorter than the batch you sent, or empty.
  - `data` EmailDeliveryIndicator[], required: One entry per requested document that has at least one email.
    - `related_entity_id` string, uuid, required: UUID v7 of the document, exactly as you sent it in `related_entity_ids`. Match the results back by this field, never by position.
    - `related_entity_type` 'invoice' | 'quote' | 'proforma' | 'delivery_note' | 'purchase_invoice' | 'recurring_invoice', required: Document type RESOLVED for this id. It is always reported, even when you did not send `related_entity_type`, so a batch can mix types safely.
    - `object` 'email_delivery_indicator', required: Always `email_delivery_indicator`.
    - `total` integer, required: Number of emails registered for this document.
    - `last_status` 'queued' | 'sending' | 'sent' | 'failed', required: Status of the most recent email of this document. Status of the send. It describes the hand-off to the OUTGOING SMTP SERVER, NOT real delivery to the recipient's mailbox: `queued` (accepted, waiting for the worker), `sending` (being handed off), `sent` (the outgoing mail server accepted the message) and `failed` (every attempt failed). A `sent` message can still bounce or land in spam afterwards without the platform finding out. There are deliberately no `delivered`, `bounced` or `opened` values: observing them would require a mail provider with delivery webhooks, which is out of scope.
    - `last_sent_at` string, date-time, nullable, required: Latest time something left for the outgoing mail server (ISO 8601), or `null` if nothing ever did. It is the MAXIMUM across the document's emails, so it can be non-null while `last_status` is `failed`: the last attempt failed, an earlier one went out.
    - `attempts` integer, required: Highest number of attempts among the emails of this document — the maximum, NOT their sum.
    - `failed_count` integer, required: How many emails of this document ended in `failed`.

## Other responses

- `400`: The request is syntactically malformed — e.g. an unknown query parameter, an integer parameter with non-numeric value, or a value outside the documented range.
- `401`: Missing or invalid API key.
- `403`: The request is authenticated but not allowed: the API key lacks the required scope (`insufficient_scope`), the plan does not include the public API or this feature (`addon_not_active`, `feature_not_available_in_plan`), or the module is not available with a test key (`module_not_available_in_sandbox`).
- `404`: The requested resource does not exist or belongs to another company. `profile_not_found`: the company in the path does not exist, is not in the API key scope or belongs to the other environment (live or test).
- `422`: Validation failed. The `error.param` field identifies which input is invalid.
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/factuarea/apis/factuarea-public-api.md) · [All operations](https://skmtc.dev/factuarea/apis/factuarea-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/factuarea/apis/factuarea-public-api/revisions/718e77934422?raw)
