---
title: "Chimes"
description: "Send, schedule, and track customer notifications by SMS or email."
canonical: "https://studio.inttegro.com/api/chimes"
format: inttegro-machine-docs/v1
language: "Ruby"
sdk_version: "v10.0.0"
reader_profile: optional
reader_manifest: "https://studio.inttegro.com/machine/ruby/readers/index.json"
reader_identification: "Optional: declare your client only if known and your current-session capabilities; use reader_manifest for supplemental recommendations."
preamble_estimated_tokens: 693
model_token_report: "https://studio.inttegro.com/machine/token-report.json"
preamble_questions: 5
preamble_source: "machine-only-decisions"
recommended_mcp_tools: ["get_message","get_message_analytics","list_messages"]
estimated_tokens: 19868
token_estimate_method: "utf8_bytes_divided_by_4"
---

## Machine preamble

**Summary:** Send, schedule, and track customer notifications by SMS or email. This Ruby representation uses the selected SDK's native names wherever Studio has a verified mapping.

### Five questions

#### Q1. Is Chimes the right source for this task?

Use this reference for send, schedule, and track customer notifications by sms or email. Keep the four decision rules below with its exact operations and fields; do not infer a broader workflow from endpoint order.

#### Q2. What does “Do not use Chimes for verification codes” require?

