Fillo Storage API
The Storage API from Fillo — 2 operation(s) for storage.
The Storage API from Fillo — 2 operation(s) for storage.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/fillo-so:fillo-so-storage-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Fillo So Storage API
version: 1.0.0
contact:
name: Fillo support
email: hello@fillo.so
url: https://fillo.so/developers
description: 'Operations tagged Storage across 2 of this provider''s published API definitions: fillo-so-openapi.json, fillo-so-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://fillo.so
security:
- bearerAuth: []
tags:
- name: Storage
paths:
/api/v1/manage/forms/{form}/storage:
get:
tags:
- Storage
summary: Get a form's upload destination
operationId: getFormStorage
description: 'Where this form''s uploads land: the destination pinned on the form, the stored record, and what an upload would `resolve` to right now (including Fillo''s short-lived transit staging). Scope: storage:manage.'
parameters:
- $ref: '#/components/parameters/FormHandle'
responses:
'200':
description: The form's storage destination.
content:
application/json:
schema:
$ref: '#/components/schemas/FormStorage'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/RateLimited'
put:
tags:
- Storage
summary: Set a form's upload destination
operationId: setFormStorage
description: 'Pin where this form''s uploads land. `transit` and `none` clear the per-form choice so the form follows the workspace default. A destination whose provider is not connected is a 409, as is clearing storage on a live form that collects files. Scope: storage:manage.'
parameters:
- $ref: '#/components/parameters/FormHandle'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- destination
properties:
destination:
type: string
enum:
- gdrive
- box
- s3
- r2
- transit
- none
responses:
'200':
description: The form's storage destination after the change.
content:
application/json:
schema:
$ref: '#/components/schemas/FormStorage'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'413':
$ref: '#/components/responses/PayloadTooLarge'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://fillo.so
/api/v1/manage/forms/{form}/storage/folder:
get:
tags:
- Storage
summary: List Google Drive upload folders
operationId: listFormStorageFolders
description: 'The Drive folder this form''s uploads land in, plus the connected account''s writable My Drive folders so an agent can choose without guessing an id. Shared drives are not offered. Scope: storage:manage.'
parameters:
- $ref: '#/components/parameters/FormHandle'
- name: q
in: query
description: Filter the folder list by name.
schema:
type: string
responses:
'200':
description: The current folder and the account's writable folders.
content:
application/json:
schema:
$ref: '#/components/schemas/DriveFolderListing'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/RateLimited'
put:
tags:
- Storage
summary: Select a Google Drive upload folder
operationId: setFormStorageFolder
description: 'Send this form''s new uploads to a folder on the connected Google account. Existing files stay where they are. A folder the connected account cannot write to, or one owned by a different account, is a 409. Scope: storage:manage.'
parameters:
- $ref: '#/components/parameters/FormHandle'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- folderId
properties:
folderId:
type: string
pattern: ^[A-Za-z0-9_-]{10,200}$
description: A Google Drive folder id.
responses:
'200':
description: The selected folder.
content:
application/json:
schema:
type: object
required:
- folder
properties:
folder:
$ref: '#/components/schemas/DriveFolder'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'413':
$ref: '#/components/responses/PayloadTooLarge'
'429':
$ref: '#/components/responses/RateLimited'
delete:
tags:
- Storage
summary: Reset the Google Drive upload folder
operationId: resetFormStorageFolder
description: 'Return the form to its automatic per-form Drive folder. Files already uploaded stay where they are. Scope: storage:manage.'
parameters:
- $ref: '#/components/parameters/FormHandle'
responses:
'200':
description: Automatic placement restored; both folder keys are null.
content:
application/json:
schema:
type: object
required:
- folder
properties:
folder:
$ref: '#/components/schemas/DriveFolder'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'409':
$ref: '#/components/responses/Conflict'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://fillo.so
components:
responses:
NotFound:
description: No such resource in this project (returned instead of 403 for ids in other projects).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Per-key (120/min), per-workspace (240/min), or per-IP (300/min) rate limit exceeded. Retry after the Retry-After header.
headers:
RateLimit-Policy:
description: Named quota policies and their limits/windows.
schema:
type: string
RateLimit:
description: Current remaining quota and seconds until reset for each named policy.
schema:
type: string
RateLimit-Limit:
description: 'Compatibility field: effective request limit.'
schema:
type: integer
RateLimit-Remaining:
description: 'Compatibility field: effective requests remaining.'
schema:
type: integer
RateLimit-Reset:
description: 'Compatibility field: seconds until the effective window resets.'
schema:
type: integer
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Forbidden:
description: The key is valid but lacks the required scope.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
PayloadTooLarge:
description: The request body exceeded the 16 KiB management cap.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Missing, malformed, unknown, revoked, or expired key.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Invalid request (e.g. a body on a GET/DELETE, or a missing required query parameter).
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Conflict:
description: The request was understood but refused in this state — an unmet precondition, or a confirm value that did not match. Nothing was changed.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
DriveFolder:
type: object
required:
- id
- name
properties:
id:
type:
- string
- 'null'
name:
type:
- string
- 'null'
description: The Google Drive folder a form's uploads land in. Both keys are null when Fillo manages the folder automatically.
DriveFolderListing:
type: object
required:
- folder
- folders
properties:
folder:
$ref: '#/components/schemas/DriveFolder'
folders:
type: array
description: Writable My Drive folders on the connected account.
items:
type: object
required:
- id
- name
properties:
id:
type: string
name:
type: string
FormStorage:
type: object
required:
- destination
- storage
- resolved
properties:
destination:
type: string
enum:
- gdrive
- box
- s3
- r2
- none
description: The destination pinned on the form. `none` means the form follows the workspace default.
storage:
type:
- object
- 'null'
description: 'The stored destination record: provider (gdrive, box, or s3), an optional r2 variant, and any selected Drive folder.'
resolved:
type:
- string
- 'null'
enum:
- gdrive
- s3
- box
- transit
- null
description: Where an upload would actually land right now — including Fillo's short-lived transit staging. null means uploads are blocked.
Error:
type: object
required:
- error
properties:
error:
type: string
parameters:
FormHandle:
name: form
in: path
required: true
description: A form id or slug.
schema:
type: string
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'A project secret key (`fsk_…`). Scopes: forms:read, responses:read, respondents:read, responses:export, forms:write, forms:publish, storage:manage, webhooks:manage, settings:manage, integrations:manage, responses:manage, members:manage, workspace:manage, forms:delete, responses:delete, respondents:delete, workspace:delete. A request for a scope the key lacks returns 403 with a stable message naming the scope (e.g. `This key lacks the responses:export scope.`).'
externalDocs:
description: Fillo developer resources
url: https://fillo.so/developers
x-refined-from:
- fillo-so-openapi.json
- fillo-so-openapi.json
x-provenance:
method: harvested
publisher: Fillo
source: https://fillo.so/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)