v1Resources/Data

Data

The unified asset library behind the Data tab: the paginated multi-source catalog (uploads, generated images, synced media, GBP-imported photos, user-submitted media), folders, and the asset-tag vocabulary. Distinct from locations/tags's location-grouping tags.

Returns every asset tag defined in your agency.

List asset tags

get/api/v1/tags
media:read
Response
dataobjectoptional
tagsarray of objectoptional
The agency's asset tags.
idstringoptional
namestringoptional
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/tags
Your API key
{
  "data": {
    "tags": [
      {
        "id": "tag_1",
        "name": "VIP"
      },
      {
        "id": "tag_2",
        "name": "Seasonal"
      }
    ]
  }
}
v1Resources/Data/postCreate an asset tag

Creates a new asset tag with the given name.

Create an asset tag

post/api/v1/tags
media:write
Request body
namestringrequired
The tag's name.
Response
dataobjectoptional
idstringoptional
Unique identifier for the newly created tag.
namestringoptional
The tag's name.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/tags
Your API key
Request body*
{
  "data": {
    "id": "tag_1",
    "name": "VIP"
  }
}
v1Resources/Data/patchRename an asset tag

Renames a tag. If another tag already has the target name, the two are merged: every asset tagged with either ends up tagged with the surviving name.

Rename an asset tag

patch/api/v1/tags/{id}
media:write
Query parameters
idstringrequired
The tag to rename.
Request body
namestringrequired
The tag's new name. Required.
Response
dataobjectoptional
idstringoptional
Unique identifier for the newly created tag.
namestringoptional
The tag's name.
countnumberoptional
The number of assets now carrying this tag.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
patch/api/v1/tags/{id}
Your API key
id *
Request body*
{
  "data": {
    "id": "tag_1",
    "name": "VIP Clients",
    "count": 12
  }
}
v1Resources/Data/deleteDelete an asset tag

Deletes an asset tag. This does not delete the assets it was attached to. assetsUntagged in the response says how many were untagged.

Delete an asset tag

delete/api/v1/tags/{id}
media:write
Query parameters
idstringrequired
ID of the asset tag to delete.
Response
dataobjectoptional
assetsUntaggednumberoptional
Number of assets that had this tag — all of them lost the assignment when the tag was deleted.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/tags/{id}
Your API key
id *
{
  "data": {
    "assetsUntagged": 5
  }
}
v1Resources/Data/postAdd assets to a tag

Attaches one or more assets, by key, to an existing asset tag.

Add assets to a tag

post/api/v1/tags/{id}/assets
media:write
Query parameters
idstringrequired
ID of the asset tag.
Request body
assetKeysarray of stringrequired
Keys of the assets to attach to this tag.
Response
dataobjectoptional
addedarray of stringoptional
Keys of the assets actually attached — an asset already carrying this tag is not duplicated.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/tags/{id}/assets
Your API key
id *
Request body*
{
  "data": {
    "added": [
      "upload:abc123",
      "gmb:xyz789"
    ]
  }
}
v1Resources/Data/deleteRemove an asset from a tag

Detaches a single asset, by key, from an asset tag.

Remove an asset from a tag

delete/api/v1/tags/{id}/assets
media:write
Query parameters
idstringrequired
ID of the asset tag.
assetKeystringrequired
Key of the asset to remove from this tag.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/tags/{id}/assets
Your API key
id *
assetKey *
{}
v1Resources/Data/getList assets

Returns a paginated, newest-first slice of the unified asset catalog — uploads, AI-generated images, synced media-library assets, GBP-imported photos, and user-submitted (UGC) media, merged into one feed.

List assets

