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.
<?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 |