FREE Remote Preview terms acceptance (API)
Since 2.1.0 the extension activates the FREE Remote Preview only with an
acceptance of the FREE terms and DPA that the AQG service has recorded
(Activating the FREE Remote Preview). This page is the contract the
extension implements; the AQG service must implement and enforce the same. The
extension fails closed: while the endpoints answer 404 or are unreachable,
activation is impossible and FREE scans stay off.
All requests go to the AQG API base URL (A11Y_
or the default), Accept: application/, JSON bodies. Errors use the
service's usual body `{"success": false, "error": `.
GET /free-preview/terms?language=en|de
The terms in force. Public, cacheable (the extension caches a complete answer for one hour).
{
"success": true,
"terms": {
"version": "free-2026-11",
"effectiveAt": "2026-11-01T00:00:00Z",
"documents": [
{"type": "free_terms", "language": "en", "title": "AQG FREE Remote Preview Terms",
"version": "1.0", "url": "https://typo3.priebera.sk/en/legal/archive/<sha256>", "sha256": "<64 hex>"},
{"type": "dpa", "language": "en", "title": "AQG FREE Remote Preview Data Processing Terms",
"version": "1.0", "url": "https://typo3.priebera.sk/en/legal/archive/<sha256>", "sha256": "<64 hex>"}
],
"statements": {
"en": {"sha256": "<sha256 of the English declaration>"},
"de": {"sha256": "<sha256 of the German declaration>"}
}
}
}
versionand documentversion:[A-.Za- z0- 9._:-] {1,64} - Documents:
typefree_andterms dpaare both required,languageen/de,urlmust behttps,sha256is the hash of the published file. Anything else makes the extension treat the terms as not published. statements: the SHA-256 (UTF-8, exact text) of the declaration the administrator ticks. The extension ships it verbatim inClasses/(Free Preview/ Free Preview Statement. php VERSION=free-: one combined confirmation that names the FREE Remote Preview Terms and the FREE Remote Preview Data Processing Terms with their versions and the authority to act for the organisation) and does not offer activation when its hash is not listed.statement- 2026- 10- v2 404= not published yet.
POST /free-preview/acceptances
Records an acceptance. Request:
{
"installationId": "<anonymous installation id>",
"siteUrl": "https://www.example.org/",
"siteIdentifier": "main",
"domain": "example.org",
"termsVersion": "free-2026-11",
"documents": [
{"type": "free_terms", "language": "en", "version": "1.0", "sha256": "<64 hex>"},
{"type": "dpa", "language": "en", "version": "1.0", "sha256": "<64 hex>"}
],
"statement": {"version": "free-statement-2026-10-v2", "language": "en",
"text": "I accept the AQG FREE Remote Preview Terms, version 1.0, …", "sha256": "<64 hex>"},
"organisation": {"name": "Example GmbH"},
"acceptedBy": {"name": "Ada Admin", "email": "ada@example.org", "typo3UserId": 7,
"role": "typo3_administrator", "authorityConfirmed": true},
"idempotencyKey": "<64 hex>",
"clientTimestamp": "2026-10-20T10:15:29Z",
"extension": {"version": "2.1.0", "typo3Version": "14.3.9"}
}
Response 201 (200 for a replay of the same idempotency):
{
"success": true,
"acceptance": {
"id": "acc_01J…",
"status": "valid",
"termsVersion": "free-2026-11",
"installationId": "<as sent>",
"domain": "example.org",
"acceptedAt": "2026-10-20T10:15:30.000Z",
"validUntil": null,
"replayed": false
}
}
The extension stores the acceptance only when id matches
[A-, status is valid, terms,
installation and domain equal what was sent and accepted (and
valid when set) is ISO 8601 with a time zone.
Errors the extension distinguishes:
| Code | Status | Meaning |
|---|---|---|
validation_ | 400 | Missing or malformed field |
invalid_, | 403 | The site does not serve this installation's |
installation_ | proof (see below) | |
free_ | 403 | domain is not the host of site |
free_ | 409 | terms or a document hash is not the
version in force (details.) |
free_ | 409 | statement. is not published for the
version, or does not match statement. |
idempotency_ | 409 | Same key, different payload |
rate_ | 429 | Throttled |
POST /free-preview/acceptances/status
Request {"installation.
Response `{"success": true, "acceptance": `. The extension changes
its local state only for an answer with the same id. 404
free_ and 403 free_
mark the local acceptance as no longer accepted.
Enforcement on FREE token and submit
The extension sends free with the FREE POST /
(installation flavour) and with the FREE POST /. The
service must refuse FREE access with 403 and one of these codes, which the
extension records and explains:
free_— no acceptance id, or unknown;terms_ acceptance_ required free_— accepted terms are not the version in force;terms_ outdated free_,terms_ acceptance_ revoked free_;terms_ acceptance_ expired free_— the acceptance belongs to another installation or domain.terms_ acceptance_ mismatch
Requirements for the AQG service
- Trusted time:
acceptedis generated by the service in UTC when the record is stored.At clientis stored for information only and never used as the acceptance time.Timestamp - Immutable records: an acceptance is never updated in place. Revocation, expiry and supersession are separate events or status columns with their own timestamps; switching FREE off in TYPO3 does not touch the record.
- Identity: verify that the site serves this installation, as for the FREE
token (
GET <site base path>/_→ `aqg/ free- preview- proof {"version": 1, "proof": base64url`). Bind the record to(sha256 ("aqg- free- preview: v1n" + installation Id + "n" + normalized Host))} installation+ normalisedId domain; another installation or domain never inherits it. - Domain form:
domainandnormalizedare the host in its ASCII form as WHATWG URL parsing derives it (UTS #46, non-transitional), lower case, without a leadingHost www.and trailing dots. TYPO3 keeps an internationalised site base in Unicode; the extension sendsmüller.asde xn--and accepts a confirmation only for that form. A Unicode host that cannot be converted has no domain and is never activated.mller- kva. de - Versions: accept only the
termsin force, the published document hashes for it and a publishedVersion statement.that equals the SHA-256 ofsha256 statement..text - Idempotency:
(installation; a replay with the same payload returns the existing record (Id, domain, idempotency Key) replayed: true) while that record is stillvalid, a different payload `409 idempotency_`. When the matching record has been revoked or has expired, a new submission records a new acceptance (with a new id andkey_ reused accepted) instead of replaying the old one. The extension derives the key from installation, domain, terms version, statement hash, organisation, administrator name and email, so retries and double clicks never create a second record.At - Evidence stored: acceptance id, SHA-256 fingerprint of the installation id, domain, site URL, site
identifier, terms version, document types/languages/versions/hashes,
statement version/language/hash/text, organisation name, administrator name,
email and TYPO3 user id, authority declaration, server
accepted, request id, extension and TYPO3 version,At client. The client IP is kept apart, in the service's 45-day request log for abuse handling. No passwords, tokens or page content.Timestamp - Enforcement: check the acceptance on every FREE token and submit, as above; the TYPO3 UI is not a security boundary.
- Retention of FREE data (owner direction, to be confirmed legally and implemented on the service, not in TYPO3): transient HTML/DOM discarded after processing (at most 24 hours where technically needed), FREE scan results at most 30 days, FREE technical and security logs at most 45 days, no FREE screenshots. Acceptance records follow the contractual evidence retention.