get/api/v1/assets
media:read
Query parameters
sourcestring (all | upload | gmb | generated | discovered | ugc)optional
Narrow to one source tab: all (default), upload, gmb, generated, discovered, or ugc.
typestringoptional
Narrow to one asset kind, e.g. image or video.
folderIdstringoptional
Narrow to assets in this folder.
tagstringoptional
Narrow to assets carrying this tag name.
locationIdstringoptional
Narrow to assets assigned to this location. Look it up with GET /api/v1/locations.
clientIdstringoptional
The client to scope results to. Required when this key is restricted to specific clients and no locationId is given. Look it up with GET /api/v1/clients.
qstringoptional
Search by title or filename.
cursorstringoptional
Pagination cursor from a previous response's nextCursor.
limitnumberoptional
Max items to return. Default 60, max 200.
statusstring (needs_review | spam | ok | skipped)optional
Moderation-status filter — only applies when source is ugc: needs_review, spam, ok, or skipped.
Response
dataobjectoptional
itemsarray of objectoptional
The page of assets.
keystringoptional
Composite identifier for the asset, formatted as "<source>:<id>".
sourcestringoptional
Where this asset originated (e.g. an OS upload vs. an imported source).
idstringoptional
The asset's id within its source.
titlestringoptional
The asset's title.
filenamestringoptional
The asset's original filename.
mimestringoptional
The asset's MIME type.
kindstringoptional
The asset's kind (photo or video).
sizeBytesnumberoptional
File size in bytes, or null when unknown.
urlstringoptional
Ready-to-use URL for the asset's bytes.
thumbnailUrlstringoptional
URL of a thumbnail preview, or null.
tagsarray of stringoptional
Tags attached to the asset.
folderIdsarray of stringoptional
Asset folders this asset belongs to.
locationIdsarray of stringoptional
Every location this asset is associated with.
nextCursorstringoptional
Pass as cursor on the next call to fetch the following page. Null when there are no more.
countsobjectoptional
Per-tab totals (all/upload/gmb/generated/discovered/ugc), independent of the active filters.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/assets
Your API key
source
type
folderId
tag
locationId
clientId
q
cursor
limit
status
{
  "data": {
    "items": [
      {
        "key": "upload:abc123",
        "source": "upload",
        "id": "abc123",
        "title": "Storefront photo",
        "filename": "storefront.jpg",
        "mime": "image/jpeg",
        "kind": "image",
        "sizeBytes": 482913,
        "url": "https://cdn.synup.com/media/abc123.jpg",
        "thumbnailUrl": "https://cdn.synup.com/media/abc123-thumb.jpg",
        "tags": [
          "VIP"
        ],
        "folderIds": [
          "folder_1"
        ],
        "locationIds": [
          "loc_456"
        ]
      }
    ],
    "nextCursor": null,
    "counts": {
      "all": 1,
      "upload": 1,
      "gmb": 0,
      "generated": 0,
      "discovered": 0,
      "ugc": 0
    }
  }
}
v1Resources/Data/getList folders

Returns every folder in this agency, with its item count and source mix.

List folders

get/api/v1/folders
media:read
Query parameters
scopeTypestring (account | client | location | brand)optional
Narrow to folders scoped to this type: account, client, location, or brand.
scopeIdstringoptional
Narrow to folders scoped to this id. Requires scopeType.
Response
dataobjectoptional
itemsarray of objectoptional
idstringoptional
Unique identifier for the folder.
namestringoptional
The folder's name.
descriptionstringoptional
The folder's description, or null.
itemCountnumberoptional
Number of assets currently in the folder.
sourceMixarray of stringoptional
The distinct asset sources present in the folder.
scopeobjectoptional
The folder's scope, or null when it's agency-wide.
typestring (account | client | location | brand)optional
idstringoptional
sharingobjectoptional
The folder's public-sharing state.
accessstring (restricted | link)optional
urlstringoptional
createdAtstringoptional
When the folder was created, as an ISO 8601 timestamp.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/folders
Your API key
scopeType
scopeId
{
  "data": {
    "items": [
      {
        "id": "folder_1",
        "name": "Storefront Photos",
        "description": null,
        "itemCount": 12,
        "sourceMix": [
          "upload",
          "gmb"
        ],
        "scope": {
          "type": "client",
          "id": "cli_123"
        },
        "sharing": {
          "access": "restricted",
          "url": null
        },
        "createdAt": "2026-01-15T10:00:00.000Z"
      }
    ]
  }
}
v1Resources/Data/postCreate a folder

