S3-compatible storage
Let hires find and read files in buckets on Amazon S3, MinIO, Cloudflare R2, Wasabi, Ceph or any S3 API, and upload, share or delete only as you allow.
Explore 6 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.
With S3-compatible storage, a hire can:
- list your buckets, and the folders and files in them,
- find files by name (every word you give must be in the file's path),
- read a file as text: text files (txt, md, csv, json, code…), and Word, Excel, PowerPoint and OpenDocument files, which Roster turns into text itself. Of a large text file it reads the start. Other files (PDFs, images, archives) show their name, size and date only, never their content.
If you allow changes, a hire can also:
- upload text as a file (a report, a CSV). It never overwrites a file: replacing one asks a person first.
- make a download link that works for up to 7 days. Anyone holding the link can download the file until it ends, so this always asks a person first.
- delete a file. This always asks a person first. Unless the bucket keeps versions, a deleted file is gone.
Hires never see your keys. Passwords and keys written inside files are hidden from hires when they read them.
It works with Amazon S3, MinIO, Cloudflare R2, Wasabi, Ceph, Backblaze B2 and anything else that speaks the S3 API.
1. Make a key for Roster
For Amazon S3, straight there: IAM users → the user made for Roster → Security credentials → Create access key. For R2, MinIO, Wasabi or Ceph, make an access key in their console.
Make a key that can reach only the buckets hires should use, and for read-only use, only read.
- Amazon S3: in IAM, create a user for Roster with a policy allowing
s3:ListBucketands3:GetObjecton those buckets (adds3:PutObjectands3:DeleteObjectto allow changes;s3:ListAllMyBucketsto list buckets). Create an access key for it. - Cloudflare R2: R2 → Manage API tokens → Create API token, with Object Read only (or
Object Read & Write) on the buckets. Copy the access key ID, secret, and the S3 endpoint
https://<account id>.r2.cloudflarestorage.com. - MinIO: in the console, Access Keys → Create access key, with a policy limited to the buckets.
- Wasabi, Ceph, others: create an access key in their console or with
radosgw-admin; the endpoint is in their docs.
2. Connect it in Roster
- Open Integrations → Tools → Add a tool, search for S3 and choose S3-compatible storage.
- Endpoint: leave it empty for Amazon S3. Otherwise your store's address, like
https://minio.example.com:9000. - Region: your buckets' region (like
eu-west-1);autofor Cloudflare R2; for MinIO,us-east-1unless you set another. - Paste the Access key ID and Secret access key.
- What hires may do: Find and read files, or also upload, share and delete.
- Addressing can stay Automatic. If your store wants bucket names in the host name, choose virtual-hosted style.
Roster checks the key when you click Connect. Once it's accepted, the connection shows Connected as the store's owner (or address) and how many buckets the key can list. If it's refused, Roster says what to fix (a mistyped key, a missing permission) and saves nothing.
3. Give hires access
On the hire's Tools tab, click Give access on S3-compatible storage. Read only gives the reading tools; Read and write adds upload, links and delete (if the connection allows changes).
- Buckets and folders: the buckets, or folders in them as
bucket/folder, the hire may use. Everything under them counts. Leave it empty for every bucket the key can reach.
Paths look like /reports/2026/q3.md: the bucket, then the folders and the file.
When it asks first
| What the hire does | Asks a person |
|---|---|
| Makes a download link | always |
| Deletes a file | always |
| Uploads a file with a taken name | only when it asks to replace the old file |
You can change this per hire on the hire's Tools tab, under When it asks first.
If something goes wrong
- "The key isn't allowed this": the key's policy doesn't cover that bucket or action.
- Nothing found: S3 has no search of its own, so Roster looks through file names under the hire's folders (up to 5,000 files). Narrow the search with a folder.
- A file isn't read: PDFs, images and old Office formats (.doc, .xls) aren't read as text. Office files over 15 MB aren't either.
- Errors about the signature or region: check the region, and for MinIO and Ceph try the other addressing style.
Tools and permissions reference
This reference is built from the same definitions Roster uses to connect S3-compatible storage and give hires access. It updates with each release.
Authentication and requested permissions
The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.
Service credentials
This integration uses the service's own authentication scheme with the credentials in the connection fields below. Follow the connection guide for the exact keys and account permissions.
No fixed permission list is declared for this connection. Review the sign-in consent screen, the account's roles, and the service's own documentation before connecting.
Connection fields
| Field | What to provide |
|---|---|
EndpointendpointOptional | Leave empty for Amazon S3. For others: Cloudflare R2's https://<account id>.r2.cloudflarestorage.com, Wasabi's https://s3.<region>.wasabisys.com, or your MinIO or Ceph address. |
RegionregionOptional | The buckets' region: us-east-1 and so on; auto for Cloudflare R2; MinIO's own (us-east-1 unless set). Starts with: |
AddressingaddressingOptional | How buckets go in addresses. Automatic uses virtual-hosted style for Amazon S3 and path style elsewhere. Choices: Automatic (auto); Path style (endpoint/bucket/key) (path); Virtual-hosted style (bucket.endpoint/key) (virtual). Starts with: |
Access key IDaccessKeyIdRequired | Of a key made just for Roster, allowed only the buckets hires should use. |
Secret access keysecretAccessKeyRequired · sealed secret | Use the value for your account or connection. |
What hires may doaccessOptional | Read only asks the store for less, and hires get no tool that changes anything. Changing this may mean signing in again. Choices: Find and read files (read); Also upload, share (asks first) and delete (asks first) (write). Starts with: |
Per-hire limits
Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.
| Field | What to provide |
|---|---|
Buckets and foldersfoldersOptional | Buckets, or folders in them as bucket/folder, the hire may use. Everything under them counts. Leave empty for every bucket the key can reach. |
Actions
6 actions: 3 only read and 3 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.
6 of 6 actions. Open an action for its arguments and full input schema.
search_filesRead only
Find files in S3 by words in their name, optionally inside one folder.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
textRequired | string | words to look for |
folderOptional | string | a folder's path, like /Clients |
limitOptional | integer | See input schema below.Default: 20 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "words to look for"
},
"folder": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "a folder's path, like /Clients"
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"text"
]
}list_folderRead only
What's directly inside a S3 folder: files and subfolders, newest first where S3 sorts.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
folderOptional | string | a folder (path); leave out for the top |
limitOptional | integer | See input schema below.Default: 50 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"folder": {
"description": "a folder (path); leave out for the top",
"type": "string",
"minLength": 1,
"maxLength": 1024
},
"limit": {
"default": 50,
"type": "integer",
"minimum": 1,
"maximum": 200
}
}
}read_fileRead only
Read a S3 file as text: text files (the start of large ones), Word, Excel, PowerPoint and OpenDocument files. Other files (PDFs, images) show their details only.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
fileRequired | string | the file's path, like /Clients/notes.md (from list_folder or search_files) |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"file": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "the file's path, like /Clients/notes.md (from list_folder or search_files)"
}
},
"required": [
"file"
]
}upload_fileRead and write
Save text as a file in a S3 folder (a note, a CSV, a Markdown report). It never overwrites: if the name is taken it says so, and replace: true replaces the file after a person approves.
Approval: when it would replace a file that's already there.
Available with: What hires may do: Also upload, share (asks first) and delete (asks first).
| Argument | Type | Details |
|---|---|---|
folderRequired | string | a folder's path, like /Clients |
nameRequired | string | the file's name with its extension, like summary.md or rates.csv |
textRequired | string | the file's whole content, as text |
replaceOptional | boolean | replace a file of the same name (asks a person first)Default: false |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"folder": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "a folder's path, like /Clients"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "the file's name with its extension, like summary.md or rates.csv"
},
"text": {
"type": "string",
"maxLength": 1000000,
"description": "the file's whole content, as text"
},
"replace": {
"default": false,
"description": "replace a file of the same name (asks a person first)",
"type": "boolean"
}
},
"required": [
"folder",
"name",
"text"
]
}share_linkRead and write
Make a link to a S3 file that anyone who has it can open, lasting up to 7 days. It waits for a person's approval: Roster asks in the thread and makes the link, once, when they approve.
Approval: Always asks for approval.
Available with: What hires may do: Also upload, share (asks first) and delete (asks first).
| Argument | Type | Details |
|---|---|---|
fileRequired | string | the file's path, like /Clients/notes.md (from list_folder or search_files) |
audienceOptional | "anyone" | anyone with the link, or only people signed in to the organisationDefault: "anyone" |
expires_in_daysOptional | integer | when the link stops workingDefault: 1 |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"file": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "the file's path, like /Clients/notes.md (from list_folder or search_files)"
},
"audience": {
"default": "anyone",
"description": "anyone with the link, or only people signed in to the organisation",
"type": "string",
"enum": [
"anyone"
]
},
"expires_in_days": {
"default": 1,
"description": "when the link stops working",
"type": "integer",
"minimum": 1,
"maximum": 7
}
},
"required": [
"file"
]
}delete_fileRead and write
Delete a S3 file (for good, unless the bucket keeps versions). It waits for a person's approval: Roster asks in the thread and deletes it, once, when they approve. Folders aren't deleted here.
Approval: Always asks for approval.
Available with: What hires may do: Also upload, share (asks first) and delete (asks first).
| Argument | Type | Details |
|---|---|---|
fileRequired | string | the file's path, like /Clients/notes.md (from list_folder or search_files) |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"file": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "the file's path, like /Clients/notes.md (from list_folder or search_files)"
}
},
"required": [
"file"
]
}Watches and incoming events
- No built-in watch is declared. Give a hire a scheduled responsibility if it should check this service regularly.
- No incoming webhook handler is declared for this integration.
Limits and troubleshooting
- Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
- Expired or revoked access: reconnect or replace the key on the connection.
- Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
- The action schema describes accepted inputs. It does not grant additional access or bypass approvals.