Fillo Storage API

The Storage API from Fillo — 2 operation(s) for storage.

GitHub OpenAPI

Operations 5

GET /api/v1/manage/forms/{form}/storage Get a form's upload destination #
PUT /api/v1/manage/forms/{form}/storage Set a form's upload destination #
GET /api/v1/manage/forms/{form}/storage/folder List Google Drive upload folders #
PUT /api/v1/manage/forms/{form}/storage/folder Select a Google Drive upload folder #
DELETE /api/v1/manage/forms/{form}/storage/folder Reset the Google Drive upload folder #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/fillo-so:fillo-so-storage-api"
All apis
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.

Get an API 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 Specification

fillo-so-storage-api-openapi.yml Raw ↑
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)