EmailmoversMyDataHub docs
Browse the docs

Reference

Reference

Webhook events

The 11 webhook event types, with their payloads, generated from the OpenAPI document.

Generated from the contractsView as Markdown

11 event types. Each delivery is a Standard Webhooks request with three headers, webhook-id, webhook-timestamp, webhook-signature, and a JSON body of the shape below. Delivered to your endpoint under Standard Webhooks: verify webhook-signature (HMAC-SHA256 over webhook-id, webhook-timestamp and the body with your whsec_ secret) and treat webhook-id as the idempotency key. Any 2xx acknowledges; anything else is retried over 24 hours with backoff.

Every payload carries id (also the webhook-id header, your idempotency key), type, timestamp, api_version and data. Ignore members you do not know: they may appear in a later MyDataHub-Version.

GET /v1/events replays the last 30 days, oldest first, in the same shape. See Webhooks for signing, retries and verification code.

The example payloads are illustrative. Each is checked against its schema when this page is generated.

Event types

EventFires when
order.readyRecords are available.
order.failedProcessing failed; credits are refunded.
audience.refreshedA saved audience was recounted, with the diff.
credits.lowThe balance crossed the configured threshold.
credits.topped_upA top-up settled.
warranty.replacement_issuedA bounced or job-changed record was replaced, or re-credited.
suppression.createdAn objection reached a record your organisation holds. Suppress it before any send.
push.completedA CRM push finished.
push.partialA CRM push partly finished; retry the failed records.
push.failedA CRM push failed.
connection.expiredA CRM token failed; reconnect in the app.

order.ready

Records are available.

Payload: OrderReadyEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typeorder.readyyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.recordsinteger (0 or more)yes
data.records_urlstring (uri-reference)yesA path on https://mydatahub.emailmovers.com starting /v1/. Resolve it against the origin (RFC 3986), not by appending it to the server URL.
data.receipt_urlstring (uri-reference)yesA path on https://mydatahub.emailmovers.com starting /v1/. Resolve it against the origin (RFC 3986), not by appending it to the server URL.
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "order.ready",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "records": 5000,
    "records_url": "/v1/orders/ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E/records",
    "receipt_url": "/v1/orders/ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E/receipt"
  }
}

order.failed

Processing failed; credits are refunded.

Payload: OrderFailedEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typeorder.failedyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.reasonstringyes
data.credits_refundednumber (0 or more)yesCredits, to one decimal place: whole at 1 credit a record, fractional only where a rule is (0.1 company-only, 1.8 outright, both proposed).
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "order.failed",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "reason": "The audience could not be run.",
    "credits_refunded": 300
  }
}

audience.refreshed

A saved audience was recounted, with the diff.

Payload: AudienceRefreshedEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typeaudience.refreshedyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataAudienceRefreshyesA saved audience recounted on the current dataset version, with the difference.
data.audience_idstringyesFormat: an audience id: aud_ followed by a 26 character ULID in upper case Crockford base32, such as aud_01JB4H2K9V6XN3M9R6T1Y5W8ZA.
data.previousAudienceCountSummary or nullyes
data.currentAudienceCountSummaryyesThe headline numbers of one count of an audience.
data.diffobjectyes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "audience.refreshed",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "audience_id": "aud_01JB4H2K9V6XN3M9R6T1Y5W8ZA",
    "previous": {
      "count_id": "cnt_7K2PQ4MAXN3R6TBY5WDZ",
      "dataset_version": "2026-W39",
      "contacts": 12840,
      "companies": 3115,
      "emailable": 12310,
      "counted_at": "2026-09-26T10:14:00Z"
    },
    "current": {
      "count_id": "cnt_Q3N5X2M7K4P6R2T4V4W6",
      "dataset_version": "2026-W40",
      "contacts": 13054,
      "companies": 3160,
      "emailable": 12520,
      "counted_at": "2026-10-05T06:00:00Z"
    },
    "diff": {
      "contacts": 214,
      "companies": 45,
      "emailable": 210,
      "new_records": 231,
      "removed_records": 17
    }
  }
}

credits.low

The balance crossed the configured threshold.

Payload: CreditsLowEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typecredits.lowyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.balancenumberyes
data.thresholdinteger (0 or more)yes
data.top_up_urlstring (uri)yes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "credits.low",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "balance": 180,
    "threshold": 200,
    "top_up_url": "https://mydatahub.emailmovers.com/billing/top-up"
  }
}

credits.topped_up

A top-up settled.

Payload: CreditsToppedUpEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typecredits.topped_upyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.credits_addedinteger (0 or more)yes
data.balancenumberyes
data.sourceenum: credit_pack, top_up, plan, refund, adjustmentyescredit_pack for credit packs bought by card, top_up for credits bought at the per-contact scale (with or without credit packs), plan for a plan's credits, refund or adjustment.
data.amount_gbp_ex_vatnumber (0 or more) or nullyes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "credits.topped_up",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "credits_added": 40000,
    "balance": 41200,
    "source": "credit_pack",
    "amount_gbp_ex_vat": 1249
  }
}

