Scope: the public APIs of the Nuxeo Platform LTS 2025 server (REST API v1, Automation, CMIS, WebDAV, Management API), whether self-hosted or on Nuxeo Cloud. Every Nuxeo deployment is its own server: there is no shared multi-tenant API host, so {host} below is the customer's Nuxeo URL. No authenticated call was made for this page.
At a glance
/nuxeo/json/cmis, AtomPub /nuxeo/atom/cmis), included by default S95; WebDAV (Marketplace package) S42. No GraphQL. MCP: see AI & agent ecosystemhttps://{host}/nuxeo/api/v1/… S1; older examples use /nuxeo/site/api/v1/… S8. Automation: https://{host}/nuxeo/api/v1/automation/{operationId} and legacy https://{host}/nuxeo/site/automation S3 S10. OAuth: https://{host}/nuxeo/oauth2/authorize, /nuxeo/oauth2/token S4. Downloads: https://{host}/nuxeo/nxfile/{repository}/{docId}/… S12. Management: https://{host}/nuxeo/api/v1/management/…, optionally on a separate port S97NuxeoForwardDeprecatedPathFilter keeps removed REST paths working with a log line S15 S16X-Authentication-Token), JWT bearer, OAuth 2.0 bearer S2. OAuth 2 grants: authorization code (with PKCE S256/plain for public clients), refresh token, JWT bearer assertion, client credentials (since LTS 2025.3) S4 S16. Other chain plugins (SAML, OIDC, CAS, Kerberos, anonymous) serve browser login S5expires_in: 3599 (≈1 h) with a refresh_token (authorization-code and JWT grants; none for client credentials) S4; whether the lifetime is configurable: Not public. Expired OAuth 2 tokens are garbage-collected weekly (cron configurable) S17. Login-token expiry: Not publicscope parameter is "ignored" S4. Calls run as a Nuxeo user and are filtered by document ACLs; a client-credentials client must have a Nuxeo user with the same name as its client ID S4. Login tokens carry a permission (r/rw) chosen at creation S94 S26. The Management API is restricted to administrators, a configured technical user or configured groups S97 S16/nuxeo/api/v1/doc (and Automation doc at /api/v1/automation/doc) was moved out of the default distribution into an optional nuxeo-rest-api-documentation package in LTS 2025 S15; its source repo says the Swagger doc is "out-of-date and no longer maintained" and points to doc.nuxeo.com/rest-api S23. No OpenAPI 3 or Postman collection found (GitHub org searched) S30. Nothing archived on DAM WikipageSize, currentPageIndex, offset, maxResults; responses carry resultsCount, numberOfPages, isNextPageAvailable… pageSize default 0 (no paging) and max 1,000 by default (server-configurable) S7docker-private.packages.nuxeo.com S22. Self-service trials came back with "NOS Connect" (Q1 2026) S75. Nuxeo Cloud customers get a Development Sandbox environment S67. An API Playground web app runs against your own instance S96Authentication
Basic S2 — Authorization: Basic base64(user:password); the default for API calls S1.
- Call the token servlet (
/nuxeo/authentication/token, path from the official Python client) while authenticated (e.g. Basic), withapplicationName,deviceId,permission(required) anddeviceDescription(optional); a missing required parameter returns 400. - The unique token is stored server-side, bound to user + application + device + permission.
- Send it as
X-Authentication-Token: <token>S2. Revocation and expiry rules: Not public.
OAuth 2.0 S4
- Clients are registered by an admin in Web UI → Administration → Cloud Services → Consumers (name, client ID, optional secret, redirect URIs, auto-grant to skip the consent page) or through the REST API (POST
/api/v1/directory/oauth2Clients). Nuxeo must run on HTTPS. - Authorization code: GET
/nuxeo/oauth2/authorize?response_type=code&client_id=…[&redirect_uri][&state][&code_challenge&code_challenge_method=S256]→ user consent page (oauth2Grant.jsp) unless auto-grant → POST/nuxeo/oauth2/token?grant_type=authorization_code&client_id=…&code=…[&client_secret][&code_verifier]. - JWT bearer: enable with
nuxeo.jwt.secretinnuxeo.conf; sign an assertion with HS512 (iss,sub= Nuxeo username); POST/nuxeo/oauth2/tokenwithgrant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=…. - Refresh:
grant_type=refresh_token&client_id=…&refresh_token=…. - Client credentials (machine-to-machine):
grant_type=client_credentials&client_id=…&client_secret=…; logs in as the Nuxeo user named like the client ID S4; available since LTS 2025.3 (2025-06-02) S16 S72. - Use the token as
Authorization: Bearer …or?access_token=…S4. - OAuth 2 providers, clients and issued tokens can be managed through
/api/v1/oauth2/provider|client|tokenS3.
JWT direct S2 S97 — Authorization: Bearer <JWT> signed with the shared nuxeo.jwt.secret; this is also how the Management API's technical user authenticates.
Browser SSO (SAML 2.0, OIDC, Keycloak, CAS, Kerberos, Shibboleth) belongs to the pluggable authentication chain, configured per server; custom plugins are possible S5.
Core resources
Paths relative to https://{host}/nuxeo/api/v1. Inventory from the REST API documentation S2 S3 S6 S7 S8 S97.
| Resource | Endpoints | Notes |
|---|---|---|
| Documents (assets, folders, collections) | GET|PUT|DELETE /id/{docId}, POST/id/{parentId}; same on /path/{path} | CRUD; assets are documents of type Picture, Video, Audio, File… |
| Children / in-folder search | GET/id/{docId}/@children, GET/path/{path}/@search?fullText=…|query=NXQL | Default pageSize 50 on these adapters |
| Search | GET/search/lang/NXQL/execute?query=…; GET/search/pp/{pageProvider}/execute; saved searches GET|POST /search/saved, GET|PUT|DELETE /search/saved/{id}, …/execute | See Search & querying |
| Bulk actions | POST/search/lang/{lang}/bulk/{actionId}, POST/search/pp/{pp}/bulk/{actionId}, …/saved/{id}/bulk/{actionId}; status under /management/bulk | Bulk Action Framework, scroll-based server-side |
| Metadata schema | GET/config/types[/{type}], /config/schemas[/{schema}], /config/facets[/{facet}] | Read-only introspection; schemas are defined in Studio/XML |
| Vocabularies | GET/directory, GET|POST /directory/{name}, GET|PUT|DELETE /directory/{name}/{entryId} | Directories = controlled vocabularies, also OAuth clients |
| Uploads | POST/upload/new/{handler}, POST/upload/{batchId}/{fileIdx} (whole or chunked), GET/upload/{batchId}[/info], DELETE/upload/{batchId}[/{fileIdx}], POST/upload/{batchId}[/{fileIdx}]/execute/{operationId} | See Uploads & binaries |
| Binaries / renditions | GET/id/{docId}/@blob/{xpath}, @rendition/{name}, @convert?format=…|type=…|converter=…; /nuxeo/nxfile/… download servlet | Picture views and video transcodings are document properties |
| Rights / ACL | GET/id/{docId}/@acl; ACL changes via Automation (Document.AddPermission…) | Read adapter only in REST |
| Audit | GET/id/{docId}/@audit | Per-document history |
| Annotations & comments | /id/{docId}/@annotation, @comment | CRUD on annotations |
| Workflows & tasks | /workflow/{id}, /task/{id}, /id/{docId}/@workflow, @task | Start, follow, complete |
| Users & groups | POST/user, GET|PUT|DELETE /user/{id}, POST|DELETE /user/{id}/group/{groupId}; POST/group, /group/{id} (+ @users, @groups) | SCIM 2.0 is a separate package S45 |
| Automation (commands) | POST/automation/{operationId}, POST/automation/Chain.{chainId}, /id/{docId}/@op/{operation} (piping) | 100+ operations: copy, move, permissions, conversions, video ops… S3 S10 |
| Capabilities | GET/capabilities | Distribution, version, cluster info |
| User preferences | /me/preferences/{key} | |
| Management (admin) | /management/binaries|blobs|bulk|distribution|elasticsearch|fulltext|pictures|probes|stream|thumbnails|versions|workflows|work-manager (+ migration, videos) | e.g. recompute picture views or thumbnails S97 |
Not exposed as dedicated resources: usage rights/licences (custom schemas), brand portals, asset analytics, webhook subscriptions S3 S2.
Data model
- Document JSON (
entity-type: document):uid(UUID),repository,path,type,state(lifecycle),parentRef,isCheckedOut,isVersion,isProxy,proxyTargetId,versionableId,versionLabel,changeToken,isTrashed,title,lockOwner,lockCreated,lastModified,facets[],properties{},contextParameters{}(filled by enrichers). - Properties are prefixed by schema:
dc:title,dc:description,file:content,picture:views,vid:transcodedVideos,vid:storyboard… Thepropertiesheader (orX-NXproperties) chooses which schemas are returned (*= all) S9. - DAM types:
Picture(facets Picture, MultiviewPicture; schemasfile,picture,image_metadata,iptc),Video(facets Video, HasStoryboard, HasVideoPreview),Audio; facets can be added to custom types S32. - Blobs are JSON objects (
name,mime-type,length,digest,dataURL tonxfile) S12 (download URL), S6 (references byupload-batch/upload-fileId). - Versions: separate immutable documents with major/minor labels; proxies point to a version (publication) S34 S98.
- Taxonomy: folder tree (
path), collections (link documents, max 10,000 members by default in LTS 2025 S18), tags, directory-backed vocabulary fields S3. - Extended fields and enrichers: headers
enrichers.document: thumbnail,breadcrumb,children…,fetch.document: dc:creator,…(resolve references),depth,translate.*S9.
Search & querying
| Aspect | Behaviour |
|---|---|
| Query language | NXQL (SELECT * FROM Document WHERE …): comparisons, LIKE/ILIKE with %/_, IN, STARTSWITH for paths, ecm:fulltext, ecm:ancestorId, ecm:isTrashed, list and complex properties, UTC dates S11 |
| Endpoints | Ad-hoc query (/search/lang/NXQL/execute), server-defined page providers with positional (queryParams) or named parameters (/search/pp/{name}/execute), saved searches S7 |
| Index | Page providers can query Elasticsearch/OpenSearch; for REST ad-hoc queries this needs elasticsearch.override.pageproviders=…,REST_API_SEARCH_ADAPTER S7 |
| Facets / aggregates | Aggregates defined on page providers are returned; header skipAggregates: true skips them S7 S9 |
| Highlights | highlight=dc:title.fulltext,… S7 |
| Sorting | sortBy (comma list), sortOrder ASC/DESC S7 |
| Page size | pageSize default 0 (no paging) and max 1,000 by default (configurable); adapters default to 50 S7 S8 |
| Deep pagination | Offset only via REST; Unverified the doc's sample responses show maxPageSize values of 100 and 1,000, so the effective cap depends on the page provider. For full exports the vendor approach is server-side bulk actions (scroll-based) S7 S97 |
| Consistency | Header nx_es_sync: true forces synchronous indexing on a write S9 |
Uploads & binaries
Batch upload S6
- POST
/api/v1/upload/new/{handler}(default, or e.g.s3) →batchId. Mandatory even for one file. - POST
/api/v1/upload/{batchId}/{fileIdx}withContent-Type: application/octet-stream,X-File-Name,X-File-Type(andContent-Length) → 201. - Chunked / resumable: same URL with
X-Upload-Type: chunked,X-Upload-Chunk-Index(from 0),X-Upload-Chunk-Count,X-File-Size; 202 until all chunks arrive, then 201; GET…/{fileIdx}listsuploadedChunkIdsto resume. - Attach the file: reference
{"upload-batch": batchId, "upload-fileId": "0"}in a document property (file:content) on create/update, or run an operation on the batch (POST/upload/{batchId}/execute/{operationId}, e.g.FileManager.Import). The batch is dropped after execution unlessX-Batch-No-Drop: true.
- Chunks are kept in temporary storage until the batch is executed or dropped. Chunk size limit: Not public.
S3 direct upload S13 — with nuxeo.s3storage.useDirectUpload=true, the client gets temporary credentials for a transient bucket, uploads there, and Nuxeo moves the object to the final bucket (Web UI add-on uses this by default when installed).
https://{host}/nuxeo/nxfile/{repo}/{docId}[/{xpath or blobholder:N}][/{filename}][?inline=true], e.g.…/file:content,…/files:files/0/file/name.png.- Picture views and video conversions are blobs inside
picture:views/vid:transcodedVideos; REST@rendition/{name}returns named renditions and@convertconverts on the fly S8 S32. - With S3 direct download, Nuxeo redirects to presigned S3 URLs (
nuxeo.s3storage.directdownload.expire, default 3,600 s) S13. - On-the-fly crop/resize/format: optional Dynamic Asset Transformation package (unsupported) S44.
Events & webhooks
- No webhook subscription API. The documented REST endpoints contain no webhook or callback resource S3 S2.
- Server-side events: Nuxeo raises core events (e.g.
updatePictureviewandvideoChangedfrom the DAM listeners,enrichmentMetadataCreatedandsimilarDocumentsFoundfrom Nuxeo AI) consumed by synchronous or asynchronous listeners; an integrator can make a listener or a Studio-built Automation chain call an external HTTP service S32 S38 Unverified (custom development, not a product feature). - Nuxeo Stream / Kafka: asynchronous processing (AI pipelines, bulk actions) runs on Nuxeo Stream, which can be backed by Kafka S38 S15; streams can be inspected through the Management API, but no contract for external consumers is documented S97.
- Zapier add-on: lets a Zapier account authenticate with OAuth 2 and subscribe to Nuxeo notifications (default and custom), and run Automation operations; it requires the deprecated JSF UI add-on S58 Unverified (likely legacy).
- Payload format, signing, retries: N/A (no native webhooks).
Limits & quirks
- No API throttling documented: capacity is a sizing question on self-hosted and a contract question on Nuxeo Cloud (usage reports include API activity) S1 S67.
- Scopes ignored: OAuth 2 tokens grant the full rights of the mapped user S4.
- Client credentials require a mirror user named after the client ID S4.
- Two Automation URLs (
/nuxeo/site/automationand/nuxeo/api/v1/automation) and two REST prefixes (/nuxeo/api/v1and/nuxeo/site/api/v1) appear in the docs S10 S8. - Docs vs reality: the authentication overview still lists NTLM and Portal SSO, but LTS 2025 removed NTLM login and deprecated Portal SSO S5 S15 S16 Unverified (doc lag).
- Removed endpoints still answer through a forwarding filter (
nuxeo.forward.deprecated.path.enabled) but should be migrated S15. - Collection cap of 10,000 documents (LTS 2025; 100,000 in LTS 2023), changed in 2025.6 S18.
- Version-specific behaviour: every customer runs its own LTS and hotfix level; check GET
/api/v1/capabilities(distributionVersion) before relying on a feature S3. - Transaction timeout per call:
Nuxeo-Transaction-Timeoutheader (seconds) S9. - Swagger explorer may be missing on LTS 2025 servers (optional package) and is unmaintained S15 S23.
SDKs, tools & code samples
| Library | Language | Maintainer | Status |
|---|---|---|---|
nuxeo-java-client | Java (Retrofit/OkHttp) | Nuxeo/Hyland | Tag release-4.1.0 (2026-06-01); "supported by Nuxeo", LTS 2021 and higher; last push 2026-10-01 S27 |
nuxeo (npm) / nuxeo-js-client | JavaScript (Node + browser) | Nuxeo/Hyland | 4.0.6 (2026-01-30), Apache-2.0; compatible with LTS 2015+ S25 |
nuxeo (PyPI) / nuxeo-python-client | Python | Nuxeo/Hyland | 7.1.0 (2026-06-22), Apache; REST + Automation; Python 3.13.1+ per docs S26 |
nuxeo-php-client | PHP | Nuxeo | 3.0.0 on Packagist (2022-04-29), Apache-2.0; described as "partial implementation" S29 S1 |
nuxeo-dotnet-client | .NET | Nuxeo | Archived (last push 2022-06-22), LGPL-2.1 S28 |
| iOS client, Dart client | Swift/ObjC, Dart | Nuxeo / community | Listed in docs; maintenance Unknown S1 |
| Nuxeo API Playground | Web app | Nuxeo | Explore endpoints against your own instance; also a Marketplace package for LTS 2025 S96 S42 |
nuxeo-mcp-server | Python (FastMCP) | nuxeo GitHub org | v0.1.0, created 2026-03-05; see Integrations S24 |
nuxeo-cli, Nuxeo Studio, Nuxeo Explorer | Tooling | Nuxeo | Code generator (CLI), low-code configuration, browsable reference of components/operations per distribution S30 S102 S89 |
nuxeo-sandbox GitHub org | Samples | Nuxeo field teams | Unsupported samples (e.g. dynamic asset transformation, public download link) S44 S50 |
Changelog of the API
| Date | Change | Source |
|---|---|---|
| 2026-09-14 | LTS 2025.25: cache for the token authentication service, guard against OAuth 2 provider creation without authorization server URL | S14 |
| 2026-03-05 | nuxeo-mcp-server repository created (MCP tools over REST/Automation) | S24 |
| 2025-08-11 | LTS 2025.6: collection size capped (10,000 by default) | S18 |
| 2025-06-02 | LTS 2025.3: OAuth 2.0 Client Credentials flow; Portal SSO deprecated | S16 |
| 2025-04-21 | LTS 2025.1: weekly garbage collection of expired OAuth 2 tokens; user creation without password configurable | S17 |
| 2025-03-31 | LTS 2025.0: OAuth 1.0 deprecated; NTLM removed; Swagger REST/Automation doc moved to an optional package; forwarding filter for removed REST paths; SCIM 2.0 package; Management API for UID sequencer | S15 |
| 2023-07-18 | LTS 2023 released | S19 |
| 2021-01-21 | LTS 2021 released (DAM built into the platform) | S19 S32 |
| 2008 | First REST API (with native SQL storage) | S62 |