Skip to content
Storage Server Reference

Self-Hosting Storage

An S3 compatible object storage service that integrates with Postgres.

  • Uses Postgres as it's datastore for storing metadata
  • Authorization rules are written as Postgres Row Level Security policies
  • Integrates with S3 as the storage backend (with more in the pipeline!)
  • Extremely lightweight and performant

Create a bucket

post/bucket/

Body

  • name
    Required
    string
  • id
    Optional
    string
  • public
    Optional
    boolean
  • type
    Optional
    enum
  • file_size_limit
    Optional
    any of the following options
  • allowed_mime_types
    Optional
    Array<string>

Response codes

  • 200
  • 4XX

Response (200)

{
"name": "avatars"
}

Gets all buckets

head/bucket

Query parameters

  • limit
    Optional
    integer
  • offset
    Optional
    integer
  • sortColumn
    Optional
    enum
  • sortOrder
    Optional
    enum
  • search
    Optional
    string

Response codes

  • 200
  • 4XX

Response (200)

[
{
"id": "bucket2",
"name": "bucket2",
"public": false,
"file_size_limit": 1000000,
"allowed_mime_types": [
"image/png",
"image/jpeg"
],
"owner": "4d56e902-f0a0-4662-8448-a4d9e643c142",
"created_at": "2021-02-17T04:43:32.770206+00:00",
"updated_at": "2021-02-17T04:43:32.770206+00:00"
}
]

Empty a bucket

post/bucket/{bucketId}/empty

Path parameters

  • bucketId
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"message": "Empty bucket has been queued. Completion may take up to an hour."
}

Get details of a bucket

head/bucket/{bucketId}

Path parameters

  • bucketId
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"id": "lorem",
"name": "lorem",
"owner": "lorem",
"owner_id": "lorem",
"public": true,
"type": "STANDARD",
"created_at": "lorem",
"updated_at": "lorem"
}

Update properties of a bucket

put/bucket/{bucketId}

Path parameters

  • bucketId
    Required
    string

Body

Any of the following:

Response codes

  • 200
  • 4XX

Response (200)

{
"message": "Successfully updated"
}

Delete a bucket

delete/bucket/{bucketId}

Path parameters

  • bucketId
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"message": "Successfully deleted"
}

Delete an object

delete/object/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"message": "Successfully deleted"
}

Get object

get/object/{bucketName}/{*}

Serve objects

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Response codes

  • 4XX

Update the object at an existing key

put/object/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"Id": "lorem",
"Key": "avatars/folder/cat.png"
}

Upload a new object

post/object/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"Id": "lorem",
"Key": "avatars/folder/cat.png"
}

Delete multiple objects

delete/object/{bucketName}

Path parameters

  • bucketName
    Required
    string

Body

  • prefixes
    Required
    Array<string>

Response codes

  • 200
  • 4XX

Response (200)

[
{
"name": "folder/cat.png",
"bucket_id": "avatars",
"owner": "317eadce-631a-4429-a0bb-f19a7a517b4a",
"id": "eaa8bdb5-2e00-4767-b5a9-d2502efe2196",
"updated_at": "2021-04-06T16:30:35.394674+00:00",
"created_at": "2021-04-06T16:30:35.394674+00:00",
"last_accessed_at": "2021-04-06T16:30:35.394674+00:00",
"metadata": {
"size": 1234
}
}
]

Retrieve an object

get/object/authenticated/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Query parameters

  • download
    Optional
    string

Response codes

  • 4XX

Generate a presigned url to retrieve an object

post/object/sign/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Body

  • expiresIn
    Required
    integer
  • transform
    Optional
    object

Response codes

  • 200
  • 4XX

Response (200)

{
"signedURL": "/object/sign/avatars/folder/cat.png?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJhdmF0YXJzL2ZvbGRlci9jYXQucG5nIiwiaWF0IjoxNjE3NzI2MjczLCJleHAiOjE2MTc3MjcyNzN9.s7Gt8ME80iREVxPhH01ZNv8oUn4XtaWsmiQ5csiUHn4"
}