Creates a new, empty folder. Add assets to it with POST /api/v1/folders/{id}/items.

Create a folder

post/api/v1/folders
media:write
Request body
namestringrequired
The folder's name. Required.
descriptionstringoptional
An optional description.
scopeTypestring (account | client | location | brand)optional
Optional scope: account, client, location, or brand. Unscoped folders are agency-wide.
scopeIdstringoptional
The id for scopeType, when given.
Response
dataobjectoptional
folderobjectoptional
idstringoptional
Unique identifier for the folder.
namestringoptional
The folder's name.
descriptionstringoptional
The folder's description, or null.
itemCountnumberoptional
Number of assets currently in the folder.
sourceMixarray of stringoptional
The distinct asset sources present in the folder.
scopeobjectoptional
The folder's scope, or null when it's agency-wide.
typestring (account | client | location | brand)optional
idstringoptional
sharingobjectoptional
The folder's public-sharing state.
accessstring (restricted | link)optional
urlstringoptional
createdAtstringoptional
When the folder was created, as an ISO 8601 timestamp.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/folders
Your API key
Request body*
{
  "data": {
    "folder": {
      "id": "folder_1",
      "name": "Storefront Photos",
      "description": null,
      "itemCount": 0,
      "sourceMix": [],
      "scope": null,
      "sharing": {
        "access": "restricted",
        "url": null
      },
      "createdAt": "2026-01-15T10:00:00.000Z"
    }
  }
}
v1Resources/Data/getGet a folder

Returns one folder's detail. Its contents are GET /api/v1/assets?folderId={id}.

Get a folder

get/api/v1/folders/{id}
media:read
Query parameters
idstringrequired
The folder to look up.
Response
dataobjectoptional
folderobjectoptional
idstringoptional
Unique identifier for the folder.
namestringoptional
The folder's name.
descriptionstringoptional
The folder's description, or null.
itemCountnumberoptional
Number of assets currently in the folder.
sourceMixarray of stringoptional
The distinct asset sources present in the folder.
scopeobjectoptional
The folder's scope, or null when it's agency-wide.
typestring (account | client | location | brand)optional
idstringoptional
sharingobjectoptional
The folder's public-sharing state.
accessstring (restricted | link)optional
urlstringoptional
createdAtstringoptional
When the folder was created, as an ISO 8601 timestamp.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/folders/{id}
Your API key
id *
{
  "data": {
    "folder": {
      "id": "folder_1",
      "name": "Storefront Photos",
      "description": null,
      "itemCount": 12,
      "sourceMix": [
        "upload",
        "gmb"
      ],
      "scope": {
        "type": "client",
        "id": "cli_123"
      },
      "sharing": {
        "access": "restricted",
        "url": null
      },
      "createdAt": "2026-01-15T10:00:00.000Z"
    }
  }
}
v1Resources/Data/patchUpdate a folder

Renames a folder or edits its description or scope.

Update a folder

