DAM Wiki

Frontify API

Frontify AG · St. Gallen, Switzerland · Founded 2013 · independent, VC-backedVerified 2026-09-30 · 179 sources
  • SaaS
  • Enterprise
  • GraphQL API
  • Webhooks
  • SAML · OIDC SSO
  • MCP: Frontify MCP Server
Complete · 7 of 7 pages
179sources
2API specs
09-30verified 2026
Official website ↗Frontify alternatives →

Scope: the public GraphQL API of a Frontify instance (DAM, guidelines, templates, workflows), its OAuth/Service-App authentication, webhooks, the URL-based Media Processing API (CDN) and the embeddable JavaScript widgets. Browser-side extension SDKs (Brand SDK: content blocks, apps, themes) and the hosted MCP server are summarised here and detailed in Integrations.

At a glance

API styles
GraphQL only for data access (queries ≈ GET, mutations ≈ POST/PUT/DELETE) S13 S32; URL-parameter Media Processing API on the CDN for renditions S56 S57; OAuth 2 token endpoints are plain HTTP forms S8. No public REST data API documented.
Base URL(s)
POSThttps://{tenant-domain}/graphql — every customer has its own domain, which may be a custom domain rather than a *.frontify.com subdomain S32. OAuth: https://{tenant-domain}/api/oauth/{authorize|accesstoken|refresh|revoke} S8. Developer tokens UI: https://{tenant-domain}/oauth-access-token S8 S74. CDN: https://media.ffycdn.net/…?mod=v1/{transformations} S57. MCP: https://mcp.frontify-integrations.com/mcp[/packs/{pack}] S66 S67
Current version(s) & deprecations
Unversioned, evolving schema (no version in the URL). Change policy: breaking/"dangerous" changes roll out on 1 January and 1 July with ≥ 6 months' notice; beta members are exempt and can change without notice S34 S15. Webhooks exist as v1 (3 actions) and v2 (granular events, since 2025-09-01) S35 S42. Notable deprecations: legacy MetadataField/metadataValues operations → CustomMetadata (removal date 2026-07-01 in the schema), project(id) query → node(id), manual uploadFile.chunkSize (2026-01-01), long-lived developer tokens for production (January 2026) S34 S62
Auth methods
Bearer token in Authorization header on every request S8 S32. Three ways to obtain one: Service Apps (OAuth 2 client credentials, machine-to-machine, beta), OAuth 2 authorization code (+ PKCE mandatory for public clients), personal developer tokens (testing/setup only) S8 S9
Token lifetime / refresh
Client-credentials example returns expires_in: 2592000 (30 days) and refresh_token: null — request a new token when it expires S8. OAuth access tokens: "between one week and three months, depending on configuration"; the lifetime is configurable per instance S8. Refresh via /api/oauth/refresh: returns a new access + refresh token, invalidates the old access token; refresh tokens are single-use S8. Developer tokens: 7 d, 30 d, 90 d, 6 months or 1 year; tokens issued before January 2026 carry a 10-year expiry S8 S74
Scopes / permission model
Scopes: basic:read, basic:write, account:read, webhook:read, webhook:write (finder:read, blocks:read, blocks:write exist but are ignored for the API) S11; schema enum SecurityScope has the same 5 values S62. Every response carries x-oauth-scopes S11. Scopes only cap what a token could do; actual rights come from the user behind the token (Viewer/Editor/Owner roles per library/project/guideline, account settings), exposed as boolean currentUserPermissions.can* fields on major entities S7 S10
Official spec
No single downloadable schema; introspection is disabled for anonymous calls S65 and must be enabled per customer account for the Explorer S14. The official reference publishes raw SDL per schema member S62; assembled archived copy (19 queries, 143 mutations, 853 members) on DAM Wiki: API spec downloads. Legacy generated reference (19 queries / 144 mutations / 699 types, beta flags) S63. GraphiQL-based GraphQL Explorer S64
Rate limits
2,500 requests per 5-minute rolling window; above that → HTTP 429, keep sending and the block lasts longer; a move to a leaky-bucket model is announced S12. Query complexity is capped (a guideline-content query "exceeding the maximum allowed complexity of 100 000 000" fails) and responses report extensions.complexityScore S28 S31 S65. Whether the limit is per token, user or account is Not public
Pagination
Offset style everywhere: limit (max 100, default 25) + page (1-based), results in *Items { total, page, limit, hasNextPage, items } S16 S62. Cursor style only for Library.searchAssets (cursor → nextCursor) S20. Term searches capped at 10,000 results S20
Webhooks / events
Yes — API-managed (GraphQL mutations), installed per library or workspace project, asset events only; HMAC-SHA256 signed; 10 retries then auto-uninstall S35 S36 S37 S38
Official SDKs
No server-side GraphQL SDK. Official JS/TS packages: Frontify Finder (asset picker), Frontify Authenticator (OAuth + PKCE for SPAs), Brand SDK (@frontify/app-bridge*, @frontify/frontify-cli, @frontify/guideline-blocks-settings) for in-product extensions S43 S48 S69
Sandbox / trial access
Developer sandbox on request, reviewed case by case; Frontify says most integrations can be built safely in production using a dedicated test library S5. API access depends on the customer's plan S13 S72

