Prove that the receiving server accepted the message. The delivered event of this message states it. It is the first event that a system outside Twilio SendGrid decides.

Contract identity.
FactValue
Contract idsendgrid.email.delivered
Version1.0.0
Hash23be0513771d3179
Completion leveldelivered
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillTwilio SendGrid Mail API 0.1.0
Valid for provider API versionsv3

What is the intent?

Deliver the message to the mailbox of the recipient.

What is the subject and the action?

MemberValue
Subject typesendgrid.message
Subject identityprovely_operation_id = $action.result.provely_operation_id
Canonical effectmessaging.email_send
Provider operationPOST /v3/mail/send
Idempotencynone, retry is not safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongprovely_operation_id from $action.result.provely_operation_idyes
fingerprintweakemail from $input.tono

Which evidence does the contract require?

Minimum evidence level E3. An independent channel is required. Minimum channels: 1.

ChannelLevelIndependenceVerifierDescription
processed_by_recipientE3provider eventwebhookThe processed events for this recipient since the operation started, whatever custom argument they carry. A count above one shows a second message. The verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
delivered_eventsE3provider eventwebhookThe delivered events that carry the custom argument of this operation. The receiving server accepted the message. The verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
processed_eventsE3provider eventwebhookThe processed events that carry the custom argument of this operation. Twilio SendGrid accepted the message and can deliver it. The verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
hard_bounce_eventsE3provider eventwebhookThe bounce events of this operation that state the type bounce. A hard bounce is a permanent denial. The match drops a block, which is a temporary denial. The verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
dropped_eventsE3provider eventwebhookThe dropped events of this operation. Twilio SendGrid dropped the message, and it never reached a receiving server. The verifier returns {events, count, latest, earliest, types, duplicates_dropped}.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
delivered_event_presentAt least one delivered event of this operation arrived. The receiving server accepted the message.$observed.delivered_events.countgte1delivered_events
delivered_event_present_in_windowThe provider clock of the earliest matched event is after the start of the operation. An older event belongs to another send.$observed.delivered_events.earliest.provider_timestamptime_after$operation.created_atdelivered_events

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
wrong_recipientwrong subjectThe message went to a different recipient than the intent named.$observed.processed_events.latest.payload.emailne$input.to
message_predates_operationpre existing stateThe earliest event of this message is older than the operation. It proves nothing.$observed.processed_events.earliest.provider_timestamptime_before$operation.created_at
duplicate_message_presentduplicate side effectTwilio SendGrid processed more than one message for this recipient since the operation started. Do not retry.$observed.processed_by_recipient.countgt1

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
message_bounced$observed.hard_bounce_events.count gte 1FAILEDThe receiving server denied the message permanently.
message_dropped$observed.dropped_events.count gte 1FAILEDTwilio SendGrid dropped the message. It never reached a receiving server.
still_on_the_way($observed.processed_events.count gte 1) and (not ($observed.dropped_events.count gte 1)) and (not ($observed.delivered_events.count gte 1))PENDINGTwilio SendGrid holds the message and no event states an end. The runtime observes again later.

How long does the runtime observe?

Timing memberValue
Initial delay2000 ms
Poll interval10000 ms
Backoffexponential factor 2, max 300000 ms
Maximum attempts60
Timeout259200000 ms
Stale read window30000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • sendgrid.openapi#/paths/~1v3~1mail~1send/post: sendgrid.openapi, retrieved 2026-09-08
  • sendgrid.docs.events#event-webhook/the-delivered-event/p1: sendgrid.docs.events, retrieved 2026-09-08
  • sendgrid.docs.events#event-webhook/deferrals/p1: sendgrid.docs.events, retrieved 2026-09-08
  • sendgrid.events#/events/delivered: sendgrid.events, retrieved 2026-09-08
  • sendgrid.docs.events#event-webhook/custom-arguments/p1: sendgrid.docs.events, retrieved 2026-09-08
  • sendgrid.docs.events#event-webhook/the-event-time/p1: sendgrid.docs.events, retrieved 2026-09-08
  • sendgrid.docs.events#event-webhook/the-properties-of-a-delivery-event/p1: sendgrid.docs.events, retrieved 2026-09-08

Can sendgrid.email.delivered return VERIFIED from the action response alone?

No. The minimum evidence level is E3. The action response is E1. The completion conditions read delivered_events.

What happens after the timeout?

The verdict is UNVERIFIABLE with the reason evidence_unavailable_before_timeout. The operation goes to a person for review.