warranty.replacement_issued

A bounced or job-changed record was replaced, or re-credited.

Payload: WarrantyReplacementEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typewarranty.replacement_issuedyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.retired_record_idstringyesFormat: a contact id: contact_ followed by a 26 character ULID in upper case Crockford base32, such as contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8.
data.replacement_record_idstring or nullyes
data.reasonenum: hard_bounce, job_changeyes
data.credits_refundednumber (0 or more)yesCredits, to one decimal place: whole at 1 credit a record, fractional only where a rule is (0.1 company-only, 1.8 outright, both proposed).
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "warranty.replacement_issued",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "retired_record_id": "contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8",
    "replacement_record_id": null,
    "reason": "hard_bounce",
    "credits_refunded": 1
  }
}

suppression.created

An objection reached a record your organisation holds. Suppress it before any send.

Payload: SuppressionCreatedEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typesuppression.createdyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataSuppressionNoticeyesA record you hold that is now suppressed, as the suppression.created webhook carries it.
data.record_idstringyesFormat: a contact id: contact_ followed by a 26 character ULID in upper case Crockford base32, such as contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8.
data.reasonenum: none, objected_to_emailmovers, objected_to_licensee, deceased, left_companyyes
data.scopeenum: licensee, emailmoversyes
data.suppressed_atstring (date-time)yes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "suppression.created",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "record_id": "contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8",
    "reason": "objected_to_emailmovers",
    "scope": "emailmovers",
    "suppressed_at": "2026-10-01T08:30:00Z"
  }
}

push.completed

A CRM push finished.

Payload: PushCompletedEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typepush.completedyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataPushyesA CRM push or its dry run, such as 4,102 to create and 0 already in your HubSpot.
data.idstringyesFormat: a CRM push id: psh_ followed by a 26 character ULID in upper case Crockford base32, such as psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5.
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.connection_idstringyesFormat: a CRM connection id: conn_ followed by a 26 character ULID in upper case Crockford base32, such as conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G.
data.dry_runbooleanyes
data.statusenum: queued, running, completed, partial, failedyes
data.summaryobjectyes
data.property_grouparray of enum: mydatahub_record_id, licence_expires_at, lawful_basis, article14_status, tps_ctps_screened_at, subscriber_class, suppression_status, compliance_receipt_urlyesThe MyDataHub property group written on every record (CrmPropertyGroup).
data.sampleCrmPropertyGroup or nullyesOn a dry run: the property group the first record would carry.
data.errorsarray of objectyes
data.created_atstring (date-time)yes
data.completed_atstring (date-time) or nullyes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "push.completed",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "id": "psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5",
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "connection_id": "conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G",
    "dry_run": false,
    "status": "completed",
    "summary": {
      "to_create": 4102,
      "to_update": 0,
      "already_present": 0,
      "skipped": 0,
      "failed": 0
    },
    "property_group": [
      "mydatahub_record_id",
      "licence_expires_at",
      "lawful_basis",
      "article14_status",
      "tps_ctps_screened_at",
      "subscriber_class",
      "suppression_status",
      "compliance_receipt_url"
    ],
    "sample": {
      "mydatahub_record_id": "contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8",
      "licence_expires_at": "2027-09-26",
      "lawful_basis": "legitimate_interests_art6_1_f",
      "article14_status": "notified",
      "tps_ctps_screened_at": "2026-09-12",
      "subscriber_class": "ltd",
      "suppression_status": "none",
      "compliance_receipt_url": "https://mydatahub.emailmovers.com/receipts/rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R"
    },
    "errors": [],
    "created_at": "2026-09-26T10:20:00Z",
    "completed_at": "2026-09-26T10:20:03Z"
  }
}

push.partial

A CRM push partly finished; retry the failed records.

