> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kadoa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Amazon S3

> Deliver data from completed runs to your S3 bucket

Kadoa configures the integration for you through the [Support Center](/docs/support-center).

## Before you begin

* An AWS account with permission to create a bucket and edit its bucket policy.
* Kadoa's AWS principal ARN, provided by Support. Your bucket policy grants access without sharing AWS keys.
* A bucket in any AWS region. Kadoa uses SSE-S3 encryption by default.

If your bucket requires SSE-KMS, contact Support before you request the integration.

## Prepare the bucket

<Steps>
  <Step title="Create a bucket">
    Create an S3 bucket in your preferred AWS region.
  </Step>

  <Step title="Grant Kadoa access">
    Add this bucket policy. Replace `<KADOA_AWS_PRINCIPAL_ARN>`, `<YOUR_BUCKET>`, and `<PREFIX>` with your values.

    Use a prefix with no leading or trailing slash, for example `kadoa`.

    ```json theme={null}
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": { "AWS": "<KADOA_AWS_PRINCIPAL_ARN>" },
          "Action": ["s3:PutObject", "s3:DeleteObject", "s3:AbortMultipartUpload", "s3:ListBucket"],
          "Resource": ["arn:aws:s3:::<YOUR_BUCKET>/<PREFIX>/*", "arn:aws:s3:::<YOUR_BUCKET>"]
        }
      ]
    }
    ```
  </Step>
</Steps>

## Request the integration

Send these details through the [Support Center](/docs/support-center):

| Detail                | Example                     |
| --------------------- | --------------------------- |
| Bucket name           | `<YOUR_BUCKET>`             |
| Region                | `<YOUR_AWS_REGION>`         |
| Prefix                | `kadoa`                     |
| Encryption            | SSE-S3 (default) or SSE-KMS |
| Formats               | Parquet, JSONL, JSON, CSV   |
| Workflow health files | On (default) or off         |

## Verify the first delivery

After a workflow run completes, list the delivered files:

```bash theme={null}
aws s3 ls "s3://<YOUR_BUCKET>/<PREFIX>/" --recursive
```

* Confirm one file per selected format exists for that run.
* Confirm each data file's row count matches the same run in the dashboard.
* Run the workflow again. With the [default path template](/docs/integrations/data-integrations#file-layout-and-path-template), confirm that the new run has a new folder.

## What's next

<CardGroup cols={2}>
  <Card title="Load into Snowflake with Snowpipe" icon="snowflake" href="/docs/integrations/snowflake#load-cloud-storage-exports-with-snowpipe">
    Load files from your bucket with a Snowpipe that you manage.
  </Card>

  <Card title="How data integrations work" icon="arrows-rotate" href="/docs/integrations/data-integrations">
    See delivery timing, formats, file paths, and workflow health files.
  </Card>

  <Card title="Google Cloud Storage" icon="google" href="/docs/integrations/google-cloud-storage">
    Deliver completed-run data to a Cloud Storage bucket.
  </Card>
</CardGroup>