**Do not use Chimes for verification codes.** Route authentication and
possession checks through [One-time passwords](https://studio.inttegro.com/machine/ruby/api/otps.md), which owns token
generation and verdict semantics.

#### Q3. What does “Choose one recipient shape” require?

**Choose one recipient shape.** Address a saved customer with customer ID and
transport, or provide one inline phone number or email address. Do not combine
saved-customer and inline fields in the same recipient.

#### Q4. What does “Choose one matching content source” require?

**Choose one matching content source.** Use inline SMS content or a published
SMS template for SMS; use inline email content or a published email template
for email. A stored template's channel must match the resolved recipient
channel.

#### Q5. What does “Split mixed-channel batches” require?

**Split mixed-channel batches.** Every recipient in one schedule or broadcast
must use the same channel. Create separate SMS and email operations, preserve
their returned IDs, and use lookup to follow delivery or cancellation state.
See [Message templates](https://studio.inttegro.com/machine/ruby/api/message-templates.md) when content is reusable.

### Recommended MCP assistance

Use these through an authenticated Inttegro MCP connection. This document remains the contract source.

- [`get_message`](https://studio.inttegro.com/machine/ruby/inttegro-mcp/tools.md#get_message) — read; no mutation confirmation. Gets the lifecycle status of one customer message without exposing its body or recipient contact details.
- [`get_message_analytics`](https://studio.inttegro.com/machine/ruby/inttegro-mcp/tools.md#get_message_analytics) — analytics read; no mutation confirmation. Compares initialized, delivered, and failed customer-message activity, including a clearly labeled delivered-to-initialized period ratio, without message bodies or contact details.
- [`list_messages`](https://studio.inttegro.com/machine/ruby/inttegro-mcp/tools.md#list_messages) — read; no mutation confirmation. Lists recent customer-message delivery statuses. Message bodies, recipients, provider payloads, and delivery addresses are excluded.

## Document content

# Chimes

Chimes are the SMS and email messages your business sends through Inttegro: receipts, delivery updates, reminders, and other customer notifications. Send one message now, schedule it for later, or broadcast it to an audience, then use its delivery status when a customer needs help. For one-time passwords, use the [OTP API](https://studio.inttegro.com/machine/ruby/api/otps.md) instead.

## Select one notification shape and preserve its channel

The four decision rules are in the machine preamble above.

## The chime object

A Chime is one notification for one recipient. It records the message, recipient, sender, and delivery status.

### Properties

- [`created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp` — required

  When this Chime was created for delivery.

- [`customer_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

  Saved customer used to resolve the recipient when the Chime was sent from a
  customer record. Omitted for inline recipients.

- [`custom_data`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

  Your own key-value string pairs for custom data and tracking. Store user
  IDs, session identifiers, campaign tags, or any context you need for
  reconciliation and analytics.

- [`email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html)

  Email content and safety scan result. Present when the Chime is sent by email.

  - [`email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Mailbox shown in the email From field.

    - [`email.from.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Sender email address.

    - [`email.from.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Optional sender display name.

  - [`email.headers`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Additional email headers after validation.

  - [`email.html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string|null`

    HTML body before delivery-specific rendering.

  - [`email.reply_to`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Mailbox that receives replies.

    - [`email.reply_to.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Reply-to email address.

    - [`email.reply_to.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Optional reply-to display name.

  - [`email.safety`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Result of the email content safety scan.

    - [`email.safety.content_hash`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Hash of the content that was scanned.

    - [`email.safety.links`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `array`

      Links found while scanning the message.

      - [`email.safety.links.host`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

        Host name, when one is present.

      - [`email.safety.links.raw`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

        Link exactly as it appeared in the message.

      - [`email.safety.links.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

        Reason for the link decision, when available.

      - [`email.safety.links.scheme`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

        URL scheme.

      - [`email.safety.links.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum`

        [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

    - [`email.safety.normalized_text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Normalized plain-text body used by the scan.

    - [`email.safety.quarantine_notes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string|null`

      Additional context when content is quarantined.

    - [`email.safety.reason_codes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `array`

      Machine-readable reasons for a non-allowed result.

    - [`email.safety.sanitized_html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string|null`

      Sanitized HTML used for delivery, when available.

    - [`email.safety.scanner`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Safety scanner that produced the result.

    - [`email.safety.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum`

      [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

  - [`email.schema`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Schema.org markup generated for supported messages.

    - [`email.schema.json_ld`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

      Schema.org JSON-LD inserted into the HTML email.

    - [`email.schema.kind`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum`

      [`Inttegro::Chime::EmailSchemaKind::GMAIL_VIEW_ACTION`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/EmailSchemaKind.html#GMAIL_VIEW_ACTION-constant) , [`Inttegro::Chime::EmailSchemaKind::SCHEMA_ORG_INVOICE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/EmailSchemaKind.html#SCHEMA_ORG_INVOICE-constant) , or [`Inttegro::Chime::EmailSchemaKind::SCHEMA_ORG_ORDER`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/EmailSchemaKind.html#SCHEMA_ORG_ORDER-constant) .

  - [`email.subject`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Email subject.

  - [`email.text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Plain-text email body.

- [`full_message`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

  Rendered SMS content. This is an empty string for email Chimes, whose
  content is returned in the [`chime.email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) object instead.

- [`id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

  Unique identifier for this Chime—use it for lookups, delivery tracking, and
  reconciliation.

- [`idempotency_key`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

  Request key associated with the Chime.

- [`purpose`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

  Application-defined category for this Chime. Omitted when it was not
  provided.

- [`recipient`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — required

  Recipient contact information.

  - [`recipient.email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Present when recipient type is [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant) .

    - [`recipient.email.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Email address.

  - [`recipient.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Recipient name for personalization.

  - [`recipient.phone`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `object`

    Present when recipient type is [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant) .

    - [`recipient.phone.number`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Phone number in international format.

  - [`recipient.type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum` — required

    Contact type: [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant) or [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant).

- [`sender_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

  Sender identifier used for SMS. Email senders are returned in
  [`chime.email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html).

- [`transmission`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html)

  Transmission details and delivery status. Omitted until a transmission exists.

  - [`transmission.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

    Resolved destination address used for the transmission.

  - [`transmission.created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp` — required

    When this transmission was initiated.

  - [`transmission.delivered_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp`

    When the message was delivered to the recipient. Omitted until delivery is confirmed.

  - [`transmission.email_events`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `array`

    Recorded email delivery events.

    - [`transmission.email_events.bounce_sub_type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      More specific bounce classification, when available.

    - [`transmission.email_events.bounce_type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Bounce classification, when available.

    - [`transmission.email_events.complaint_sub_type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      More specific complaint classification, when available.

    - [`transmission.email_events.id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Unique event identifier.

    - [`transmission.email_events.occurred_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp` — required

      When the delivery event occurred.

    - [`transmission.email_events.provider`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Delivery service that reported the event.

    - [`transmission.email_events.provider_message_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Message identifier reported with the event.

    - [`transmission.email_events.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Human-readable event reason, when available.

    - [`transmission.email_events.reason_code`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Machine-readable event reason, when available.

    - [`transmission.email_events.recipient`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Recipient reported with the event, when available.

    - [`transmission.email_events.source`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

      Source of the event, when available.

    - [`transmission.email_events.suppress_recipient`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `boolean`

      Whether future delivery to the recipient should be suppressed.

    - [`transmission.email_events.temporary`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `boolean`

      Whether the reported condition is temporary.

    - [`transmission.email_events.type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

      Delivery event type.

  - [`transmission.email_failure_code`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Email failure code. Omitted unless one is recorded.

  - [`transmission.email_failure_reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Human-readable email failure reason. Omitted unless one is recorded.

  - [`transmission.email_status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Current email-specific delivery outcome. Omitted for non-email transmissions or until one is recorded.

  - [`transmission.error`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Transmission error. Omitted unless an error is recorded.

  - [`transmission.failed_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp`

    When the transmission failed. Omitted unless status is `'failed'`.

  - [`transmission.gateway`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

    Delivery service selected for this transmission.

  - [`transmission.gateway_message_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Message identifier returned by the delivery service. Omitted until one is available.

  - [`transmission.id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

    Transmission identifier.

  - [`transmission.initialized_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp` — required

    When this transmission was initialized.

  - [`transmission.last_email_event_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp`

    When the latest recorded email event occurred. Omitted until an event is recorded.

  - [`transmission.mechanism`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum` — required

    Transmission mechanism: [`Inttegro::Chime::Transport::SMS`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#SMS-constant) or [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant).

  - [`transmission.sent_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp`

    When the message was handed off for delivery. Omitted until it is sent.

  - [`transmission.sent_via`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `enum`

    Delivery transport used— [`Inttegro::Chime::Transport::SMS`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#SMS-constant) or [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant).

  - [`transmission.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string` — required

    Current transmission status— `'initialized'`, `'sent'`, `'delivered'`, or `'failed'`.

  - [`transmission.suppressed_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `timestamp`

    When delivery to the email recipient was suppressed. Omitted unless suppressed.

  - [`transmission.suppression_reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime.html) — `string`

    Reason delivery to the email recipient was suppressed. Omitted unless suppressed.

## Send chime

Send one notification immediately. You can address it directly with a phone number or email address, or point to a saved customer and let Inttegro use that customer's phone number or email address.

> Mcp Endpoint Tools is interactive content. Use the canonical page to view it.

### Rules

- Send either SMS or email in one request. SMS uses `full_message` or an SMS `message_template`; email uses `email` or an email `message_template`.
- Address a saved customer with `recipient.customer_id` and `recipient.transport`, or provide an inline phone number or email address. Do not combine the two recipient shapes.
- Inline email content requires `email.subject`, `email.text`, and `email.from.address`. HTML and custom headers are checked before delivery.
- A stored template must be published for the same channel as the recipient.

### Required attributes

- `recipient` — required — wire-only

  Where to send the message.

  - `recipient.customer_id` — `string` — required — wire-only

    Required for saved-customer recipients. Pair this with `recipient.transport`.

  - `recipient.email` — `object` — required — wire-only

    Required when `recipient.type` is [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant).

    - `recipient.email.address` — `string` — required — wire-only

      Email address to notify.

  - `recipient.name` — `string` — wire-only

    Optional recipient name for inline recipients.

  - `recipient.phone` — `object` — required — wire-only

    Required when `recipient.type` is [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant).

    - `recipient.phone.number` — `string` — required — wire-only

      Phone number to notify.

  - `recipient.transport` — `enum` — required — wire-only

    Required for saved-customer recipients. Use [`Inttegro::Chime::Transport::SMS`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#SMS-constant) to send to the customer's phone number or [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant) to send to the customer's email address.

  - `recipient.type` — `enum` — required — wire-only

    Required for inline recipients. Use [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant) or [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant).

### Optional attributes

- `custom_data` — `object` — wire-only

  Your own key-value string pairs for tracking and reconciliation.

- `full_message` — `string` — wire-only

  Complete SMS message content to send. Use this only for phone/SMS
  recipients when you are not using `message_template`.

- `message_template` — wire-only

  Stored template reference. Use this instead of full\_message for SMS recipients, or instead of email for email recipients.

  - `message_template.template_id` — `string` — required — wire-only

    ID of a published stored template. The template channel must match the resolved recipient transport.

  - `message_template.variables` — `object` — wire-only

    Values for the template variables. Required variables must be present and valid for their declared types.

- `purpose` — `string` — wire-only

  Optional category for this notification, such as
  `'receipt'`, `'notification'`,
  `'marketing'`, or `'reminder'`.

- `request_meta` — wire-only

  Request-specific controls that do not change the notification.

  - `request_meta.idempotency_key` — `string` — wire-only

    Optional request key.

- `sender_id` — `string` — wire-only

  SMS sender identifier. If omitted, Inttegro uses your default sender. For
  email, configure the sender with `email.from`.

### Email attributes

- `email` — wire-only

  Inline email content. Required for email recipients unless you use message\_template.

  - `email.from` — `object` — required — wire-only

    Mailbox shown in the email From field.

    - `email.from.address` — `string` — required — wire-only

      Allowed sender email address.

    - `email.from.name` — `string` — wire-only

      Optional sender display name.

  - `email.headers` — `object` — wire-only

    Additional email headers validated before delivery.

  - `email.html` — `string` — wire-only

    Optional HTML body checked before delivery.

  - `email.reply_to` — `string` — wire-only

    Optional reply-to email address.

  - `email.subject` — `string` — required — wire-only

    Email subject.

  - `email.text` — `string` — required — wire-only

    Plain-text body.

To send a Chime to a saved customer, pass
`recipient.customer_id` and choose which contact method
to use:

```json
{
  "recipient": {
    "customer_id": "cu_abc123def456",
    "transport": "sms"
  },
  "full_message": "Your order has shipped."
}
```

To send email to an inline address, set
`recipient.type` to [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant)  and include the top-level `email` object:

```json
{
  "recipient": {
    "type": "email",
    "email": {
      "address": "gloria@example.com"
    },
    "name": "Gloria Kesewaa"
  },
  "email": {
    "subject": "Your receipt from YourBrand",
    "text": "Your receipt is ready. View it at https://yourbrand.example/receipts/or_123.",
    "html": "<p>Your receipt is ready. <a href=\"https://yourbrand.example/receipts/or_123\">View receipt</a>.</p>",
    "from": {
      "name": "YourBrand",
      "address": "receipts@yourbrand.example"
    }
  },
  "purpose": "receipt"
}
```

To send with a stored template, use the generated template ID and keep
variables inside the `message_template` object:

```json
{
  "recipient": {
    "customer_id": "cu_abc123def456",
    "transport": "sms"
  },
  "message_template": {
    "template_id": "mtpl_WkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYU",
    "variables": {
      "order_number": "OR-12345",
      "tracking_url": "https://track.example.com/OR-12345"
    }
  }
}
```

The examples below use the saved-customer shape. To address someone
directly instead, replace `recipient.transport` and
`recipient.customer_id` with
`recipient.type` and the matching inline phone or email
details.

**Request — POST /chimes/send**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.chimes.send(
  request_meta: {
    idempotency_key: "chime_ship_or_abc123",
  },
  recipient: {
    customer_id: "cu_abc123def456",
    transport: "sms",
  },
  full_message: "Your order #OR-12345 has been shipped and will arrive in 2-3 business days.",
  sender_id: "YourBrand",
  purpose: "shipping_update",
  custom_data: {
    order_id: "or_abc123",
    fulfillment_id: "ffl_xyz789",
  }
)
```

```json
{
  "chime": {
    "id": "ch_WkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYU",
    "customer_id": "cu_abc123def456",
    "created_at": "2030-12-10T10:30:00Z",
    "full_message": "Your order #OR-12345 has been shipped and will arrive in 2-3 business days. Track at: https://track.example.com/OR-12345",
    "recipient": {
      "type": "phone",
      "phone": {
        "number": "+233544998605"
      },
      "name": "Gloria Kesewaa"
    },
    "sender_id": "YourBrand",
    "purpose": "shipping_update",
    "custom_data": {
      "order_id": "or_abc123",
      "fulfillment_id": "ffl_xyz789"
    },
    "transmission": {
      "address": "+233544998605",
      "created_at": "2030-12-10T10:30:00Z",
      "gateway": "configured_gateway",
      "id": "GvYUWkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGv",
      "initialized_at": "2030-12-10T10:30:00Z",
      "mechanism": "sms",
      "sent_at": "2030-12-10T10:30:05Z",
      "sent_via": "sms",
      "status": "sent"
    }
  }
}
```

## Lookup chime

Retrieve one Chime to see what was sent and whether it was delivered. This is useful when answering delivery questions or matching a notification to your own records.

> Mcp Endpoint Tools is interactive content. Use the canonical page to view it.

### Required attributes

- `chime_id` — `string` — required — wire-only

  Unique identifier of the Chime to retrieve.

**Request — POST /chimes/lookup**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.chimes.lookup(chime_id: "ch_WkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYU")
```

```json
{
  "chime": {
    "id": "ch_WkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYU",
    "created_at": "2030-12-10T10:30:00Z",
    "full_message": "Your order #OR-12345 has been shipped and will arrive in 2-3 business days. Track at: https://track.example.com/OR-12345",
    "recipient": {
      "type": "phone",
      "phone": {
        "number": "+233544998605"
      },
      "name": "John Doe"
    },
    "sender_id": "YourBrand",
    "purpose": "shipping_update",
    "custom_data": {
      "order_id": "or_abc123",
      "fulfillment_id": "ffl_xyz789"
    },
    "transmission": {
      "address": "+233544998605",
      "created_at": "2030-12-10T10:30:00Z",
      "delivered_at": "2030-12-10T10:30:15Z",
      "gateway": "configured_gateway",
      "id": "GvYUWkPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGv",
      "initialized_at": "2030-12-10T10:30:00Z",
      "mechanism": "sms",
      "sent_at": "2030-12-10T10:30:05Z",
      "sent_via": "sms",
      "status": "delivered"
    }
  }
}
```

## Page chimes

Browse sent Chimes, newest first. Filter by customer or exact phone number or email address to review one recipient's notification history.

> Mcp Endpoint Tools is interactive content. Use the canonical page to view it.

### Optional attributes

- `customer_id` — `string` — wire-only

  Restrict the page to Chimes associated with this customer.

- `page_number` — `integer` — wire-only

  1-based page index to fetch. Defaults to `1` and must
  stay between `1` and `10`.

- `page_size` — `integer` — wire-only

  Number of Chimes to return. Defaults to `256` and
  must stay between `1` and
  `256`.

- `recipient` — `string` — wire-only

  Restrict the page to Chimes whose recipient exactly matches this phone number or email address.

You can filter by `recipient`,
`customer_id`, both, or neither.

The response [`page.size`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ChimePage.html) is the number of Chimes
actually returned in [`page.chimes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ChimePage.html), not the requested
page capacity.

**Request — POST /chimes/page**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.chimes.page(
  page_number: 1,
  page_size: 25,
  customer_id: "cu_abc123def456"
)
```

## Schedule chime

Schedule one or more notifications for a future time. Every recipient in a schedule must use the same channel, so create separate schedules for SMS and email.

### Rules

- `send_after` must be in the future.
- Use one content source: `full_message` or an SMS template for SMS; `email` or an email template for email.
- Address each recipient as a saved customer or an inline contact, using the same shapes as [Send chime](#send-chime).

### Required attributes

- `recipients` — `array<object>` — required — wire-only

  One or more recipients. Each item uses one of the recipient shapes below.

  - `recipients.customer_id` — `string` — required — wire-only

    Required for a saved-customer recipient. Pair with `recipients[].transport`.

  - `recipients.email` — `object` — required — wire-only

    Required for an inline email recipient.

    - `recipients.email.address` — `string` — required — wire-only

      Email address to notify.

  - `recipients.name` — `string` — wire-only

    Optional name for an inline recipient.

  - `recipients.phone` — `object` — required — wire-only

    Required for an inline phone recipient.

    - `recipients.phone.number` — `string` — required — wire-only

      Phone number to notify.

  - `recipients.transport` — `enum` — required — wire-only

    Required for a saved-customer recipient: [`Inttegro::Chime::Transport::SMS`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#SMS-constant) or [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant).

  - `recipients.type` — `enum` — required — wire-only

    Required for an inline recipient: [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant) or [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant).

- `send_after` — `timestamp` — required — wire-only

  Earliest time at which processing may begin. Actual dispatch can occur later.

### Optional attributes

- `email` — wire-only

  Inline email content. Required for email recipients unless you use message\_template.

  - `email.from` — `object` — required — wire-only

    Mailbox shown in the email From field.

    - `email.from.address` — `string` — required — wire-only

      Allowed sender email address.

    - `email.from.name` — `string` — wire-only

      Optional sender display name.

  - `email.headers` — `object` — wire-only

    Additional email headers validated before delivery.

  - `email.html` — `string` — wire-only

    Optional HTML body checked before delivery.

  - `email.reply_to` — `string` — wire-only

    Optional reply-to email address.

  - `email.subject` — `string` — required — wire-only

    Email subject.

  - `email.text` — `string` — required — wire-only

    Plain-text body.

- `full_message` — `string` — wire-only

  Complete SMS message content to send when the scheduled time arrives.
  Use this only for SMS schedules when you are not using
  `message_template`.

- `message_template` — wire-only

  Stored template reference. Use this instead of full\_message for SMS schedules, or instead of email for email schedules.

  - `message_template.template_id` — `string` — required — wire-only

    ID of a published stored template. The template channel must match the resolved recipient transport.

  - `message_template.variables` — `object` — wire-only

    Values for the template variables. Required variables must be present and valid for their declared types.

- `purpose` — `string` — wire-only

  Optional category for this scheduled notification.

- `request_meta` — wire-only

  Request-specific controls that do not change the scheduled notification.

  - `request_meta.idempotency_key` — `string` — wire-only

    Optional request key.

- `sender_id` — `string` — wire-only

  SMS sender identifier. If omitted, Inttegro uses your default sender. For
  email, configure the sender with `email.from`.

### Response attributes

- [`created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `timestamp` — required

  When the schedule was created.

- [`customer_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `array`

  Saved customer IDs resolved for this schedule. Omitted when none were used.

- [`email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html)

  Validated email content. Omitted for SMS schedules.

  - [`email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

    Mailbox shown in the email From field.

    - [`email.from.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Sender email address.

    - [`email.from.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Optional sender display name.

  - [`email.headers`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

    Validated email headers.

  - [`email.html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string|null`

    HTML body.

  - [`email.reply_to`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

    Mailbox that receives replies.

    - [`email.reply_to.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Reply-to email address.

    - [`email.reply_to.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Optional reply-to display name.

  - [`email.safety`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

    Email content safety result.

    - [`email.safety.content_hash`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Hash of the scanned content.

    - [`email.safety.links`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `array`

      Links found by the scan.

      - [`email.safety.links.host`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

        Host name, when present.

      - [`email.safety.links.raw`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

        Link as it appeared in the message.

      - [`email.safety.links.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

        Reason for the link decision, when available.

      - [`email.safety.links.scheme`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

        URL scheme.

      - [`email.safety.links.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `enum`

        [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

    - [`email.safety.normalized_text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Normalized text used by the scan.

    - [`email.safety.quarantine_notes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string|null`

      Quarantine context, when available.

    - [`email.safety.reason_codes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `array`

      Reasons for a non-allowed result.

    - [`email.safety.sanitized_html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string|null`

      Sanitized HTML, when available.

    - [`email.safety.scanner`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

      Scanner that produced the result.

    - [`email.safety.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `enum`

      [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

  - [`email.schema`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

    Generated Schema.org markup.

    - [`email.schema.json_ld`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `object`

      Generated JSON-LD.

    - [`email.schema.kind`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `enum`

      Generated markup kind.

  - [`email.subject`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

    Email subject.

  - [`email.text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

    Plain-text email body.

- [`executed_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `timestamp`

  When execution began. Omitted until execution.

- [`full_message`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string` — required

  Rendered SMS content. Empty for email schedules.

- [`id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string` — required

  Schedule ID used with the schedule lookup and cancellation endpoints.

- [`idempotency_key`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

  Request key associated with the schedule.

- [`purpose`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string`

  Optional message category. Omitted when it was not provided.

- [`recipients`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `array`

  Resolved destination addresses.

- [`send_after`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `timestamp` — required

  Earliest requested delivery time.

- [`sender_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html) — `string` — required

  SMS sender selected for the scheduled messages. For email, see
  [`scheduled_chime.email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCreationDetail.html).

To schedule for saved customers, include recipients with
`recipients[].customer_id` and
`recipients[].transport`:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "sms" },
    { "customer_id": "cu_def456ghi789", "transport": "sms" }
  ],
  "full_message": "Reminder: Your appointment starts tomorrow at 10 AM.",
  "send_after": "2030-12-15T10:00:00Z",
  "request_meta": {
    "idempotency_key": "sched_appointment_cu_abc123_2025_12_15"
  }
}
```

To schedule email for saved customers, set
`recipients[].transport` to [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant)  and provide the top-level `email` object:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "email" },
    { "customer_id": "cu_def456ghi789", "transport": "email" }
  ],
  "email": {
    "subject": "Your subscription renews tomorrow",
    "text": "Your subscription renews tomorrow. Update billing at https://yourbrand.example/billing.",
    "from": {
      "address": "billing@yourbrand.example"
    }
  },
  "send_after": "2030-12-15T10:00:00Z",
  "purpose": "reminder"
}
```

To schedule with a stored template, use the same
`message_template` object shape used by Send chime:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "email" }
  ],
  "message_template": {
    "template_id": "mtpl_emailRenewal123",
    "variables": {
      "customer_name": "Gloria",
      "renewal_date": "2030-12-16"
    }
  },
  "send_after": "2030-12-15T10:00:00Z",
  "purpose": "reminder"
}
```

The examples below mix both recipient shapes in the same request.

**Request — POST /chimes/schedule**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.chimes.schedule(
  recipients: [
    {
      customer_id: "cu_abc123def456",
      transport: "sms",
    },
    {
      type: "phone",
      phone: {
        number: "+233501234567",
      },
      name: "Backup Contact",
    },
  ],
  full_message: "Reminder: Your subscription renews tomorrow. Visit https://example.com/billing to update payment details.",
  send_after: "2030-12-15T09:00:00Z",
  sender_id: "YourBrand",
  purpose: "reminder"
)
```

```json
{
  "scheduled_chime": {
    "id": "sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "created_at": "2030-12-10T14:30:00Z",
    "customer_ids": [
      "cu_abc123def456"
    ],
    "recipients": [
      "+233544998605",
      "+233501234567"
    ],
    "full_message": "Reminder: Your subscription renews tomorrow. Visit https://example.com/billing to update payment details.",
    "sender_id": "YourBrand",
    "purpose": "reminder",
    "send_after": "2030-12-15T09:00:00Z"
  }
}
```

## Lookup a scheduled chime

Check whether a scheduled notification has run. After execution, the response includes the Chime IDs created for successful recipients and any recipient-specific errors.

### Required attributes

- `schedule_id` — `string` — required — wire-only

  The schedule ID returned when you created the scheduled Chime. Example:
  `sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk`.

### Response attributes

- [`chime_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array`

  IDs created when the schedule executes. Omitted when there are no
  created Chimes.

- [`content`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string` — required

  Rendered SMS content. Empty for email schedules.

- [`created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `timestamp` — required

  When the schedule was created.

- [`customer_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array`

  Saved customer IDs resolved for this schedule. Omitted when none were used.

- [`email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html)

  Validated email content. Omitted for SMS schedules.

  - [`email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

    Mailbox shown in the email From field.

    - [`email.from.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Sender email address.

    - [`email.from.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Optional sender display name.

  - [`email.headers`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

    Validated email headers.

  - [`email.html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string|null`

    HTML body.

  - [`email.reply_to`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

    Mailbox that receives replies.

    - [`email.reply_to.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Reply-to email address.

    - [`email.reply_to.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Optional reply-to display name.

  - [`email.safety`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

    Email content safety result.

    - [`email.safety.content_hash`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Hash of the scanned content.

    - [`email.safety.links`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array`

      Links found by the scan.

      - [`email.safety.links.host`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

        Host name, when present.

      - [`email.safety.links.raw`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

        Link as it appeared in the message.

      - [`email.safety.links.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

        Reason for the link decision, when available.

      - [`email.safety.links.scheme`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

        URL scheme.

      - [`email.safety.links.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `enum`

        [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

    - [`email.safety.normalized_text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Normalized text used by the scan.

    - [`email.safety.quarantine_notes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string|null`

      Quarantine context, when available.

    - [`email.safety.reason_codes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array`

      Reasons for a non-allowed result.

    - [`email.safety.sanitized_html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string|null`

      Sanitized HTML, when available.

    - [`email.safety.scanner`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

      Scanner that produced the result.

    - [`email.safety.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `enum`

      [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

  - [`email.schema`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

    Generated Schema.org markup.

    - [`email.schema.json_ld`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `object`

      Generated JSON-LD.

    - [`email.schema.kind`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `enum`

      Generated markup kind.

  - [`email.subject`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

    Email subject.

  - [`email.text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

    Plain-text email body.

- [`errors`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array<object>`

  Per-recipient execution errors. Omitted when there are no errors.

  - [`errors.fix_code`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

    Suggested remediation code.

  - [`errors.recipient`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

    Recipient that could not be processed.

  - [`errors.type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

    Error classification.

- [`executed_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `timestamp`

  When execution began. Omitted until execution.

- [`id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string` — required

  Unique schedule identifier.

- [`idempotency_key`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

  Request key associated with the schedule.

- [`purpose`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string`

  Optional message category. Omitted when it was not provided.

- [`recipients`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `array` — required

  Resolved destination addresses.

- [`send_after`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `timestamp` — required

  Earliest requested delivery time.

- [`sender_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html) — `string` — required

  SMS sender selected for the scheduled messages. For email, see
  [`scheduled_chime.email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleDetail.html).

**Request — POST /schedules/lookup**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.schedules.lookup(schedule_id: "sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk")
```

```json
{
  "scheduled_chime": {
    "id": "sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "recipients": [
      "+233544998605",
      "+233501234567",
      "+233509999999"
    ],
    "content": "Reminder: Your subscription renews tomorrow. Visit https://example.com/billing to update payment details.",
    "sender_id": "YourBrand",
    "purpose": "reminder",
    "send_after": "2030-12-15T09:00:00Z",
    "created_at": "2030-12-10T14:30:00Z",
    "executed_at": "2030-12-15T09:00:03Z",
    "chime_ids": [
      "ch_abc123xyz",
      "ch_def456uvw"
    ],
    "errors": [
      {
        "recipient": "missing@example.com",
        "type": "invalid_email_address",
        "fix_code": "provide_valid_email"
      }
    ]
  }
}
```

## Cancel a scheduled chime

Stop a scheduled notification before delivery begins. Cancel it before
[`scheduled_chime.send_after`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCancelDetail.html); once execution starts,
some or all messages may already be on their way.

### Required attributes

- `schedule_id` — `string` — required — wire-only

  The schedule ID to cancel. The schedule must not be completed or already canceled.

A successful response returns the same schedule lifecycle fields as
[Lookup a scheduled chime](#lookup-a-scheduled-chime), plus
[`scheduled_chime.canceled_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/ScheduleCancelDetail.html) with the recorded
cancellation time.

**Request — POST /schedules/cancel**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.schedules.cancel(schedule_id: "sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk")
```

```json
{
  "scheduled_chime": {
    "id": "sch_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "customer_ids": [
      "cu_abc123def456"
    ],
    "recipients": [
      "+233544998605",
      "+233501234567"
    ],
    "content": "Reminder: Your subscription renews tomorrow. Visit https://example.com/billing to update payment details.",
    "sender_id": "YourBrand",
    "purpose": "reminder",
    "send_after": "2030-12-15T09:00:00Z",
    "created_at": "2030-12-10T14:30:00Z",
    "canceled_at": "2030-12-14T16:45:00Z"
  }
}
```

## Broadcast chimes

Send one message to many recipients. The response confirms that Inttegro accepted the broadcast, not that every recipient has received a Chime; use [Lookup a broadcast](#lookup-a-broadcast) to follow its progress.

### Rules

- All recipients must use the same channel. Create separate broadcasts for SMS and email.
- SMS uses raw text or a published SMS template. Email uses inline `email` content or a published email template.
- Address each recipient as a saved customer or an inline contact, using the same shapes as [Send chime](#send-chime).
- Each recipient receives a separate Chime, so delivery can be tracked individually.
- Provide `sender` when you do not want it to be empty; broadcasts do not apply a default sender.

### Required attributes

- `recipients` — `array<object>` — required — wire-only

  One or more recipients. Each item uses one of the recipient shapes below.

  - `recipients.customer_id` — `string` — required — wire-only

    Required for a saved-customer recipient. Pair with `recipients[].transport`.

  - `recipients.email` — `object` — required — wire-only

    Required for an inline email recipient.

    - `recipients.email.address` — `string` — required — wire-only

      Email address to notify.

  - `recipients.name` — `string` — wire-only

    Optional name for an inline recipient.

  - `recipients.phone` — `object` — required — wire-only

    Required for an inline phone recipient.

    - `recipients.phone.number` — `string` — required — wire-only

      Phone number to notify.

  - `recipients.transport` — `enum` — required — wire-only

    Required for a saved-customer recipient: [`Inttegro::Chime::Transport::SMS`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#SMS-constant) or [`Inttegro::Chime::Transport::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/Transport.html#EMAIL-constant).

  - `recipients.type` — `enum` — required — wire-only

    Required for an inline recipient: [`Inttegro::Chime::RecipientType::PHONE`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#PHONE-constant) or [`Inttegro::Chime::RecipientType::EMAIL`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Chime/RecipientType.html#EMAIL-constant).

### Optional attributes

- `email` — wire-only

  Inline email content. Required for email recipients unless you use message\_template.

  - `email.from` — `object` — required — wire-only

    Mailbox shown in the email From field.

    - `email.from.address` — `string` — required — wire-only

      Allowed sender email address.

    - `email.from.name` — `string` — wire-only

      Optional sender display name.

  - `email.headers` — `object` — wire-only

    Additional email headers validated before delivery.

  - `email.html` — `string` — wire-only

    Optional HTML body checked before delivery.

  - `email.reply_to` — `string` — wire-only

    Optional reply-to email address.

  - `email.subject` — `string` — required — wire-only

    Email subject.

  - `email.text` — `string` — required — wire-only

    Plain-text body.

- `message_template` — wire-only

  SMS content or stored template reference.

  - `message_template.template_id` — `string` — required — wire-only

    ID of a published stored template. SMS broadcasts require an SMS template; email broadcasts require an email template.

  - `message_template.variables` — `object` — wire-only

    Values for the template variables. Required variables must be present and valid for their declared types.

- `purpose` — `string` — wire-only

  Optional category for this broadcast.

- `request_meta` — wire-only

  Request-specific controls that do not change the broadcast audience or content.

  - `request_meta.idempotency_key` — `string` — wire-only

    Optional request key.

- `sender` — `string` — wire-only

  SMS sender identifier. Strongly recommended because broadcasts do not
  apply a default. For email, configure the sender with
  `email.from`.

### Response attributes

- [`content`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string` — required

  Rendered SMS content. Empty for email broadcasts.

- [`created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `timestamp` — required

  When the broadcast was created.

- [`customer_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `array`

  Saved customer IDs resolved for this broadcast. Omitted when none were used.

- [`email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html)

  Validated email content. Omitted for SMS broadcasts.

  - [`email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

    Mailbox shown in the email From field.

    - [`email.from.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Sender email address.

    - [`email.from.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Optional sender display name.

  - [`email.headers`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

    Validated email headers.

  - [`email.html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string|null`

    HTML body.

  - [`email.reply_to`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

    Mailbox that receives replies.

    - [`email.reply_to.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Reply-to email address.

    - [`email.reply_to.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Optional reply-to display name.

  - [`email.safety`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

    Email content safety result.

    - [`email.safety.content_hash`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Hash of the scanned content.

    - [`email.safety.links`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `array`

      Links found by the scan.

      - [`email.safety.links.host`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

        Host name, when present.

      - [`email.safety.links.raw`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

        Link as it appeared in the message.

      - [`email.safety.links.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

        Reason for the link decision, when available.

      - [`email.safety.links.scheme`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

        URL scheme.

      - [`email.safety.links.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `enum`

        [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

    - [`email.safety.normalized_text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Normalized text used by the scan.

    - [`email.safety.quarantine_notes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string|null`

      Quarantine context, when available.

    - [`email.safety.reason_codes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `array`

      Reasons for a non-allowed result.

    - [`email.safety.sanitized_html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string|null`

      Sanitized HTML, when available.

    - [`email.safety.scanner`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

      Scanner that produced the result.

    - [`email.safety.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `enum`

      [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

  - [`email.schema`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

    Generated Schema.org markup.

    - [`email.schema.json_ld`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `object`

      Generated JSON-LD.

    - [`email.schema.kind`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `enum`

      Generated markup kind.

  - [`email.subject`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

    Email subject.

  - [`email.text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

    Plain-text email body.

- [`id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string` — required

  Broadcast ID used with the broadcast lookup and cancellation endpoints.

- [`idempotency_key`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

  Request key associated with the broadcast.

- [`purpose`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string`

  Optional message category. Omitted when it was not provided.

- [`recipients`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `array` — required

  Resolved destination addresses.

- [`send_after`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `timestamp` — required

  Time at which asynchronous processing was queued.

- [`sender_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html) — `string` — required

  SMS sender selected for the broadcast messages. For email, see
  [`broadcast.email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCreationDetail.html).

For SMS broadcasts, `message_template` may be a raw SMS
string for legacy inline content or an object with
`message_template.template_id` and
`message_template.variables` for stored templates. For
email broadcasts, `message_template` must be an object;
raw string content is SMS-only.

To broadcast to saved customers, include recipients with
`recipients[].customer_id` and
`recipients[].transport`:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "email" },
    { "customer_id": "cu_def456ghi789", "transport": "email" }
  ],
  "email": {
    "subject": "Your order has shipped",
    "text": "Your order has shipped. Track it at https://track.shop.example/abc123.",
    "from": {
      "address": "shipping@shop.example"
    }
  },
  "sender": "ShopBrand",
  "request_meta": {
    "idempotency_key": "broadcast_shipping_2025_12_15"
  }
}
```

To broadcast an email-only campaign, use email recipients and provide the
top-level `email` object:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "email" },
    {
      "type": "email",
      "email": {
        "address": "fallback@example.com"
      },
      "name": "Backup Contact"
    }
  ],
  "email": {
    "subject": "Your order has shipped",
    "text": "Your order #12345 has shipped. Track it at https://track.shop.example/abc123.",
    "from": {
      "address": "shipping@shop.example"
    }
  },
  "sender": "ShopBrand",
  "purpose": "order_notification"
}
```

To broadcast with a stored template, pass
`message_template` as an object:

```json
{
  "recipients": [
    { "customer_id": "cu_abc123def456", "transport": "email" },
    { "customer_id": "cu_def456ghi789", "transport": "email" }
  ],
  "message_template": {
    "template_id": "mtpl_emailShipping123",
    "variables": {
      "order_number": "OR-12345",
      "tracking_url": "https://track.shop.example/OR-12345"
    }
  },
  "sender": "ShopBrand",
  "purpose": "order_notification"
}
```

The examples below mix both recipient shapes in the same request.

**Request — POST /chimes/broadcast**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.chimes.broadcast(
  recipients: [
    {
      customer_id: "cu_abc123def456",
      transport: "email",
    },
    {
      type: "email",
      email: {
        address: "fallback@example.com",
      },
      name: "Backup Contact",
    },
  ],
  email: {
    subject: "Your order #12345 has shipped",
    text: "Your order #12345 has shipped. Track it at https://track.shop.com/abc123.",
    from: {
      address: "shipping@shop.example",
    },
  },
  sender: "ShopName",
  purpose: "order_notification"
)
```

```json
{
  "broadcast": {
    "id": "brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "content": "Your order #12345 has shipped. Track it at https://track.shop.com/abc123.",
    "customer_ids": [
      "cu_abc123def456"
    ],
    "recipients": [
      "customer@example.com",
      "fallback@example.com"
    ],
    "email": {
      "subject": "Your order #12345 has shipped",
      "text": "Your order #12345 has shipped. Track it at https://track.shop.com/abc123.",
      "from": {
        "address": "shipping@shop.example"
      }
    },
    "sender_id": "ShopName",
    "purpose": "order_notification",
    "send_after": "2030-12-15T09:00:00Z",
    "created_at": "2030-12-15T09:00:00Z"
  }
}
```

## Lookup a broadcast

Check a broadcast's progress. The response lists the Chimes created for successful recipients and any recipient-specific errors.

### Required attributes

- `broadcast_id` — `string` — required — wire-only

  The broadcast ID returned when you created the broadcast. Example:
  `brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk`.

### Response attributes

- [`chime_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array`

  IDs created when the broadcast executes. Omitted when there are no
  created Chimes.

- [`content`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string` — required

  Rendered SMS content. Empty for email broadcasts.

- [`created_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `timestamp` — required

  When the broadcast was created.

- [`customer_ids`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array`

  Saved customer IDs resolved for this broadcast. Omitted when none were used.

- [`email`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html)

  Validated email content. Omitted for SMS broadcasts.

  - [`email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

    Mailbox shown in the email From field.

    - [`email.from.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Sender email address.

    - [`email.from.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Optional sender display name.

  - [`email.headers`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

    Validated email headers.

  - [`email.html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string|null`

    HTML body.

  - [`email.reply_to`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

    Mailbox that receives replies.

    - [`email.reply_to.address`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Reply-to email address.

    - [`email.reply_to.name`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Optional reply-to display name.

  - [`email.safety`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

    Email content safety result.

    - [`email.safety.content_hash`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Hash of the scanned content.

    - [`email.safety.links`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array`

      Links found by the scan.

      - [`email.safety.links.host`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

        Host name, when present.

      - [`email.safety.links.raw`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

        Link as it appeared in the message.

      - [`email.safety.links.reason`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

        Reason for the link decision, when available.

      - [`email.safety.links.scheme`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

        URL scheme.

      - [`email.safety.links.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `enum`

        [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

    - [`email.safety.normalized_text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Normalized text used by the scan.

    - [`email.safety.quarantine_notes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string|null`

      Quarantine context, when available.

    - [`email.safety.reason_codes`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array`

      Reasons for a non-allowed result.

    - [`email.safety.sanitized_html`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string|null`

      Sanitized HTML, when available.

    - [`email.safety.scanner`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

      Scanner that produced the result.

    - [`email.safety.status`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `enum`

      [`Inttegro::Shared::ContentSafetyStatus::ALLOWED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#ALLOWED-constant), [`Inttegro::Shared::ContentSafetyStatus::REJECTED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#REJECTED-constant), or [`Inttegro::Shared::ContentSafetyStatus::QUARANTINED`](https://ruby.inttegro.dev/v10.0.0/Inttegro/Shared/ContentSafetyStatus.html#QUARANTINED-constant).

  - [`email.schema`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

    Generated Schema.org markup.

    - [`email.schema.json_ld`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `object`

      Generated JSON-LD.

    - [`email.schema.kind`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `enum`

      Generated markup kind.

  - [`email.subject`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

    Email subject.

  - [`email.text`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

    Plain-text email body.

- [`errors`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array<object>`

  Per-recipient execution errors. Omitted when there are no errors.

  - [`errors.fix_code`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

    Suggested remediation code.

  - [`errors.recipient`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

    Recipient that could not be processed.

  - [`errors.type`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

    Error classification.

- [`executed_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `timestamp`

  When execution began. Omitted until execution.

- [`id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string` — required

  Unique broadcast identifier.

- [`idempotency_key`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

  Request key associated with the broadcast.

- [`purpose`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string`

  Optional message category. Omitted when it was not provided.

- [`recipients`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `array` — required

  Resolved destination addresses.

- [`send_after`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `timestamp` — required

  Time at which asynchronous processing was queued.

- [`sender_id`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html) — `string` — required

  SMS sender selected for the broadcast messages. For email, see
  [`broadcast.email.from`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastDetail.html).

**Request — POST /broadcasts/lookup**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.broadcasts.lookup(broadcast_id: "brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk")
```

```json
{
  "broadcast": {
    "id": "brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "customer_ids": [
      "cu_abc123def456"
    ],
    "recipients": [
      "customer@example.com",
      "fallback@example.com",
      "missing@example.com"
    ],
    "content": "Your order #12345 has shipped! Track: https://track.shop.com/abc123",
    "sender_id": "ShopName",
    "purpose": "order_notification",
    "send_after": "2030-12-15T09:00:00Z",
    "created_at": "2030-12-15T09:00:00Z",
    "executed_at": "2030-12-15T09:00:03Z",
    "chime_ids": [
      "ch_abc123xyz",
      "ch_def456uvw"
    ],
    "errors": [
      {
        "recipient": "missing@example.com",
        "type": "invalid_email_address",
        "fix_code": "provide_valid_email"
      }
    ]
  }
}
```

## Cancel a broadcast

Stop a broadcast that has not finished processing. Because delivery begins asynchronously, cancel as soon as possible; some recipients may already have received their Chimes.

### Required attributes

- `broadcast_id` — `string` — required — wire-only

  The broadcast ID to cancel. The broadcast must not be completed or already canceled.

A successful response returns the same broadcast lifecycle fields as
[Lookup a broadcast](#lookup-a-broadcast), plus
[`broadcast.canceled_at`](https://ruby.inttegro.dev/v10.0.0/Inttegro/BroadcastCancelDetail.html) with the recorded cancellation
time.

**Request — POST /broadcasts/cancel**

```ruby
require "inttegro"

client = Inttegro::Client.new(api_key: ENV.fetch("INTTEGRO_API_KEY"))
result = client.broadcasts.cancel(broadcast_id: "brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk")
```

```json
{
  "broadcast": {
    "id": "brc_kPvqTrqGsopu07wfC7ttoWqmfwt48ZW7BGvYUWk",
    "recipients": [
      "+233544998605",
      "+233501234567"
    ],
    "content": "Your order #12345 has shipped! Track: https://track.shop.com/abc123",
    "sender_id": "ShopName",
    "purpose": "order_notification",
    "send_after": "2030-12-15T09:00:00Z",
    "created_at": "2030-12-15T09:00:00Z",
    "canceled_at": "2030-12-15T09:00:02Z"
  }
}
```

## Stored message template references

Chime send, schedule, and broadcast requests can render a stored message template instead of accepting inline content. Use this shape when the content should come from a published reusable template:

```json
{
  "message_template": {
    "template_id": "mtpl_receipt_ready",
    "variables": {
      "customer_name": "Gloria",
      "receipt_url": "https://yourstore.example/receipts/or_123"
    }
  }
}
```

`message_template.template_id` must identify a published
template. Supply every required variable using the type defined by that
template. SMS templates can send only to SMS recipients, and email templates
can send only to email recipients.

Provide exactly one content source for the resolved transport. For SMS sends,
use either `full_message` or an SMS
`message_template`. For email sends, use either
`email` or an email `message_template`. Do
not combine SMS content and email content in the same request. Schedules and
broadcasts apply the equivalent rule to their own request types.

Use [Render a message template preview](https://studio.inttegro.com/machine/ruby/api/message-templates.md#render-a-message-template-preview) before sending production campaigns when variable values come from user or catalog data.
