Reschedule a scheduled email
Moves an email sent with a future scheduled_at to a new time, at most 30 days from now, and records an email.rescheduled event. A time that is not in the future sends it within seconds. Rescheduling to the time it already has returns it unchanged. The domain and the suppression list are still checked when it is sent.
bearerAuthAuthorizationBearer <token>A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.
id*stringThe email's id.
Coss-Version?"2026-10-10"The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.
"2026-10-10"application/json- body
scheduled_at*stringThe new time to send the email at (ISO 8601 with an offset, at most 30 days ahead). A time that is not in the future sends it right away.
date-timeThe rescheduled email.
application/json- response
object*"email""email"id*stringfrom*stringto*array<string>cc*array<string>bcc*array<string>reply_to*array<string>subject*stringhtml*string|nulltext*string|nullheaders*tags*array<>category*string|nullstatus*stringWhether the email was handed to the delivery provider. scheduled emails wait for scheduled_at; canceled ones were canceled before that. Per-recipient delivery is in recipients.
"queued""sent""failed""scheduled""canceled"recipients*array<>attachments*array<>Attachment metadata. Content is never returned, and is discarded once sent.
sandbox*booleanTrue when sent from a sandbox environment (never delivered).
tracking*Open and click tracking, as resolved when the email was sent, with engagement so far. Opens can be inflated by mail clients that prefetch images, clicks by link scanners.
created_at*stringdate-timesent_at*|date-timescheduled_at*|When the email was scheduled to be sent; null if it was not.
date-timebatch_id*|The batch that sent the email; null if it was sent on its own.
import { Coss } from "coss";const coss = new Coss({ apiKey: process.env.COSS_API_KEY, baseUrl: "https://api.coss.com",});const { data, error } = await coss.email.reschedule("email_01k7c8m4q2f3e9v6t5r1n0p8yz", { scheduled_at: "2026-10-12T09:00:00Z",});{ "object": "email", "id": "email_01k7c8m4q2f3e9v6t5r1n0p8yz", "from": "Acme <onboarding@acme.com>", "to": [ "user@example.com" ], "cc": [], "bcc": [], "reply_to": [], "subject": "Welcome to Acme", "html": "<p>Thanks for signing up!</p>", "text": null, "headers": {}, "tags": [ { "name": "template", "value": "welcome" } ], "category": "onboarding", "status": "sent", "recipients": [ { "address": "user@example.com", "type": "to", "status": "delivered", "last_event_at": "2026-10-10T12:00:02.000Z" } ], "sandbox": false, "tracking": { "opens": false, "clicks": false, "open_count": 0, "first_opened_at": null, "last_opened_at": null, "click_count": 0, "first_clicked_at": null, "last_clicked_at": null }, "attachments": [], "created_at": "2026-10-10T12:00:00.000Z", "sent_at": "2026-10-10T12:00:01.000Z", "scheduled_at": null, "batch_id": null}List an email's tracked links GET
The links COSS rewrote for click tracking, in the order they appear in the HTML, with their click counts. Empty unless the email was sent with click tracking.
Send a batch of emails POST
Queues up to 100 emails in one request. Each email is handled exactly as by `POST /v1/emails` (sender checks, suppressions, scheduling, attachments, tracking), but the batch is all or nothing: if any email is invalid, or any `from` is not a verified domain (live keys), nothing is stored and the error names the email (e.g. `emails.3.to`). One `Idempotency-Key` covers the whole batch. The emails' recipients are charged against the send quota together, so a batch with more recipients than the quota allows at once is refused (`quota_exceeded` without `Retry-After`): split it. The request body shares the 40 MB limit of a single send.