---
title: "Retrieve a sending domain's sender logo"
method: GET
path: "/api/v1/domains/{id}/logo"
tags: ["Domains"]
---

# Retrieve a sending domain's sender logo

`GET /api/v1/domains/{id}/logo`

## Request

- Base URL: `https://api.sendly.now`
- URL: `https://api.sendly.now/api/v1/domains/{id}/logo`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `better-auth.session_token`
  - OAuth 2 (authorization code, authorization URL `https://app.sendly.now/api/auth/oauth2/authorize`, token URL `https://app.sendly.now/api/auth/oauth2/token`, scopes: `domains:read`)

The logo this identity serves to mailboxes, the DNS record that makes them fetch it, and whether they will show it today.

A mailbox that supports BIMI shows this logo beside mail from the identity, once two DNS records are in place: a `default._bimi.<host>` TXT record naming the logo's URL (returned as `bimi_record`), and a DMARC policy of `p=quarantine` or `p=reject` applied to all mail. `readiness` is a fresh reading of both from public DNS. Providers decide whether to display a logo, so DNS readiness alone does not guarantee display. Gmail additionally requires a VMC or CMC certificate, which Sendly neither issues nor checks.

The URL is keyed by the identity and never changes, so the record is published once. Until a logo is uploaded it serves a default: the domain's initial on a coloured square. It serves nothing (`serving` is false) until the identity verifies, and nothing while the project is disabled.

Requires the `domains:read` scope — View your sending domains and their verification status.

## Path parameters

- `id` string, uuid, required: Resource id.

## Response `200`

The identity's sender logo

- DomainLogoV1: The logo mailboxes show beside mail from a sending identity, published through BIMI.
  - `bimi_record` object, required: The DNS record that makes a mailbox fetch `url`. Publish it once.
    - `name` string, required
    - `type` 'TXT', required
    - `value` string, required
  - `domain_id` string, uuid, required
  - `png_url` string, uri: The same logo as a 1024x1024 PNG, for the places that take no SVG (a Google account's profile photo, Apple Branded Mail). Served under the same rules as `url`.
  - `readiness` object, required: What public DNS says right now. A provider shows the logo only when DMARC is `enforced` (p=quarantine or p=reject at pct=100) and the record is `published`. `unknown` means the lookup failed, not that the record is absent. Providers decide whether to display a logo. Gmail additionally requires a VMC or CMC certificate, which this does not check. DNS readiness alone does not guarantee display.
    - `bimi_record` object, required
      - `found_at` string, nullable, required
      - `location` string, nullable, required
      - `status` 'published' | 'points_elsewhere' | 'missing' | 'unknown', required
    - `dmarc` object, required
      - `found_at` string, nullable, required
      - `pct` integer, nullable, required
      - `policy` string, nullable, required
      - `status` 'enforced' | 'not_enforced' | 'missing' | 'unknown', required
  - `serving` boolean, required: Whether `url` answers today. It answers only once the identity has verified.
  - `sha256` string, required
  - `size_bytes` integer, required
  - `source` 'uploaded' | 'default', required: `default` is a monogram of the domain's initial, served until a logo is uploaded and again after one is removed.
  - `svg` string, required: The SVG Tiny PS file `url` serves.
  - `updated_at` string, date-time, nullable, required: When the upload was stored; null for `default`.
  - `url` string, uri, required: Where the logo is served. Stable for the life of the identity, so the BIMI record is published once and a new upload needs no DNS change.

## Other responses

- `401`: `invalid_api_key` or `invalid_session` — missing or invalid credentials.
- `403`: `scope_missing`, `project_access_denied`, or `project_disabled`.
- `404`: `resource_not_found` — no sending domain with this id belongs to the authenticated project.
- `422`: `validation_error` — query, path, or body parameters did not match the schema.
- `429`: `rate_limited` — see `Retry-After` and the `RateLimit` headers.
- `500`: `internal_error`.

---

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