typo3_ter_lookup
Read an extension's published versions
Read what the TYPO3 Extension Repository has published under an extension key, live from extensions.typo3.org. Pass extension with the key, the one extra.typo3/cms.extension-key declares and not the Composer package name. Every published version comes back, highest number first. That is the number, the state, the upload day, the TYPO3 majors it declares and the constraints.depends.typo3 of its release. This is the question a release audit cannot answer from the repository under audit. Tailor refuses to package unless ext_emconf.php names the version of the release. So that file still names it after the upload, and a published checkout reads exactly like one nobody has published. Pass extensionVersion as well to learn whether the registry already holds that number. It reports what the registry holds and judges no version free; the comparison against the working tree is yours. A key with nothing published under it gets that answer, which does not say that no such package exists. An extension that ships through Composer alone never registers here. What a release requires of the extension itself is typo3_hint_lookup with id="extension-ter-release". This tool reads only, with no credential. You register a key, upload a version and transfer an extension yourself, through Tailor and the token it carries. Answers from: network.
readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: true
Answers from network.
Takes#
# The extension key, for example "news" or "bootstrap_package". That is the key
# extra.typo3/cms.extension-key declares in the package's composer.json, which
# every TYPO3 extension package has to carry to install at all. It is not the
# Composer package name, which the registry does not take. "georgringer/news"
# and "bootstrap-package" are the two shapes that reach it as a name of the
# wrong kind. Lowercase letters, digits and underscores, three to thirty
# characters.
extension: string
# One version number to ask about, for example "14.0.1", which is usually the
# one ext_emconf.php names. The answer says whether the registry holds it and,
# where it does, what that release declared. The comparison reads it as the
# registry writes it, which is exactly three numbers. A suffix of any kind
# belongs to no published version, because the upload route accepts none.
extensionVersion: string # optional
# How many versions come back, newest number first. The count of everything
# published comes with them, so a cut list says so. A widely maintained
# extension has a hundred, and what a release audit reads is the top of them.
limit: integer # optional# The extension key, for example "news" or "bootstrap_package". That is the key
# extra.typo3/cms.extension-key declares in the package's composer.json, which
# every TYPO3 extension package has to carry to install at all. It is not the
# Composer package name, which the registry does not take. "georgringer/news"
# and "bootstrap-package" are the two shapes that reach it as a name of the
# wrong kind. Lowercase letters, digits and underscores, three to thirty
# characters.
extension: string
# One version number to ask about, for example "14.0.1", which is usually the
# one ext_emconf.php names. The answer says whether the registry holds it and,
# where it does, what that release declared. The comparison reads it as the
# registry writes it, which is exactly three numbers. A suffix of any kind
# belongs to no published version, because the upload route accepts none.
extensionVersion: string # optional
# How many versions come back, newest number first. The count of everything
# published comes with them, so a cut list says so. A widely maintained
# extension has a hundred, and what a release audit reads is the top of them.
limit: integer # optional
Answers with#
# One of: answered, empty, unavailable.
status: string
# The registry the answer came from.
source: string
# What the call read, so you can ask the same question again by hand. Empty
# where the key got its answer without a read.
url: string
# Where a person reads the extension's own page in the registry. Empty where the
# key is not one the registry takes.
page: string
# The key the call named, lowercased, as the call sent it.
extension: string
# The version number the call asked about, as the call passed it. Empty where it
# passed none.
extensionVersion: string
# Whether the registry has published that exact number. Null where the call
# named no version, and null where the call read nothing at all. A false here is
# the registry's answer, never a question that failed. It is a fact about the
# registry and not a judgement that the number is free to release.
held: boolean or null
# How many versions the registry holds under the key in total, of which versions
# carries at most limit. Zero where it holds none.
total: integer
# The published versions, highest number first. That is version order and not
# upload order. A maintenance release on an older line sits further down and may
# be the most recent upload of all. The days beside the numbers say so. Empty
# where the registry holds nothing under the key.
versions:
- # The version as the registry has it.
number: string
# What the uploader declared it as: stable, beta, alpha, experimental, test,
# obsolete.
state: string
# The upload day, as YYYY-MM-DD in UTC. The registry writes the same moment
# in its own timezone, so a release made late in the day carries the day
# before here.
uploaded: string
# The TYPO3 majors the release declares it runs on, lowest first.
majors: [integer]
# The constraints.depends.typo3 the release declared, as ext_emconf.php
# wrote it — for example ">=13.4.15 <=14.3.99". Empty where the release
# declared none, which the registry accepts on an upload made by a
# controller.
constraint: string
# Why the registry answered nothing, where status says unavailable. Null
# otherwise, and null on a key with nothing published under it; that one is an
# answer.
unavailable:
# One of: source-not-answering, source-not-parseable. source-not-answering:
# the registry did not answer this time. source-not-parseable: something
# answered with a page rather than with the API.
cause: string
reason: string# One of: answered, empty, unavailable.
status: string
# The registry the answer came from.
source: string
# What the call read, so you can ask the same question again by hand. Empty
# where the key got its answer without a read.
url: string
# Where a person reads the extension's own page in the registry. Empty where the
# key is not one the registry takes.
page: string
# The key the call named, lowercased, as the call sent it.
extension: string
# The version number the call asked about, as the call passed it. Empty where it
# passed none.
extensionVersion: string
# Whether the registry has published that exact number. Null where the call
# named no version, and null where the call read nothing at all. A false here is
# the registry's answer, never a question that failed. It is a fact about the
# registry and not a judgement that the number is free to release.
held: boolean or null
# How many versions the registry holds under the key in total, of which versions
# carries at most limit. Zero where it holds none.
total: integer
# The published versions, highest number first. That is version order and not
# upload order. A maintenance release on an older line sits further down and may
# be the most recent upload of all. The days beside the numbers say so. Empty
# where the registry holds nothing under the key.
versions:
- # The version as the registry has it.
number: string
# What the uploader declared it as: stable, beta, alpha, experimental, test,
# obsolete.
state: string
# The upload day, as YYYY-MM-DD in UTC. The registry writes the same moment
# in its own timezone, so a release made late in the day carries the day
# before here.
uploaded: string
# The TYPO3 majors the release declares it runs on, lowest first.
majors: [integer]
# The constraints.depends.typo3 the release declared, as ext_emconf.php
# wrote it — for example ">=13.4.15 <=14.3.99". Empty where the release
# declared none, which the registry accepts on an upload made by a
# controller.
constraint: string
# Why the registry answered nothing, where status says unavailable. Null
# otherwise, and null on a key with nothing published under it; that one is an
# answer.
unavailable:
# One of: source-not-answering, source-not-parseable. source-not-answering:
# the registry did not answer this time. source-not-parseable: something
# answered with a page rather than with the API.
cause: string
reason: string
Answered#
Recorded on 2026-09-23 by bin/cli tools:record. Answered against
core-checkout, TYPO3 14.3.8-dev, the 14.3 core checkout below .checkouts/. Its
console is out of reach: <installation> has no TYPO3 console — none of
bin/typo3, vendor/bin/typo3 exists. Its dependencies are not installed —
vendor/autoload.php is not there either, and composer install writes both.
Nothing checks what is below this heading; everything above it is derived from
the class that answers the call, and bin/cli tools:check holds it.
ter: what is published under a key#
Called with:
{
"extension": "blog",
"limit": 3
}{
"extension": "blog",
"limit": 3
}
Text:
TYPO3 Extension Repository: blog — 32 published versions, highest 14.0.1 (stable, uploaded 2026-08-20)
https://extensions.typo3.org/extension/blog
## The newest 3 of 32, by version number
Version order and not upload order: a release on an older line sits further down and may have been uploaded after the ones above it, which the days say.
- 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99
- 14.0.0 · stable · uploaded 2025-08-25 · TYPO3 13 · >=13.4.15 <=13.4.99
- 13.0.1 · stable · uploaded 2025-08-25 · TYPO3 12, 13 · >=12.4.22 <=13.4.99TYPO3 Extension Repository: blog — 32 published versions, highest 14.0.1 (stable, uploaded 2026-08-20)
https://extensions.typo3.org/extension/blog
## The newest 3 of 32, by version number
Version order and not upload order: a release on an older line sits further down and may have been uploaded after the ones above it, which the days say.
- 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99
- 14.0.0 · stable · uploaded 2025-08-25 · TYPO3 13 · >=13.4.15 <=13.4.99
- 13.0.1 · stable · uploaded 2025-08-25 · TYPO3 12, 13 · >=12.4.22 <=13.4.99
Data:
{
"status": "answered",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/blog/versions",
"page": "https://extensions.typo3.org/extension/blog",
"extension": "blog",
"extensionVersion": "",
"held": null,
"total": 32,
"versions": [
{
"number": "14.0.1",
"state": "stable",
"uploaded": "2026-08-20",
"majors": [
13,
14
],
"constraint": ">=13.4.15 <=14.3.99"
},
{
"number": "14.0.0",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
13
],
"constraint": ">=13.4.15 <=13.4.99"
},
{
"number": "13.0.1",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
12,
13
],
"constraint": ">=12.4.22 <=13.4.99"
}
],
"unavailable": null
}{
"status": "answered",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/blog/versions",
"page": "https://extensions.typo3.org/extension/blog",
"extension": "blog",
"extensionVersion": "",
"held": null,
"total": 32,
"versions": [
{
"number": "14.0.1",
"state": "stable",
"uploaded": "2026-08-20",
"majors": [
13,
14
],
"constraint": ">=13.4.15 <=14.3.99"
},
{
"number": "14.0.0",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
13
],
"constraint": ">=13.4.15 <=13.4.99"
},
{
"number": "13.0.1",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
12,
13
],
"constraint": ">=12.4.22 <=13.4.99"
}
],
"unavailable": null
}
ter: is this version already out#
Called with:
{
"extension": "blog",
"extensionVersion": "14.0.1",
"limit": 3
}{
"extension": "blog",
"extensionVersion": "14.0.1",
"limit": 3
}
Text:
TYPO3 Extension Repository: blog — 32 published versions, highest 14.0.1 (stable, uploaded 2026-08-20)
https://extensions.typo3.org/extension/blog
The registry holds 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99.
## The newest 3 of 32, by version number
Version order and not upload order: a release on an older line sits further down and may have been uploaded after the ones above it, which the days say.
- 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99
- 14.0.0 · stable · uploaded 2025-08-25 · TYPO3 13 · >=13.4.15 <=13.4.99
- 13.0.1 · stable · uploaded 2025-08-25 · TYPO3 12, 13 · >=12.4.22 <=13.4.99TYPO3 Extension Repository: blog — 32 published versions, highest 14.0.1 (stable, uploaded 2026-08-20)
https://extensions.typo3.org/extension/blog
The registry holds 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99.
## The newest 3 of 32, by version number
Version order and not upload order: a release on an older line sits further down and may have been uploaded after the ones above it, which the days say.
- 14.0.1 · stable · uploaded 2026-08-20 · TYPO3 13, 14 · >=13.4.15 <=14.3.99
- 14.0.0 · stable · uploaded 2025-08-25 · TYPO3 13 · >=13.4.15 <=13.4.99
- 13.0.1 · stable · uploaded 2025-08-25 · TYPO3 12, 13 · >=12.4.22 <=13.4.99
Data:
{
"status": "answered",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/blog/versions",
"page": "https://extensions.typo3.org/extension/blog",
"extension": "blog",
"extensionVersion": "14.0.1",
"held": true,
"total": 32,
"versions": [
{
"number": "14.0.1",
"state": "stable",
"uploaded": "2026-08-20",
"majors": [
13,
14
],
"constraint": ">=13.4.15 <=14.3.99"
},
{
"number": "14.0.0",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
13
],
"constraint": ">=13.4.15 <=13.4.99"
},
{
"number": "13.0.1",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
12,
13
],
"constraint": ">=12.4.22 <=13.4.99"
}
],
"unavailable": null
}{
"status": "answered",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/blog/versions",
"page": "https://extensions.typo3.org/extension/blog",
"extension": "blog",
"extensionVersion": "14.0.1",
"held": true,
"total": 32,
"versions": [
{
"number": "14.0.1",
"state": "stable",
"uploaded": "2026-08-20",
"majors": [
13,
14
],
"constraint": ">=13.4.15 <=14.3.99"
},
{
"number": "14.0.0",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
13
],
"constraint": ">=13.4.15 <=13.4.99"
},
{
"number": "13.0.1",
"state": "stable",
"uploaded": "2025-08-25",
"majors": [
12,
13
],
"constraint": ">=12.4.22 <=13.4.99"
}
],
"unavailable": null
}
ter: nothing is published under this key#
Called with:
{
"extension": "quantumflux_transponder"
}{
"extension": "quantumflux_transponder"
}
Text:
TYPO3 Extension Repository: nothing is published under the key "quantumflux_transponder" at https://extensions.typo3.org.
The registry holds no extension by that key. That is not a statement that no such package exists: one distributed through Composer alone is never registered here, and a key can be registered without a version having been uploaded to it yet.TYPO3 Extension Repository: nothing is published under the key "quantumflux_transponder" at https://extensions.typo3.org.
The registry holds no extension by that key. That is not a statement that no such package exists: one distributed through Composer alone is never registered here, and a key can be registered without a version having been uploaded to it yet.
Data:
{
"status": "empty",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/quantumflux_transponder/versions",
"page": "https://extensions.typo3.org/extension/quantumflux_transponder",
"extension": "quantumflux_transponder",
"extensionVersion": "",
"held": null,
"total": 0,
"versions": [],
"unavailable": null
}{
"status": "empty",
"source": "https://extensions.typo3.org",
"url": "https://extensions.typo3.org/api/v1/extension/quantumflux_transponder/versions",
"page": "https://extensions.typo3.org/extension/quantumflux_transponder",
"extension": "quantumflux_transponder",
"extensionVersion": "",
"held": null,
"total": 0,
"versions": [],
"unavailable": null
}
ter: a composer package name#
Called with:
{
"extension": "georgringer/news"
}{
"extension": "georgringer/news"
}
Text:
TYPO3 Extension Repository: "georgringer/news" is not an extension key, so nothing was read. That is about the name and not about what is published.
A key is lowercase letters, digits and underscores, three to thirty characters, starting with a letter. A slash or a dash means a Composer package name — the key is what extra.typo3/cms.extension-key declares in that package's own composer.json.TYPO3 Extension Repository: "georgringer/news" is not an extension key, so nothing was read. That is about the name and not about what is published.
A key is lowercase letters, digits and underscores, three to thirty characters, starting with a letter. A slash or a dash means a Composer package name — the key is what extra.typo3/cms.extension-key declares in that package's own composer.json.
Data:
{
"status": "empty",
"source": "https://extensions.typo3.org",
"url": "",
"page": "",
"extension": "georgringer/news",
"extensionVersion": "",
"held": null,
"total": 0,
"versions": [],
"unavailable": null
}{
"status": "empty",
"source": "https://extensions.typo3.org",
"url": "",
"page": "",
"extension": "georgringer/news",
"extensionVersion": "",
"held": null,
"total": 0,
"versions": [],
"unavailable": null
}