Resourcly storage API

The storage API from Resourcly — 7 operation(s) for storage.

Operations 7

GET /storage/download-url Get download URL
POST /storage/folders Create folder
GET /storage/list List storage directory
DELETE /storage/objects Delete file or folder
POST /storage/paste Paste (copy/move) items
POST /storage/prepare-upload Prepare upload
PUT /storage/rename Rename or move

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/resourcly-storage-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

resourcly-storage-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  description: API for document processing, item similarity search, and analytics.
  title: Resourcly analytics Storage API
  termsOfService: https://resourcly.com/terms
  contact:
    name: API Support
    email: support@resourcly.com
  license:
    name: Proprietary
  version: 1.0.0
servers:
- url: https://api.resourcly.com/v1
tags:
- name: storage
paths:
  /storage/download-url:
    get:
      security:
      - BearerAuth: []
      description: Returns a V4 signed GET URL for the file. By default the URL forces a download (Content-Disposition attachment); with disposition=inline it renders in the browser with the object's own Content-Type (used for previews).
      tags:
      - storage
      summary: Get download URL
      parameters:
      - description: Leaf business node ID
        name: business_node_id
        in: query
        required: true
        schema:
          type: string
      - description: Node-relative file key
        name: key
        in: query
        required: true
        schema:
          type: string
      - description: \
        name: disposition
        in: query
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StorageDownloadURLResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
  /storage/folders:
    post:
      security:
      - BearerAuth: []
      description: Creates an empty folder (zero-byte placeholder object) in the given directory of the business node's storage space. Refused with 409 inside folders synced from an external data source.
      tags:
      - storage
      summary: Create folder
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StorageCreateFolderResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/models.StorageCreateFolderRequest'
        description: Parent path and folder name
        required: true
  /storage/list:
    get:
      security:
      - BearerAuth: []
      description: Lists one level of files and folders in the business node's storage space. Page through with page_token; an empty next_page_token means the level is exhausted. Folder keys can repeat across pages and should be deduped client-side.
      tags:
      - storage
      summary: List storage directory
      parameters:
      - description: Leaf business node ID (root of the storage space)
        name: business_node_id
        in: query
        required: true
        schema:
          type: string
      - description: Directory path relative to the node root (empty = root)
        name: path
        in: query
        schema:
          type: string
      - description: Opaque page token from a previous response
        name: page_token
        in: query
        schema:
          type: string
      - description: Items per page (default 200, max 1000)
        name: page_size
        in: query
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StorageListResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
  /storage/objects:
    delete:
      security:
      - BearerAuth: []
      description: Deletes a single file, or every object under a folder key. Type must be "file" or "folder". Deleting a folder synced from an external data source (or a folder containing one) also disconnects that data source; items INSIDE a synced folder cannot be deleted (409), and deletion is refused with 409 while an affected sync is running.
      tags:
      - storage
      summary: Delete file or folder
      parameters:
      - description: Leaf business node ID
        name: business_node_id
        in: query
        required: true
        schema:
          type: string
      - description: Node-relative key (folder keys may end with /)
        name: key
        in: query
        required: true
        schema:
          type: string
      - description: \
        name: type
        in: query
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StorageDeleteResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
  /storage/paste:
    post:
      security:
      - BearerAuth: []
      description: Copies or moves a batch of files/folders (siblings from one folder level) into a destination directory, optionally in a different accessible business node. Both modes resolve name collisions with numeric " (2)" suffixes — nothing is overwritten. Moving a folder into itself or its own subtree is rejected. Nothing can be pasted INTO a folder synced from an external data source, and items inside a synced folder can be copied out but not moved (409). Partial failures return 200 with a failed list.
      tags:
      - storage
      summary: Paste (copy/move) items
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StoragePasteResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/models.StoragePasteRequest'
        description: Source/destination nodes, path, mode and items
        required: true
  /storage/prepare-upload:
    post:
      security:
      - BearerAuth: []
      description: 'Returns the key an upload should use for the given file — unchanged when free, numerically suffixed ("a.pdf" → "a (2).pdf") when the name is already taken — plus a V4 signed PUT URL for exactly that key. PUT the file body to upload_url sending upload_headers verbatim: they carry an if-generation-match precondition (412 if the object appeared meanwhile — re-resolve and retry) and a content-length-range that GCS enforces on the actual received bytes (400 when over max_size_bytes). Called once per file right before its upload. Refused with 409 inside folders synced from an external data source.'
      tags:
      - storage
      summary: Prepare upload
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StoragePrepareUploadResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/models.StoragePrepareUploadRequest'
        description: Target directory and relative file key
        required: true
  /storage/rename:
    put:
      security:
      - BearerAuth: []
      description: Moves a file or folder (copy + delete) to a new key within the same business node. A folder move relocates every object under its prefix; the destination must not be inside the source, and a destination name that already exists is rejected with 409. Items inside a folder synced from an external data source cannot be renamed or moved, and nothing can move into one (409); renaming or moving the synced folder itself (or an ancestor) keeps its connection pointed at the new location.
      tags:
      - storage
      summary: Rename or move
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.StorageRenameResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/models.ErrorResponse'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/models.StorageRenameRequest'
        description: Source and destination keys
        required: true
