enabled and attachments_bucket. The identity’s dns_records
contains sending and receiving DNS guidance, including the complete MX value.
All identities use the same ownership and IAM checks.
Enable receiving and add a rule
- Console
- API
- CLI
- Go
Open Email → Identities and select the domain.
- In Settings, choose an Attachments bucket in the Receiving card, turn on the switch, and select Save. The bucket must belong to the same account and region.
- Open Recipient rules and select Create rule. Choose an exact address, address prefix, or all addresses, then pick a Notifications topic in the same account and region from the resource selector.
- Open DNS records and publish the MX record from Receiving records. Sending records contains the records used for verification and sending, including any custom MAIL FROM records.
email:CreateRecipientRule on the identity and
notifications:Publish on the destination topic. Topic resource-policy denies
also apply. Selecting a bucket delegates storage:PutObject and storage:GetObject
under email/{identity_id}/ in that bucket. Current IAM permissions, permission
boundaries, bucket policies, and the original session scope-down remain enforced.
See permissions.
Recipient matching
match_type makes the matching behavior explicit:
Exact rules take priority, followed by the longest matching prefix and then the
catch-all. Only enabled rules accept recipients. An unmatched recipient is rejected
during SMTP delivery. You can configure up to 100 rules per identity.
Rules have their own UUID and CRN.
POST creates a rule and returns 409 when its
matching pattern already exists. Read or delete an individual rule at
/v1/identities/{identity_id}/recipient-rules/{rule_id}. Use PATCH on that path
to change only the supplied fields. List responses include normal meta pagination.
The topic response is a ResourceRef containing its UUID, CRN, and name.
Configuration PATCH also preserves omissions. Passing attachments_bucket: null
clears the binding only when receiving is disabled. To disable and detach together,
include both enabled: false and attachments_bucket: null in the same request.
Read accepted mail
GET /v1/received-messages lists metadata across the account, with optional
identity, recipient, and review_reason filters. Read one record by UUID,
then request its /content, /raw, or /attachments/{attachment_id} separately.
/content returns full decoded text and HTML; /raw downloads reconstructed MIME.
Attachment IDs are stable opaque UUIDs. Metadata and content require separate grants.
Treat HTML as untrusted data and sanitize it before rendering.
identity is a ResourceRef. rfc_message_id in content is the RFC Message-ID header,
not the Email resource UUID. notification_status is pending, retrying, or
published; notification_error provides safe failure detail. Publication retries
automatically until expiry. These fields describe the notification event, not SMTP
acceptance, which happened before the message was returned.
review_reason can be clear, malware, spam, or sender_unverified.
Malware content is quarantined and cannot be downloaded through the content API.
Check content_available and expires_at before attempting retrieval.
published_at reports when the Notifications event was published, not when every
subscriber finished processing it.
The parsed content’s message_id, in_reply_to, and references are RFC email
headers. They are not Basaltic resource UUIDs or ResourceRefs.
Attachment storage
Each accepted attachment is stored as a separate object in the selected bucket. Its metadata contains abucket ResourceRef, key, optional version_id, and
sha256. Storage pricing, quotas, encryption, and lifecycle rules apply normally.
There is no additional Email storage allowance or accumulated attachment-storage cap.
A missing, changed, or deleted object is unavailable for download.
Email acknowledges an incoming SMTP delivery only after its attachments and the
message record are durable. Storage failures return a temporary SMTP failure so
the sender can retry. Retries do not charge a second received-message delivery.
Malware attachments are never written into the customer bucket.
Changing the bucket affects new messages; it does not move existing objects.
Disabling receiving preserves the bucket selection and previously accepted mail.
Clearing attachments_bucket with null requires receiving to be disabled.
Quotas and retention
Sent and received message content is retained for 30 days, included in its sending or receiving price.expires_at identifies the deadline. Expired messages
are unavailable through the message APIs even if notification publication failed.
Background cleanup removes retained content; operational billing and deduplication
records can remain. Attachment objects are not deleted when an email expires:
the bucket owner controls their lifecycle and pays for their storage.
Organization quotas apply across accounts and identities in each region:
There is no daily receiving allowance. One message accepted for three recipients
counts as three receiving deliveries. Duplicate retries are acknowledged without
counting again. SMTP rejects a message above the organization size quota; temporary
capacity or dependency failures ask the sender to retry.
Recipient matching supports 100 rules per domain. MIME parsing has technical
complexity bounds; these are separate from stored-byte capacity. The content API returns full text and HTML within the organization message-size
quota. Retrieve attachments from their bucket or the message attachment download
endpoint during retention.

