Driftwatch

APIs / Resend

Resend API changes

Breaking changes, deprecations and new fields in the Resend API, as they ship.

Resend · c272fb9a6 breaking7 additive
  • Breaking

    Response field enabled_actions removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    InboxAgent.enabled_actions · reachable from 1 operation
    Code that breaks
    // response.enabled_actions is now undefined
    const enabled_actions = response.enabled_actions;
  • Breaking

    Response field highlights removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    InboxThreadSearchResult.highlights · reachable from 1 operation
    Code that breaks
    // response.highlights is now undefined
    const highlights = response.highlights;
  • Breakingdirection flip: their tools call this safe

    enabled_actions is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    UpdateInboxAgentOptions.enabled_actions · reachable from 1 operation
    Code that breaks
    await client.post("/…", {
      // enabled_actions is now ignored, not rejected
      enabled_actions: value,
    });
  • Breaking

    actions is now required

    Partial payloads are rejected.

    UpdateInboxAgentOptions.actions · reachable from 1 operation
    Code that breaks
    await client.post("/…", {
      // …
      actions: /* now required */,
    });
  • Breakingdirection flip: their tools call this safe

    add_label_ids is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    UpdateInboxThreadOptions.add_label_ids · reachable from 1 operation
    Code that breaks
    await client.post("/…", {
      // add_label_ids is now ignored, not rejected
      add_label_ids: value,
    });
  • Breakingdirection flip: their tools call this safe

    remove_label_ids is no longer accepted

    Usually ignored rather than rejected, so the call succeeds and does something subtly different.

    UpdateInboxThreadOptions.remove_label_ids · reachable from 1 operation
    Code that breaks
    await client.post("/…", {
      // remove_label_ids is now ignored, not rejected
      remove_label_ids: value,
    });
  • Additive

    /inboxes/{inbox_id}/threads/{thread_id}/labels added

    No action needed.

    /inboxes/{inbox_id}/threads/{thread_id}/labels
  • Additive

    /inboxes/{inbox_id}/threads/{thread_id}/labels/{label_id} added

    No action needed.

    /inboxes/{inbox_id}/threads/{thread_id}/labels/{label_id}
  • Additive

    Request property actions added

    No action needed unless it is required.

    UpdateInboxAgentOptions.actions · reachable from 1 operation
4 new response fields
  • Inbox.updated_at
  • InboxAgent.actions
  • ListInboxesResponseSuccess.data[].created_at
  • ListInboxesResponseSuccess.data[].updated_at
Resend · a6d5e1e51 breaking
  • Breakingdirection flip: their tools call this safe

    content_disposition gained response values

    Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

    can now return null

    4 places: GetReceivedEmailResponse.attachments[].content_disposition, ListAttachmentsResponse.data[].content_disposition, ListReceivedEmailsResponse.data[].attachments[].content_disposition, RetrievedAttachment.content_disposition
    Code that breaks
    switch (response.attachments[0].content_disposition) {
      // existing branches …
    
      default:
        throw new Error("unexpected content_disposition");
    }
Resend · 5a16d60b1 breaking2 additive
  • Breaking

    Response field message_count removed

    Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call.

    2 places: InboxThread.message_count, InboxThreadSearchResult.message_count
    Code that breaks
    // response.message_count is now undefined
    const message_count = response.message_count;
2 new response fields
  • InboxThread.email_count
  • InboxThreadSearchResult.email_count
Resend · 74d8d9ab15 additive
Resend · 22ea279e1 breaking2 additive
  • Breakingdirection flip: their tools call this safe

    segment_id is no longer accepted

    No error is raised. The value is ignored and your results change silently, which is the hardest class of break to notice.

    GET /contacts · segment_id
    Code that breaks
    await client.post("/contacts", {
      // segment_id is now ignored, not rejected
      segment_id: value,
    });
  • Additive

    /segments/{id}/contacts added

    No action needed.

    /segments/{id}/contacts
  • Additive

    Response field has_more added

    No action needed unless you validate responses against a closed schema.

    ListContactsResponseSuccess.has_more · reachable from 2 operations
Resend · c48764a21 breaking1 additive
  • Breaking

    segments changed type

    Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage.

    CreateContactOptions.segments[] · reachable from 1 operation
    Code that breaks
    // payload.segments[0]
    // was: string
    // now: object
  • Additive

    Request property id added

    No action needed unless it is required.

    CreateContactOptions.segments[].id · reachable from 1 operation
Resend · 2288869d1 additive
  • Additive

    Response field received_for added

    No action needed unless you validate responses against a closed schema.

    GetReceivedEmailResponse.received_for · reachable from 1 operation