Push files to your S3 bucket
Onboard a least-privilege cross-account destination and consume atomic publications
Push delivery writes governed exports into a customer-controlled S3 prefix by assuming a dedicated IAM role. Destination verification proves the configured region, encryption, and object operations before any subscription can publish.
The external ID is shown once
The onboarding response can contain externalId only once and is sent with
Cache-Control: no-store. Store it immediately in the destination role's
trust policy. If it is lost, rotate onboarding; support cannot retrieve it.
Onboard a destination
Prepare a dedicated prefix and role
Use a role whose path is
role/realty-data-platform/file-delivery/*. Grant only the required object
operations on the destination prefix and, when applicable, the named KMS key.
Reserve the destination
POST /v1/file-export-destinations
Content-Type: application/json
x-api-key: YOUR_API_KEY
{
"bucket": "acme-realty-deliveries",
"region": "us-east-1",
"prefix": "realty/production",
"roleArn": "arn:aws:iam::123456789012:role/realty-data-platform/file-delivery/production",
"kmsKeyArn": "arn:aws:kms:us-east-1:123456789012:key/11111111-2222-3333-4444-555555555555"
}Add the returned external ID to trust
Require both the Realty platform principal and exact sts:ExternalId in the
role trust policy. Do not put the external ID in tags, logs, or support cases.
Wait for verification
The destination checker assumes the role, verifies bucket region, and
writes, heads, and deletes a random encrypted probe. Create push subscriptions
only after GET /v1/file-export-destinations reports the destination active.
Publication layout
The platform writes _COMPLETE last, after publication authorization and
remote size/checksum verification. Consumers must ignore a prefix until that
marker exists, then verify that its publication matches the immutable manifest.
A conflicting existing object is never overwritten.
Create a push subscription
{
"name": "Nightly S3 listings",
"domain": "listing",
"deliveryMode": "push",
"destinationId": "018f2f21-15d8-7c8b-8ba5-2b90cbfe38d8",
"cadenceSeconds": 86400,
"preferredMinuteOfDay": 300,
"emptyDeliveryBehavior": "manifest_only"
}{
"name": "Nightly S3 listings with recovery pull",
"domain": "listing",
"deliveryMode": "both",
"destinationId": "018f2f21-15d8-7c8b-8ba5-2b90cbfe38d8",
"cadenceSeconds": 86400,
"preferredMinuteOfDay": 300,
"emptyDeliveryBehavior": "manifest_only"
}