Skip to content

Users & Account Operations

Authenticated profile, private asset, upload, liked-asset and collection-management operations are grouped here. Every operation on this page requires a bearer token.

Read Your Profile

Set ICOSA_ACCESS_TOKEN securely in your environment. Examples intentionally avoid exposing tokens in frontend JavaScript.

curl --fail-with-body \
  --header "Authorization: Bearer $ICOSA_ACCESS_TOKEN" \
  "https://galleryapi.dabbble.app/v1/users/me"
<?php
$url = 'https://galleryapi.dabbble.app/v1/users/me';
$headers = "Accept: application/json\r\n";
$token = getenv('ICOSA_ACCESS_TOKEN');
if (!$token) { exit('Set ICOSA_ACCESS_TOKEN'); }
$headers .= "Authorization: Bearer $token\r\n";
$context = stream_context_create(['http' => [
    'timeout' => 20, 'header' => $headers
]]);
$body = @file_get_contents($url, false, $context);
if ($body === false) { exit('API request failed.'); }
$data = json_decode($body, true);
if (!is_array($data)) { exit('Invalid JSON response.'); }
echo '<pre>' . htmlspecialchars(json_encode($data, JSON_PRETTY_PRINT),
    ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '</pre>';
?>
// Save as example.mjs and run: node example.mjs
const token = process.env.ICOSA_ACCESS_TOKEN;
if (!token) throw new Error('Set ICOSA_ACCESS_TOKEN');
async function main() {
  const response = await fetch('https://galleryapi.dabbble.app/v1/users/me', {
    headers: { Accept: 'application/json', Authorization: `Bearer ${token}` },
    signal: AbortSignal.timeout(20000)
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  console.log(await response.json());
}
main().catch(error => { console.error(error.message); process.exitCode = 1; });
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError

headers = {'Accept': 'application/json'}
headers['Authorization'] = 'Bearer ' + os.environ['ICOSA_ACCESS_TOKEN']
request = Request('https://galleryapi.dabbble.app/v1/users/me', headers=headers)
try:
    with urlopen(request, timeout=20) as response:
        data = json.load(response)
    print(json.dumps(data, indent=2))
except (HTTPError, URLError, TimeoutError, ValueError) as error:
    print(f'API request failed: {error}')
using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using var client = new HttpClient { Timeout = TimeSpan.FromSeconds(20) };
client.DefaultRequestHeaders.Accept.ParseAdd("application/json");
var token = Environment.GetEnvironmentVariable("ICOSA_ACCESS_TOKEN")
    ?? throw new InvalidOperationException("Set ICOSA_ACCESS_TOKEN");
client.DefaultRequestHeaders.Authorization =
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
try
{
    using var response = await client.GetAsync("https://galleryapi.dabbble.app/v1/users/me");
    response.EnsureSuccessStatusCode();
    using var document = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
    Console.WriteLine(document.RootElement);
}
catch (Exception error) when (error is HttpRequestException
    or TaskCanceledException or JsonException)
{
    Console.Error.WriteLine(error.Message);
}

Account Workflows

Profile updates

Response fields use displayName, while PATCH bodies use displayname. Preserve that casing difference. Updates accept url, displayname and description, all optional and nullable.

Asset uploads

Creation uses multipart form data. The declared fields are files, triangleCount, remixIds and formatOverride. None of these individual fields is marked required, although the request body itself is required. Do not interpret this as a guarantee that an empty upload will be accepted.

A successful upload returns UploadJobSchemaOut containing assetId and publishUrl. Publication steps, supported file extensions, limits and processing states are not described.

Thumbnails

Both thumbnail upload operations require multipart field image. Let your HTTP client generate the multipart boundary. Do not send a filename string as though it were file content.

Collection writes

Creation requires name; other fields are optional. PATCH fields are all optional. The membership field is exactly asset_url, an array, not assetUrls.

The dedicated PUT set_assets operation overwrites membership. Review the intended final list before calling it. The response wrapper contains collection and may include rejectedAssetUrls; inspect rejections rather than assuming every asset was accepted.

Deletion

Deletion changes stored content and should require a deliberate user decision. HTTP 204 responses have no JSON body. Do not parse them as JSON.

Upload Examples

These examples upload a local file and therefore change server state. Run them only when intended. Format and filename examples are illustrative, not a guarantee of accepted extensions.

curl --fail-with-body \
  --header "Authorization: Bearer $ICOSA_ACCESS_TOKEN" \
  --form "[email protected]" \
  --form "triangleCount=25000" \
  "https://galleryapi.dabbble.app/v1/users/me/assets"
import { readFile } from 'node:fs/promises';
const token = process.env.ICOSA_ACCESS_TOKEN;
if (!token) throw new Error('Set ICOSA_ACCESS_TOKEN');
const form = new FormData();
form.append('files', new Blob([await readFile('model.glb')]), 'model.glb');
form.append('triangleCount', '25000');
const response = await fetch('https://galleryapi.dabbble.app/v1/users/me/assets', {
  method: 'POST', headers: { Authorization: `Bearer ${token}` },
  body: form, signal: AbortSignal.timeout(60000)
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
import json
import os
from pathlib import Path
from urllib.request import Request, urlopen
from uuid import uuid4
boundary = uuid4().hex
body = (
    f'--{boundary}\r\n'
    'Content-Disposition: form-data; name="files"; filename="model.glb"\r\n'
    'Content-Type: application/octet-stream\r\n\r\n'
).encode() + Path('model.glb').read_bytes() + (
    f'\r\n--{boundary}--\r\n'
).encode()
request = Request(
    'https://galleryapi.dabbble.app/v1/users/me/assets',
    data=body, method='POST', headers={
        'Authorization': 'Bearer ' + os.environ['ICOSA_ACCESS_TOKEN'],
        'Content-Type': f'multipart/form-data; boundary={boundary}'
    }
)
with urlopen(request, timeout=60) as response:
    print(json.load(response))

The Python template reads the file into memory; choose a streaming upload approach for large files. Upload examples let HTTP exceptions fail visibly rather than pretending a failed upload succeeded.

Endpoint Reference

Public author and licence filters are not declared on the private asset-list endpoint; it instead includes visibility. Liked assets expose the public-style filters. Only send parameters declared for the specific operation.

GET /v1/users/me

Show My User

Authentication: HTTP bearer token.

Status Description Response schema
200 OK FullUserSchema

PATCH /v1/users/me

Update My User

Authentication: HTTP bearer token.

Request body: required.

Content type: application/json.

Body schema: PatchUserSchema.

Status Description Response schema
200 OK FullUserSchema

GET /v1/users/me/assets

List My Assets

Authentication: HTTP bearer token.

Parameter Location Type Required Details
category query FilterCategory or null No
curated query boolean or null No
format query array of FilterFormat or null No Filter by format
keywords query string or null No
name query string or null No
description query string or null No
tag query array of string No
triangleCountMin query integer or null No
triangleCountMax query integer or null No
maxComplexity query FilterComplexity or null No
zipArchiveUrl query string or null No
inCollection query boolean or null No
visibility query string or null No
orderBy query FilterOrder or null No
pageToken query string or null No
pageSize query string or null No
Status Description Response schema
200 OK PagedAssetSchemaPrivate

POST /v1/users/me/assets

Create A New Asset

Authentication: HTTP bearer token.

Request body: required.

Content type: multipart/form-data.

Field Type Required
triangleCount integer or null No
remixIds array of string or null No
formatOverride array of string or null No
files array of string (binary) or null No
Status Description Response schema
201 Created UploadJobSchemaOut

GET /v1/users/me/assets/{asset_url}

Show An Asset

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_url path string Yes
Status Description Response schema
200 OK AssetSchemaPrivate

DELETE /v1/users/me/assets/{asset_url}

Delete An Asset

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_url path string Yes
Status Description Response schema
204 No Content No body declared
400 Bad Request Error

POST /v1/users/me/assets/{asset_url}/set_thumbnail

Set An Image For An Asset

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_url path string Yes

Request body: required.

Content type: multipart/form-data.

Field Type Required
image string (binary) Yes
Status Description Response schema
201 Created ImageSchema
400 Bad Request Error

GET /v1/users/me/likedassets

List My Likedassets

Authentication: HTTP bearer token.

Parameter Location Type Required Details
category query FilterCategory or null No
curated query boolean or null No
format query array of FilterFormat or null No Filter by format
keywords query string or null No
name query string or null No
description query string or null No
tag query array of string No
triangleCountMin query integer or null No
triangleCountMax query integer or null No
maxComplexity query FilterComplexity or null No
zipArchiveUrl query string or null No
inCollection query boolean or null No
authorName query string or null No
authorId query string or null No
license query FilterLicense or null No
orderBy query FilterOrder or null No
pageToken query string or null No
pageSize query string or null No
Status Description Response schema
200 OK PagedAssetSchema

GET /v1/users/me/collections

Get My Collections

Authentication: HTTP bearer token.

Parameter Location Type Required Details
pageToken query string or null No
pageSize query string or null No
Status Description Response schema
200 OK PagedAssetCollectionSchema

POST /v1/users/me/collections

Create A Collection

Authentication: HTTP bearer token.

Request body: required.

Content type: application/json.

Body schema: AssetCollectionPostSchema.

Status Description Response schema
201 Created AssetCollectionSchemaWithRejections
400 Bad Request Error

GET /v1/users/me/collections/{asset_collection_url}

Show A Collection

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_collection_url path string Yes
Status Description Response schema
200 OK AssetCollectionSchema

PATCH /v1/users/me/collections/{asset_collection_url}

Update A Collection

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_collection_url path string Yes

Request body: required.

Content type: application/json.

Body schema: AssetCollectionPatchSchema.

Status Description Response schema
200 OK AssetCollectionSchemaWithRejections
400 Bad Request Error

DELETE /v1/users/me/collections/{asset_collection_url}

Delete A Collection

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_collection_url path string Yes
Status Description Response schema
204 No Content No body declared

PUT /v1/users/me/collections/{asset_collection_url}/set_assets

Overwrite Assets For A Collection

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_collection_url path string Yes

Request body: required.

Content type: application/json.

Body schema: AssetCollectionPutSchema.

Status Description Response schema
200 OK AssetCollectionSchemaWithRejections
400 Bad Request Error

POST /v1/users/me/collections/{asset_collection_url}/set_thumbnail

Set An Image For A Collection

Authentication: HTTP bearer token.

Parameter Location Type Required Details
asset_collection_url path string Yes

Request body: required.

Content type: multipart/form-data.

Field Type Required
image string (binary) Yes
Status Description Response schema
201 Created ImageSchema
400 Bad Request Error

Request and Response Schemas

Public asset fields are documented under Assets. Private assets add state. Nested file metadata is under Files & Formats. state and list-query visibility are plain strings without declared enums; do not infer their full accepted vocabulary from collection visibility values.

FullUserSchema

Field Type Required Details
id integer Yes
username string Yes
email string (email) Yes
displayName string or null No
description string or null No
url string Yes

PatchUserSchema

Field Type Required Details
url string or null No
displayname string or null No
description string or null No

AssetSchemaPrivate

Field Type Required Details
authorId string or null No
authorName string Yes
name string Yes
description string or null Yes
createTime string (date-time) Yes
updateTime string (date-time) or null Yes
url string or null Yes
assetId string Yes
displayName string or null Yes
visibility string Yes
tags array of string No Default: [].
isCurated boolean or null No
thumbnail Thumbnail or null Yes
triangleCount integer Yes
license string Yes
licenseVersion string or null Yes
isIcosaGalleryCompatible boolean Yes
presentationParams object or null No
formats array of AssetFormat Yes
state string Yes

PagedAssetSchemaPrivate

Field Type Required Details
assets array of AssetSchemaPrivate Yes
totalSize integer Yes
nextPageToken string or null No

UploadJobSchemaOut

Field Type Required Details
publishUrl string Yes
assetId string Yes

AssetMetaData

Field Type Required Details
triangleCount integer or null No
remixIds array of string or null No
formatOverride array of string or null No

AssetCollectionPostSchema

Field Type Required Details
name string Yes
description string or null No
visibility AssetVisibility or null No
asset_url array of string or null No

AssetCollectionPatchSchema

Field Type Required Details
name string or null No
description string or null No
visibility AssetVisibility or null No
asset_url array of string or null No

AssetCollectionPutSchema

Field Type Required Details
asset_url array of string or null No

AssetCollectionSchemaWithRejections

Field Type Required Details
collection AssetCollectionSchema Yes
rejectedAssetUrls array of string or null No

AssetVisibility

PRIVATE, PUBLIC, UNLISTED

Error

Field Type Required Details
message string Yes