Authentication

Which mode to use S8

ModeForCredentialsNotes
Service AppProduction machine-to-machineclient_id + client_secret → POST/api/oauth/accesstoken with grant_type=client_credentials, client_id, client_secret, scopes (subset of the app's scopes)Beta. Runs with the permissions of the owning user (Frontify suggests a dedicated service user). Created with the createServiceApp mutation (requires X-Frontify-Beta: enabled, typically authenticated with a developer token); the secret is shown once; listed via serviceApps, removed via deleteServiceApp S9 S17 S62
OAuth 2 authorization codeApps acting on behalf of each userOAuth client created by an account admin in the account's application settings: confidential on/off, redirect URL, allowed scopes; a client is valid only for the account where it was created (multi-account clients via developer@frontify.com) S9PKCE (S256, verifier 43–128 chars) mandatory for public clients; the Frontify Authenticator library implements it S8 S45
Developer tokenLocal development, CI, Service-App setupCreated by any user at /oauth-access-token: name, description, scopes (immutable), expiryNot for production since January 2026 S8 S34 S74

Authorization-code flow S8

  1. Redirect the user to GEThttps://{tenant-domain}/api/oauth/authorize?response_type=code&client_id=…&redirect_uri=…&scope=basic:read%20basic:write&state=…[&code_challenge=…&code_challenge_method=S256]. At least basic:read is required; scopes must be enabled on the client. The user sees a consent screen listing the scopes.
  2. Frontify redirects back with the authorization code and state (verify state against CSRF). Unverified The page names the parameter authorization_code in its example redirect URL but code elsewhere — check both.
  3. POSThttps://{tenant-domain}/api/oauth/accesstoken (JSON or multipart) with grant_type=authorization_code, code, client_id, redirect_uri, scope (+-separated), plus client_secret (confidential) or code_verifier (PKCE) → {token_type: "Bearer", expires_in, access_token, refresh_token}.
  4. Refresh: POST/api/oauth/refresh with grant_type=refresh_token, refresh_token, client_id, scope (+ client_secret if confidential).
  5. Revoke: POST/api/oauth/revoke with token and optional token_type_hint → HTTP 200.

Multi-tenancy: clients must know the customer's domain; the Authenticator lets the app fix it or lets the user type it, and returns it in bearerToken.domain S45 S46. OpenID discovery (/.well-known/openid-configuration) is not served on instances S65.

Core resources

All operations are fields on RootQuery / RootMutation of POST/graphql. "β" = flagged beta in the legacy reference (needs X-Frontify-Beta: enabled) S63. Domain grouping follows the official reference S62.

ResourceQueries / mutationsNotes
Entry pointscurrentUser, account, node(id) (any object by global ID), brands, brand(id)account needs account:read and an account owner S3 S62
Assetsasset(id), assets(ids); createAsset, createExternalAsset, updateAsset, updateAssets β, replaceAsset, moveAssets, deleteAsset (returns ID only since 2024-01-01), add/removeAssetPreviewImage, add/removeAssetRelations, add/remove/syncAssetTags S62 S34
Variants & attachmentscreateAssetVariant, replaceAssetVariant, deleteAssetVariant; createAttachment, deleteAttachmentVariants exist only in Logo and Icon libraries S41 S62
UploadsuploadFile → file ID + presigned S3 part URLsSee Uploads S19
Libraries & workspace projectslibrary(id) (Media, Icon, Logo, Document libraries), workspaceProject(id); createWorkspaceProject; project(id) deprecatedLibraries cannot be created via the API S21 S62 S34
FolderscreateFolder, updateFolder, moveFolders, deleteFolders; browse via Library.browse.folders S62 S34
CollectionscreateCollection, updateCollection, deleteCollection, add/remove/setCollectionAssets; library.collections, node … on Collection (searchable since 2025-09) S34 S62
Metadata schemacreateCustomMetadataProperty, updateCustomMetadataProperty, deleteCustomMetadataProperty, add/removeCustomMetadataPropertyOptions; read Library.customMetadataPropertiesProperties are defined per library S25. Legacy createMetadataField/deleteMetadataField deprecated S34
Metadata valuesaddCustomMetadata, removeCustomMetadata, setCustomMetadata β (bulk: many assets × many properties); read Asset.customMetadataLegacy addAssetMetadataFieldValue/removeMetadataValue deprecated S25 S34
SearchLibrary.assets(query:…), Library.searchAssets(input:…), WorkspaceProject.assets, brand.search, account search S20 S62
RightsLicenses: createLicense, deleteLicense, add/removeAssetLicense; copyright on Asset.copyright; availability window (availability, expiresAt, beginsAt input); targets: add/set/removeLibraryAssetTargets βAvailability GA since April 2026; targets require targets enabled on the library and all assets in one library per call S34 S62
WorkflowscreateWorkflowStatus β, update/deleteWorkflowStatus β, createAssetWorkflowTask β, moveWorkflowTask β, update/deleteWorkflowTask β, assignees and checklist items/presets βOne task (hence one status) per asset S23 S63
CommentscreateAssetComment, replyToComment, editComment, deleteComment, resolveAssetComment, reopenAssetComment; read Asset.comments S62
Users & collaboratorscurrentUser, account users (admin), library.collaborators.users.edges { role node }, inviteProjectUser S34 S62
BrandscreateBrand β, updateBrand β, deleteBrand β S34 S63
Brand essentialsbrand.essentials → colour palettes/colours (HEX, RGBA, CMYK variants, Pantone…) and font families/stylesBeta S29
Guidelines (brand portal content)guidelinePage β, guidelinePageBlock β, guidelineNavigationItem β; ~40 mutations to create/update/move/publish/hide documents, pages, sections, headings, blocks βContent API in progress S28 S63
Creative templatescreativeTemplate(id), creativeExport(id); exportCreative, cancelExportCreativesAsynchronous render jobs; requires a Templates licence S26 S34
Catalogs (structured business data)catalog β, catalogSelection β; create/update/remove catalogs, columns, rows, cells, ingestCatalogRows β S18 S63
Webhookswebhooks(limit, page); configureProjectWebhook (v2), installProjectWebhook (v1), uninstallWebhook S36
Service appsserviceApps β; createServiceApp β, deleteServiceApp β S17 S63
MarketplacepublishMarketplaceApp S62
RenditionsNo rendition resource; URLs are fields on asset types (previewUrl, thumbnailUrl, downloadUrl) + CDN transformations S24 S57

Data model

  • Hierarchy: everything belongs to an Account; an account holds Users and Brands; a brand holds Libraries (finalised, widely consumable assets), Workspace projects (called Projects in the UI: work-in-progress, collaboration) and Guidelines (pages) S3. Library types: MEDIA_LIBRARY, ICON_LIBRARY, LOGO_LIBRARY, DOCUMENT_LIBRARY S62; icon libraries accept SVG only S19.
  • Identifiers: global IDs are Base64-encoded JSON {"identifier": <int>, "type": "<type>"} (so they start with ey…); some queries still accept the numeric ID from UI URLs, but that is slated for deprecation S30. externalId (≤ 255 characters) stores a foreign key on assets; it is not unique S19 S22.
  • Asset vs file: a File is an uploaded binary that can back an Asset, an Attachment, a revision or a font; asset creation is separate from upload S3 S19.
  • Asset types (interface Asset): Image, Video, Audio, Document, File (fallback when unclassified or processing failed), EmbeddedContent (external URL assets) S4 S62. Classification by extension after asynchronous processing (e.g. Image: bmp, dng, eps, gif, jpg, png, psd/psb, svg, tif, webp, heif…; Video: avi, mkv, mov, mp4, webm…; Document: docx, pptx, xlsx…) S4; .ai files became Documents on 2026-05-06 S34.
  • Common asset fields: title, description, alternativeText, isDecorative (images), author, tags (source: MANUAL or AUTO for AI tags), copyright, licenses, availability {from,to}, expiresAt, status (PROCESSING, FINISHED, PROCESSING_FAILED), customMetadata, workflowTask, location (folder breadcrumb), relatedAssets, revisions, variants, attachments, comments, targets, createdAt/modifiedAt, fileCreatedAt S62 S34. Images add width, height, focalPoint, previewBackgroundColor, and a beta provenance object (content-credential state, content origin, generator, signing certificate) S62.
  • Custom metadata: property types TEXT, LONGTEXT, NUMBER, DATE (YYYY-MM-DD), URL, SELECT, MULTISELECT, CATALOG S62 S25; options have Base64 IDs; properties can be required (assets missing a required value stay hidden from end users), searchable/viewable, conditionally dependent (FILLED, SELECT_EQUALS, SELECT_ONE_OF) and permissioned (VIEW/EDIT/ADMIN per role, user or group) — the advanced settings are beta S25 S34.
  • Revisions: asset.revisions (id, dates, creator) since 2026-06; no file/URL info per revision yet S34.

Search & querying

MechanismSyntaxLimits / notes
Library.assets / WorkspaceProject.assets (AssetQueryInput)query: {search, externalId, types, inFolder, sortBy, filter: {andConditions[], orConditions[]}}; condition types TAG, CUSTOM_METADATA_VALUE, EXTERNAL_ID, FILE_EXTENSION, operator IS / IS_NOTTerm search is case-insensitive with partial matching over title, OCR text (if enabled), description, tags, legal and custom metadata; exact phrase with escaped quotes; AND / OR / NOT operators; results capped at 10,000 — paginate without a query to list everything S20 S34
Library.searchAssets (since 2026-09)input: {searchTerm, filters[], folderId, isRecursive, sortBy {key, direction}, cursor, limit}; typed filters on availability, dates, collections, copyright, creator, custom metadata value, extension, "has description", "missing metadata", download protection, licenses, orientation, tags, targets, workflow statusFilters are AND-only; no cap without searchTerm, 10,000 cap with it; sort keys AVAILABLE_FROM, AVAILABLE_UNTIL, CREATED, FILE_CREATION_DATE, FILE_EXTENSION, LAST_MODIFIED, MANUAL, RELEVANCE, TITLE; select values are matched on option text, not ID; index lag of a few minutes; pages may return fewer items than requested; LAST_MODIFIED sort can skip/duplicate items if assets change between pages S20
Brand / account searchbrand.search(query: {term, filter: {sources: LIBRARIES | WORKSPACE_PROJECTS | LIBRARY_PAGES}})Brand-level search is beta; results depend on the user's permissions (ranking can differ per user) S20 S34
Collection searchassets(query: {term}) on a collectionSince 2025-09 S34
  • Max page size 100; deep pagination via page (no documented offset ceiling outside searches) S16 S20.
  • Facets/aggregations are not exposed by the API (facets are a UI configuration) Unverified (no aggregation field found in the schema S62).

Uploads & binaries

Upload flow (3 steps) S19 S62

  1. uploadFile(input: {filename, size}) → {id, urls[]}: a temporary file ID and presigned S3 part URLs. Part count is computed from the size: max 1,000 parts, files < 15 MB in one part, otherwise 15 MB–5 GB parts; maximum file size 5 TB (the guide itself says "no limit") Unverified. Supplying chunkSize manually is deprecated since 2026-01-01 S34.
  2. PUT each chunk (ceil(size / number_of_urls) bytes) as the raw body to its URL — no Frontify token on these calls S19.
  3. Use the file ID once: createAsset(input: {fileId, parentId, title, description, alternativeText, externalId, tags, copyright, availability, expiresAt, author, skipFileMetadata, previewBackgroundColor}) → job { assetId }; parentId is the Base64 ID of a library, workspace project or folder. The same file ID can instead feed replaceAsset (new revision), createAttachment or variant mutations S19 S22 S62. skipFileMetadata: true ignores embedded EXIF/XMP S34.
  • Executables (exe, dmg, sh, bat, cmd…) are rejected S19. After creation the asset exists immediately but is PROCESSING; previews and type classification follow asynchronously, normally seconds to a minute, up to 15 minutes worst case S4.
  • Bulk migrations: Frontify's own guide recommends upload + create + custom metadata per file, keyed by externalId, with account:read basic:read basic:write; libraries must be pre-created in the UI S21.

Downloads & renditions S24 S57

  • previewUrl(width, height): CDN URL for a specific revision; never expires, stays valid even if the asset is later changed or deleted; accepts Media Processing parameters S57 S62.
  • thumbnailUrl: custom thumbnail, falling back to the preview S24.
  • dynamicPreviewUrl (beta, needs X-Frontify-Beta: enabled and X-Frontify-Development-Flags: PUBLIC_API_DYNAMIC_CDN): stable URL always serving the latest revision; 1-year CDN TTL with near-real-time invalidation; stops working when the asset is deleted S24 S57. Not present in the published SDL S62.
  • downloadUrl(validityInDays, permanent): original file; null when download-protected for the user (check currentUserPermissions.canDownload); permanent: true → non-expiring URL always pointing to the latest version; otherwise a version-pinned expiring URL S24 S10. Unverified Default validity is stated as 7 days S24, 1 day (January 2023 changelog) and 6 days with a 1–6 day range (2022 changelog) S34 — pass validityInDays explicitly.
  • Media Processing API: append ?mod=v1/<op>/<op>… to a preview or dynamic URL; chained operations include resize, cover, contain, inside, crop (with coordinates), focus (incl. focus=auto), refit-cover/refit-inside (subject-aware), background (incl. background=remove), colorize, flip, quality/quality-min/quality-max, output=maincolor|meancolor|preview|blank, download=, colour-vision simulations; output capped at 4096 px, metadata stripped, original not retrievable through the CDN; WebP/next-gen formats chosen by content negotiation; PDFs rendered as first-page image inside <img> or served whole when linked S56 S57 S59. Delivered through AWS CloudFront, decoupled from the application (keeps serving if the app is down) S58.

Events & webhooks

Configuration S35 S36 S11

  • Managed only through GraphQL: configureProjectWebhook(input: {projectId, notificationUrl, name, version: 2, subscribeTo?: [AssetWebhookEvent]}) (v2; omit subscribeTo for all events), installProjectWebhook (v1), webhooks(limit, page) to list, uninstallWebhook(input: {id}) (returns only the ID since 2026-09-18).
  • Scope: one library or workspace project (projectId). Requires webhook:write + basic:write and Editor rights on that location; reading requires webhook:read.
  • The subscribed event list cannot be queried back after creation — store it yourself S36.
  • Response to install includes the webhook secret S36.

Events (v2, enum AssetWebhookEvent) S41 S62: ASSET_CREATED, ASSET_UPDATED (generic: title, description, alt text, decorative flag, legal fields, download protection/sizes, availability, document category, main logo, preview colour…), ASSET_DELETED, ASSET_PROCESSED (conversion finished), ASSET_MOVED, ASSET_REVISION_ADDED, ASSET_TAG_ADDED/REMOVED, ASSET_CUSTOM_METADATA_UPDATED, ASSET_COLLECTION_ADDED/REMOVED, ASSET_LICENCE_ADDED/REMOVED, ASSET_RELATION_ADDED/REMOVED, ASSET_ATTACHMENT_ADDED/REMOVED, ASSET_VARIANT_ADDED/REMOVED/UPDATED, ASSET_TARGET_CHANGED, WORKFLOW_TASK_ASSIGNED/MOVED/DELETED. Delivered action names are dotted (asset.revision.added, asset.workflow_task.moved…). v1 only has ASSET_CREATE, ASSET_UPDATE, ASSET_DELETE S42. Unverified The v2 changelog announces "23" events; the schema enum lists 24.

  • Creating an asset fires created + updated + processed; a new revision fires updated, revision.added, updated, processed S41.

Payload S40: {event: {action, occurredAt, processedAt, sender: {id} | null, payload: [{assetId…}]}, meta: {accountId, webhookId, isSampleEvent}}. Minimal data only — fetch details via GraphQL S36. Bulk actions and same-user/same-action events are bundled into one request S35 S40. accountId + webhookId is globally unique (use it to pick the verification secret) S40.

Delivery & security S37 S38 S39

  • HTTPS endpoint with a valid TLS certificate; disable CSRF protection on the receiver.
  • Signature header X-Frontify-Webhook-Signature = Base64 of HMAC-SHA256(raw body, webhook secret); compare in constant time.
  • Respond 2xx within 5 seconds; redirects are not followed (treated as failure).
  • Retries: up to 10, exponential (1 s, 4 s, 16 s, 1 min 4 s, 4 min 16 s, 17 min 4 s, 1 h 8 min, 4 h 33 min, 18 h 12 min, ~3 days); after the last failure the webhook is automatically uninstalled.
  • No ordering guarantee; duplicates possible — make processing idempotent.

Other event sources: in-product Automations (triggers → conditions → actions, beta) S112; the Zapier and Tray.io connectors S135 S136. No event stream for guideline or template changes (webhooks cover assets only) S35.

Limits & quirks

TopicDetail
HTTP status for GraphQL errorsError-handling page: validation/permission/business errors return HTTP 200 with an errors[] array (categories graphql, validation, permission, internal/businessLogic) and possible partial data; rate-limit page: GraphQL errors return HTTP 422. An anonymous call returned 200 + permission error S31 S12 S65 Unverified contradiction — handle both
Error-rate abuseRepeated erroneous requests can be flagged as suspicious; limit retries of failing calls S12
Auth errorsExpired/revoked/invalid token → HTTP 401 S31
Beta headerX-Frontify-Beta: enabled (case-sensitive value) adds beta members to the schema; some features also need X-Frontify-Development-Flags (e.g. PUBLIC_API_DYNAMIC_CDN, PUBLIC_API_EXTERNAL_DATA_SOURCE_FILE) S15 S24 S27
Plan gating"Some API features may be restricted based on your current Frontify plan"; the Creative API needs a Templates licence; introspection must be enabled on the account for the Explorer S13 S14 S34
Libraries & archivingLibraries cannot be created and workspace projects cannot be archived via the API (isArchived is read-only) S21 S34
TargetsChangelog: asset targets queryable/manageable (beta); asset-events page: "targets cannot be accessed or modified via the public API" S34 S41 Unverified contradiction (the schema has the target mutations S62)
externalIdNot unique; no version information — Frontify suggests a version tag (e.g. version-{hash}) for sync S22
Custom-metadata filterssearchAssets filters select values by option text, dates as YYYY-MM-DD; mutations use option IDs S20 S25
Lifecycle datesNo server validation that beginsAt < expiresAt S34
Templates API coverageDigital & Print templates only partially supported; the external data source ID must be found manually in browser dev tools S27
Guideline contentSplit large reads (guidelines → pages → blocks) to stay under the complexity cap; pages list max 100 per call S28
Field renamesFrontify recommends GraphQL aliases to absorb renamed fields S175
Response headerInstances return X-Frontify-Version (application build) S65

SDKs, tools & code samples

Library / toolLanguageMaintainerStatus
GraphQL server SDK——None published (no Frontify package on PyPI/Packagist; npm scope holds front-end packages only) S69
@frontify/frontify-finderTypeScriptFrontify3.0.5 (2026-09-13); embeddable asset picker handling auth and UI; migration guide to Finder v3 S44 S69
@frontify/frontify-authenticatorTypeScriptFrontify2.1.0 (2026-09-23); OAuth 2 + PKCE pop-up flow, WebCrypto, TLS domain required S45 S69
Brand SDK: @frontify/app-bridge / app-bridge-app / app-bridge-theme, @frontify/guideline-blocks-settings, @frontify/frontify-cliTypeScript/ReactFrontify (Frontify/brand-sdk)app-bridge 3.12.10, app-bridge-app 0.3.0, app-bridge-theme 1.3.0, CLI 6.2.7 (2026-09) S48 S68 S69
@frontify/fondueReactFrontifyDesign system for extensions, 13.7.10 S69
GraphQL ExplorerWeb (GraphiQL)FrontifyOAuth sign-in to own instance; "Beta features" toggle S14 S64
Frontify MCP server (hosted)—FrontifyWraps the GraphQL API in tool packs; OAuth S67 S66
Connector sources (Contentful, Sanity, AEM, Sketch…)TS/JavaFrontify (GitHub)MIT-licensed repos, several updated 2026 S68
brix-ag/graphql-client-frontifyJavaCommunityApache-2.0, pushed 2026-09-25 S70
pyotrli/frontify_api_examplePythonCommunityExample script, pushed 2024-10-21 S71
Python example scripts (GraphQL client, auth, Base64 ID helpers, asset/tag examples)PythonFrontify team / communityLinked from the developer portal S33

Changelog of the API

DateChange
2026-09-18uninstallWebhook returns the webhook ID only S34
2026-09-14Breaking (outside the usual schedule): CreativeTemplate.variables.allowedColorValues.id numeric → string S34
2026-09Library.searchAssets (typed filters, cursor pagination); isDecorative out of beta S34
2026-07-01Scheduled removal of legacy metadataValues field (per schema deprecation reason) S62
2026-06asset.revisions query S34
2026-05-06.ai files classified as Document instead of Image S34
2026-04beginsAt on updateAsset; asset availability GA S34
2026-01Developer tokens restricted to testing, expiry 7 days–1 year; Service Apps (client credentials) recommended for production S34 S8
2026-01-01uploadFile.chunkSize no longer settable (dynamic part sizing) S34
2025-09-01Webhooks v2: granular asset events and per-event subscription S42
2025-09Search within collections S34
2025-07-01Legacy MetadataField/Value operations deprecated (extended removal period); user.email/user.avatar, Library.assetCount, LibraryCollection.isPrivate, SubFolder removals S34
2025-05Exact-match and OCR search S34
2025-04Alternative text; Creative API (template exports); fileCreatedAt S34
2025-01-01externalProducts on assets removed S34
2024-06Asset location GA; skipFileMetadata S34
2024-03thumbnailUrl S34
2024-01-01deleteAsset returns ID only S34
2023-07-01createAsset.projectId → parentId; brand search searchIn → filter.sources S34
2023-01Permanent downloadUrl option; brand.color → brand.rgbaColor S34
2022-12Collections GA S34
2022-03-07Libraries and workspace projects separated; brand.projects and project(id) deprecated S34
2022-01-01downloadUrl becomes a signed, expiring, nullable URL S34
2020-12-30snake_case fields replaced by camelCase S34

Stored API specs

2 files · 309 KB · verbatim copies of public vendor filesSpecs README & provenance
FileFormatSizeDownload
frontify_graphql_public-api.graphqlGraphQL SDL304 KBDownload
frontify_graphql-reference_llms.txtText4.6 KBDownload
Search the wiki