Retrieve an object via a presigned URL

head/object/sign/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Query parameters

  • download
    Optional
    string
  • token
    Required
    string

Response codes

  • 4XX

Generate presigned urls to retrieve objects

post/object/sign/{bucketName}

Path parameters

  • bucketName
    Required
    string

Body

  • expiresIn
    Required
    integer
  • paths
    Required
    Array<string>

Response codes

  • 200
  • 4XX

Response (200)

[
{
"error": "Either the object does not exist or you do not have access to it",
"path": "folder/cat.png",
"signedURL": "/object/sign/avatars/folder/cat.png?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJhdmF0YXJzL2ZvbGRlci9jYXQucG5nIiwiaWF0IjoxNjE3NzI2MjczLCJleHAiOjE2MTc3MjcyNzN9.s7Gt8ME80iREVxPhH01ZNv8oUn4XtaWsmiQ5csiUHn4"
}
]

Moves an object

post/object/move

Body

  • bucketId
    Required
    string
  • sourceKey
    Required
    string
  • destinationBucket
    Optional
    string
  • destinationKey
    Required
    string

Response codes

  • 200
  • 4XX

Response (200)

{
"message": "Successfully moved"
}

Search for objects under a prefix

post/object/list/{bucketName}

Path parameters

  • bucketName
    Required
    string

Body

  • prefix
    Required
    string
  • limit
    Optional
    integer
  • offset
    Optional
    integer
  • sortBy
    Optional
    object
  • search
    Optional
    string

Response codes

  • 200
  • 4XX

Response (200)

[
{
"name": "folder/cat.png",
"bucket_id": "avatars",
"owner": "317eadce-631a-4429-a0bb-f19a7a517b4a",
"id": "eaa8bdb5-2e00-4767-b5a9-d2502efe2196",
"updated_at": "2021-04-06T16:30:35.394674+00:00",
"created_at": "2021-04-06T16:30:35.394674+00:00",
"last_accessed_at": "2021-04-06T16:30:35.394674+00:00",
"metadata": {
"size": 1234
}
}
]

Retrieve object info

head/object/info/{bucketName}/{*}

Object Info

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Query parameters

  • height
    Optional
    integer
  • width
    Optional
    integer
  • resize
    Optional
    enum
  • format
    Optional
    enum
  • quality
    Optional
    integer

Response codes

  • 4XX

Copies an object

post/object/copy

Body

  • bucketId
    Required
    string
  • sourceKey
    Required
    string
  • destinationBucket
    Optional
    string
  • destinationKey
    Required
    string
  • metadata
    Optional
    object
  • copyMetadata
    Optional
    boolean

Response codes

  • 200
  • 4XX

Response (200)

{
"Id": "lorem",
"Key": "folder/destination.png",
"name": "lorem",
"bucket_id": "lorem",
"owner": "lorem",
"owner_id": "lorem",
"version": "lorem",
"id": "lorem",
"updated_at": "lorem",
"created_at": "lorem",
"last_accessed_at": "lorem",
"metadata": {},
"user_metadata": {},
"buckets": {
"id": "bucket2",
"name": "bucket2",
"public": false,
"file_size_limit": 1000000,
"allowed_mime_types": [
"image/png",
"image/jpeg"
],
"owner": "4d56e902-f0a0-4662-8448-a4d9e643c142",
"created_at": "2021-02-17T04:43:32.770206+00:00",
"updated_at": "2021-02-17T04:43:32.770206+00:00"
}
}

Retrieve an object from a public bucket

get/object/public/{bucketName}/{*}

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Query parameters

  • download
    Optional
    string

Response codes

  • 4XX

Get object info

get/object/info/public/{bucketName}/{*}

returns object info

Path parameters

  • bucketName
    Required
    string
  • *
    Required
    string

Query parameters

  • height
    Optional
    integer
  • width
    Optional
    integer
  • resize
    Optional
    enum
  • format
    Optional
    enum
  • quality
    Optional
    integer

Response codes

  • 4XX