components:
  schemas:
    models.StorageRenameRequest:
      type: object
      properties:
        business_node_id:
          type: string
        destination_key:
          type: string
        source_key:
          type: string
        type:
          type: string
    models.StorageDeleteResponse:
      type: object
      properties:
        deleted:
          type: integer
    models.StoragePasteItem:
      type: object
      properties:
        key:
          type: string
        type:
          type: string
    models.StoragePasteError:
      type: object
      properties:
        key:
          type: string
        message:
          type: string
    models.StorageRenameResponse:
      type: object
      properties:
        moved:
          type: integer
    models.StorageDownloadURLResponse:
      type: object
      properties:
        url:
          type: string
    models.StoragePasteResponse:
      type: object
      properties:
        failed:
          type: array
          items:
            $ref: '#/components/schemas/models.StoragePasteError'
        objects:
          type: integer
        pasted:
          type: integer
    models.StorageCreateFolderRequest:
      type: object
      properties:
        business_node_id:
          type: string
        name:
          type: string
        path:
          type: string
    models.StoragePrepareUploadResponse:
      type: object
      properties:
        key:
          type: string
        max_size_bytes:
          type: integer
        upload_headers:
          type: object
          additionalProperties:
            type: string
        upload_url:
          type: string
    models.StoragePasteRequest:
      type: object
      properties:
        destination_business_node_id:
          type: string
        destination_path:
          type: string
        items:
          type: array
          items:
            $ref: '#/components/schemas/models.StoragePasteItem'
        mode:
          type: string
        source_business_node_id:
          type: string
    models.StorageItem:
      type: object
      properties:
        contains_synced:
          description: normal folder with synced folder(s) beneath it
          type: boolean
        content_type:
          type: string
        key:
          type: string
        last_modified:
          type: string
        name:
          type: string
        shared_root:
          description: folder has an active shared-storage share (owner-side badge)
          type: boolean
        size:
          type: integer
        synced:
          description: item is a synced folder or inside one
          type: boolean
        synced_root:
          description: item IS a synced folder
          type: boolean
        type:
          description: '"file" or "folder"'
          type: string
    models.ErrorResponse:
      type: object
      properties:
        code:
          type: string
        details: {}
        error:
          type: string
    models.StorageListResponse:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/models.StorageItem'
        next_page_token:
          type: string
        path:
          type: string
        path_shared:
          description: dir is a shared folder or inside one (owner badge)
          type: boolean
        path_synced:
          type: boolean
    models.StoragePrepareUploadRequest:
      type: object
      properties:
        business_node_id:
          type: string
        key:
          type: string
        path:
          type: string
    models.StorageCreateFolderResponse:
      type: object
      properties:
        key:
          type: string
  securitySchemes:
    BearerAuth:
      description: 'Firebase JWT token. Format: "Bearer {token}"'
      type: apiKey
      name: Authorization
      in: header