patch/api/v1/folders/{id}
media:write
Query parameters
idstringrequired
The folder to update.
Request body
namestringoptional
New name.
descriptionstringoptional
New description, or null to clear it.
scopeTypestring (account | client | location | brand)optional
New scope type: account, client, location, or brand.
scopeIdstringoptional
The id for scopeType, when given.
Response
dataobjectoptional
folderobjectoptional
idstringoptional
Unique identifier for the folder.
namestringoptional
The folder's name.
descriptionstringoptional
The folder's description, or null.
itemCountnumberoptional
Number of assets currently in the folder.
sourceMixarray of stringoptional
The distinct asset sources present in the folder.
scopeobjectoptional
The folder's scope, or null when it's agency-wide.
typestring (account | client | location | brand)optional
idstringoptional
sharingobjectoptional
The folder's public-sharing state.
accessstring (restricted | link)optional
urlstringoptional
createdAtstringoptional
When the folder was created, as an ISO 8601 timestamp.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
patch/api/v1/folders/{id}
Your API key
id *
Request body
{
  "data": {
    "folder": {
      "id": "folder_1",
      "name": "Storefront Photos (2026)",
      "description": "Current-season storefront shots",
      "itemCount": 12,
      "sourceMix": [
        "upload",
        "gmb"
      ],
      "scope": {
        "type": "client",
        "id": "cli_123"
      },
      "sharing": {
        "access": "restricted",
        "url": null
      },
      "createdAt": "2026-01-15T10:00:00.000Z"
    }
  }
}
v1Resources/Data/deleteDelete a folder

Deletes the folder. Its assets are untouched — they only lose their folder membership. itemsRemoved and shareLinksRevoked in the response report how many things quietly went with it.

Delete a folder

delete/api/v1/folders/{id}
media:write
Query parameters
idstringrequired
The folder to delete.
Response
dataobjectoptional
itemsRemovednumberoptional
Number of items (assets) that were removed from the folder — this many FolderItem assignments were deleted along with it.
shareLinksRevokednumberoptional
Number of active share links for this folder that were revoked when it was deleted.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/folders/{id}
Your API key
id *
{
  "data": {
    "itemsRemoved": 12,
    "shareLinksRevoked": 1
  }
}
v1Resources/Data/postShare a folder

Issues (or rotates) a public link for the folder. Rotating revokes any link issued before it.

Share a folder

post/api/v1/folders/{id}/share
media:write
Query parameters
idstringrequired
The folder to share.
Response
dataobjectoptional
urlstringoptional
The public share URL.
accessstring (link)optional
Always "link" on success.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/folders/{id}/share
Your API key
id *
{
  "data": {
    "url": "https://synup.com/s/aB3dE9fGhJ",
    "access": "link"
  }
}
v1Resources/Data/deleteUnshare a folder

Revokes the folder's public link.

Unshare a folder

delete/api/v1/folders/{id}/share
media:write
Query parameters
idstringrequired
The folder to unshare.
Response
dataobjectoptional
accessstring (restricted)optional
Always "restricted" on success.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/folders/{id}/share
Your API key
id *
{
  "data": {
    "access": "restricted"
  }
}
v1Resources/Data/postAdd assets to a folder

Adds each given asset key to the folder. Already-present keys are ignored.

Add assets to a folder

post/api/v1/folders/{id}/items
media:write
Query parameters
idstringrequired
The folder to add assets to.
Request body
assetKeysarray of stringrequired
Opaque "<source>:<id>" asset keys to add. Required, non-empty.
Response
dataobjectoptional
idstringoptional
itemCountnumberoptional
The folder's item count after the change.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/folders/{id}/items
Your API key
id *
Request body*
{
  "data": {
    "id": "folder_1",
    "itemCount": 13
  }
}
v1Resources/Data/deleteRemove an asset from a folder

Removes one asset's membership in the folder. A no-op success if it wasn't a member.

Remove an asset from a folder

delete/api/v1/folders/{id}/items
media:write
Query parameters
idstringrequired
The folder to remove the asset from.
assetKeystringrequired
The opaque "<source>:<id>" asset key to remove. Passed as a query parameter (percent-encode the colon), not a path segment.
Response
dataobjectoptional
idstringoptional
itemCountnumberoptional
The folder's item count after the change.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/folders/{id}/items
Your API key
id *
assetKey *
{
  "data": {
    "id": "folder_1",
    "itemCount": 12
  }
}