2.7.0
September 15th, 2026
Changed
- Editor API is free and open source again. Published under the MIT License from this version on — no per-site fee, no licence key, nothing to buy on the Statamic Marketplace. Versions v1.2.3 to v2.6.1 were released under a commercial licence and keep it; versions up to v1.2.2 were already MIT.
- Documentation names the app and the Drupal module. The iOS app is
Editor for Drupal & Statamic (one app for both CMS), and the same contract is
available for Drupal 11 as
ppcharlier/drupal-editor-api.
2.6.1
September 11th, 2026
Fixed
- HTTPS & mixed content prevention. When the incoming request is secure (
Request::isSecure()or proxied withX-Forwarded-Proto: https/X-Forwarded-Scheme: httpsby a TLS-terminating reverse proxy such as Tailscale, Caddy, Nginx, or Traefik), asset URLs, site URLs, and navigation node URLs are automatically served withhttps://rather thanhttp://, preventing iOS App Transport Security (ATS) and browsers from blocking mixed content.
2.6.0
September 10th, 2026
Full Changelog: https://github.com/ppcharlier/statamic-editor-api/compare/v2.5.0...v2.6.0
2.5.0
September 8th, 2026
Added
cmsinGET /config. The identifier of the CMS answering ("statamic"), so an app that serves several CMS can tell which one an account belongs to. A stable identifier, never a display label: the client picks the name it shows. Optional and additive — a client that ignores it behaves exactly as before.
2.4.0
September 5th, 2026
Added
timezoneinGET /config. The site's timezone (app.timezone) so that a client computes an entry's day and shows wall-clock dates in the same zone as the Control Panel.
2.3.1
September 5th, 2026
Fixed
datefields could not be written back. Statamic 6 validates a date field with time against the Zulu ISO string its Control Panel submits, while it storesY-m-d H:iin the site's timezone; a client echoing whatGETreturned — the iOS app resending an untouched field — was rejected « Not a valid date. ».FieldShapenow runsDate::preProcess()on the way in (single and range modes, nested fields included), idempotent for the Zulu shape and lossless for the stored one.
2.3.0
September 3rd, 2026
Added
GET /templates— the site's views as template names (articles/index), the option list a client needs to edit atemplatefield. Same discovery rule as the Control Panel; filtering (errors/, partials,folder) stays client-side, as in the CP.
Changed
- Choice options are sent as an ordered
[{value, label}]list in the compact blueprint (select,radio,checkboxes,button_group, anything onHasSelectOptions), in blueprint order and whatever the blueprint file's form. A{value: label}JSON object loses its key order in most decoders — the iOS app showed a Left/Center/Right button group as Center/Right/Left.
2.2.1
September 3rd, 2026
Fixed
- The two author-visibility permissions read identically for every collection in the
roles editor — three collections, three rows saying "List other authors' entries", with
nothing to tell them apart. Statamic replaces
:collectionin a permission label with the collection's title (Permission::label()); the labels now carry it, and each also gained a description.
2.2.0
September 3rd, 2026
Added
-
Two optional permissions to hide other authors' entries —
editor-api list other authors {collection} entriesand its childeditor-api view other authors of {collection} entries, both per collection, in the role editor's "Editor API" group. They go deliberately BELOW Control Panel parity: the CP lists every entry with its author to anyone who may view the collection, and only writing takes an "other authors" permission. A mobile editor often needs stricter, so this is now a site's choice.Without the first, a listing is narrowed in the query (
meta.totalcounts what the user sees) and any entry-by-id route — read, revisions, localizations, publishing — answers404 not_foundrather than confirming the entry exists. Without the second,author.namecomes backnullwhileauthor.idstays, so a client can still tell "somebody else's" from "no author".Super users, collections whose blueprint has no
authorfield, and roles holdingedit other authors {collection} entriesare never restricted — whoever may edit another author's entry already sees it in the CP. -
enforce_author_visibilityconfig key, defaultfalse. Off, nothing changes and the permissions lie dormant; the key is read with a fallback, so an installation whose published config file predates it behaves exactly as before after an update. The permissions are registered either way, so aroles.yamlnever carries a handle that only exists when a config file says so.
2.1.1
September 3rd, 2026
Fixed
- An entry created without
authorwas born ownerless. The CP fills ausersfield declareddefault: currentwith the signed-in user when the form opens; the API applied no blueprint default, andEntryPolicytreats an entry with no author as someone else's — so a writer creating from the app was immediately refused on their own entry.POST /collections/{collection}/entriesnow defaultsauthorto the current user whenever the blueprint has that field and the payload omits it. An explicit value is kept as sent; blueprints without anauthorfield are untouched.
2.1.0
September 3rd, 2026
Added
-
access editor-apipermission. The counterpart of Statamic'saccess cp: a non-super user must hold it (granted per role in the CP, under the new "Editor API" group) before a token is issued, and on every request afterwards — revoking it cuts off tokens already in the wild. Super users never need it. Refusals are403 forbidden, after the password check so they reveal nothing about unknown accounts. -
canblocks on every payload. The same policies that would refuse a write are asked ahead of time for the current user, so a client greys out what it may not do instead of discovering it through a 403:Payload Keys entry (list and detail) edit,delete,publishterm edit,deleteasset edit,move,rename,deleteglobal set edit/configcollectioncreate,publish/configtaxonomycreate/configasset containerupload -
authoron entries (list and detail): the first user of the blueprint'sauthorfield as{ "id", "name" }— the display name only, never the email — ornullwhen the blueprint has no such field.
Upgrade
- Grant
access editor-apito every role that uses the app. On a free-edition site nothing changes: the single super user bypasses it.
2.0.4
September 3rd, 2026
Fixed
-
Every authorization now goes through Statamic's own policies, finishing what 2.0.3 started for entries. Until now the API compared bare permission strings, which diverged from the Control Panel in both directions:
- More permissive on a multi-site install: nothing checked
access {site} site. A user confined to one site could read, list, create or localize entries, edit globals, read navigation trees and create terms in the other sites. Every site resolved from?site=(or the localization payload) is now checked againstSitePolicy, as the CP's site switcher does, and each per-site policy re-checks it. Single-site installs are unaffected. - Stricter than the CP:
configure collections,configure globals,configure navs,configure taxonomies,configure formsandconfigure asset containersopen their whole area in the CP (the policies'before()hook) but were 403 here. Likewiseedit … entriesimpliesviewin the CP but not here. Both now match.
Each endpoint asks exactly what its CP counterpart asks:
view/create/publishon the collection or entry,editon the origin entry when localizing,editon the global set's localization,view/editon the navigation tree,viewon the taxonomy andcreate/update/deleteon the term,view/storeon the asset container andview/edit/move/rename/deleteon the asset,viewon the form anddeleteon the submission. Index endpoints filter with the sameviewpolicies. - More permissive on a multi-site install: nothing checked
Changed
- The
403 forbiddenmessage readsNot authorized to {ability} this resource.(orNot authorized to access site [{handle}].) instead of naming a permission string. - On a single resource, an unknown path or localization is a
404before the403, as in the CP: the policy needs the resource to decide. - The route middleware became
editor-api.can:{ability},{routeParam}; the internalPermissionMapclass is gone. Neither was part of the HTTP contract.
2.0.3
November 29th, -0001
- N/A Changelog not available.
2.0.2
November 29th, -0001
- N/A Changelog not available.
2.0.1
November 29th, -0001
- N/A Changelog not available.
2.0.0
November 29th, -0001
- N/A Changelog not available.