Payload: PushPartialEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typepush.partialyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataPushyesA CRM push or its dry run, such as 4,102 to create and 0 already in your HubSpot.
data.idstringyesFormat: a CRM push id: psh_ followed by a 26 character ULID in upper case Crockford base32, such as psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5.
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.connection_idstringyesFormat: a CRM connection id: conn_ followed by a 26 character ULID in upper case Crockford base32, such as conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G.
data.dry_runbooleanyes
data.statusenum: queued, running, completed, partial, failedyes
data.summaryobjectyes
data.property_grouparray of enum: mydatahub_record_id, licence_expires_at, lawful_basis, article14_status, tps_ctps_screened_at, subscriber_class, suppression_status, compliance_receipt_urlyesThe MyDataHub property group written on every record (CrmPropertyGroup).
data.sampleCrmPropertyGroup or nullyesOn a dry run: the property group the first record would carry.
data.errorsarray of objectyes
data.created_atstring (date-time)yes
data.completed_atstring (date-time) or nullyes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "push.partial",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "id": "psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5",
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "connection_id": "conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G",
    "dry_run": false,
    "status": "partial",
    "summary": {
      "to_create": 4090,
      "to_update": 0,
      "already_present": 0,
      "skipped": 0,
      "failed": 12
    },
    "property_group": [
      "mydatahub_record_id",
      "licence_expires_at",
      "lawful_basis",
      "article14_status",
      "tps_ctps_screened_at",
      "subscriber_class",
      "suppression_status",
      "compliance_receipt_url"
    ],
    "sample": {
      "mydatahub_record_id": "contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8",
      "licence_expires_at": "2027-09-26",
      "lawful_basis": "legitimate_interests_art6_1_f",
      "article14_status": "notified",
      "tps_ctps_screened_at": "2026-09-12",
      "subscriber_class": "ltd",
      "suppression_status": "none",
      "compliance_receipt_url": "https://mydatahub.emailmovers.com/receipts/rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R"
    },
    "errors": [],
    "created_at": "2026-09-26T10:20:00Z",
    "completed_at": "2026-09-26T10:20:03Z"
  }
}

push.failed

A CRM push failed.

Payload: PushFailedEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typepush.failedyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataPushyesA CRM push or its dry run, such as 4,102 to create and 0 already in your HubSpot.
data.idstringyesFormat: a CRM push id: psh_ followed by a 26 character ULID in upper case Crockford base32, such as psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5.
data.order_idstringyesFormat: an order id: ord_ followed by a 26 character ULID in upper case Crockford base32, such as ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E.
data.connection_idstringyesFormat: a CRM connection id: conn_ followed by a 26 character ULID in upper case Crockford base32, such as conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G.
data.dry_runbooleanyes
data.statusenum: queued, running, completed, partial, failedyes
data.summaryobjectyes
data.property_grouparray of enum: mydatahub_record_id, licence_expires_at, lawful_basis, article14_status, tps_ctps_screened_at, subscriber_class, suppression_status, compliance_receipt_urlyesThe MyDataHub property group written on every record (CrmPropertyGroup).
data.sampleCrmPropertyGroup or nullyesOn a dry run: the property group the first record would carry.
data.errorsarray of objectyes
data.created_atstring (date-time)yes
data.completed_atstring (date-time) or nullyes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "push.failed",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "id": "psh_01JB4NC3W2X6Y7Z8A1B2C3D4E5",
    "order_id": "ord_01JB4N9S3W2X6Y7Z8A1B2C3D4E",
    "connection_id": "conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G",
    "dry_run": false,
    "status": "failed",
    "summary": {
      "to_create": 0,
      "to_update": 0,
      "already_present": 0,
      "skipped": 0,
      "failed": 4102
    },
    "property_group": [
      "mydatahub_record_id",
      "licence_expires_at",
      "lawful_basis",
      "article14_status",
      "tps_ctps_screened_at",
      "subscriber_class",
      "suppression_status",
      "compliance_receipt_url"
    ],
    "sample": {
      "mydatahub_record_id": "contact_01JA9X2V7XN3M9R6T1Y5W8ZAK8",
      "licence_expires_at": "2027-09-26",
      "lawful_basis": "legitimate_interests_art6_1_f",
      "article14_status": "notified",
      "tps_ctps_screened_at": "2026-09-12",
      "subscriber_class": "ltd",
      "suppression_status": "none",
      "compliance_receipt_url": "https://mydatahub.emailmovers.com/receipts/rcpt_01JB4NA2Q5W8ZAK8Q2V7XN3M9R"
    },
    "errors": [],
    "created_at": "2026-09-26T10:20:00Z",
    "completed_at": "2026-09-26T10:20:03Z"
  }
}

connection.expired

A CRM token failed; reconnect in the app.

Payload: ConnectionExpiredEvent.

MemberTypeAlways presentDescription
idstringyesAlso sent as the webhook-id header; your idempotency key.
typeconnection.expiredyes
timestampstring (date-time)yes
api_versionstringyesA dated MyDataHub-Version, such as 2027-01-15.
dataobjectyes
data.connection_idstringyesFormat: a CRM connection id: conn_ followed by a 26 character ULID in upper case Crockford base32, such as conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G.
data.providerstringyes
data.reconnect_urlstring (uri)yes
{
  "id": "evt_01JB4NB7T1Y5W8ZAK8Q2V7XN3M",
  "type": "connection.expired",
  "timestamp": "2026-09-26T10:16:04Z",
  "api_version": "2027-01-15",
  "data": {
    "connection_id": "conn_01JB3Y2X6Y7Z8A1B2C3D4E5F6G",
    "provider": "hubspot",
    "reconnect_url": "https://mydatahub.emailmovers.com/api-keys"
  }
}