Resourcly storage API
The storage API from Resourcly — 7 operation(s) for storage.
The storage API from Resourcly — 7 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/resourcly-storage-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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:
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