apify actors info <actor> --input and --readme resolve the build through taggedBuilds.latest. That tag is a convention — a per-version default that an Actor author can rename or drop. What the platform actually runs is a configuration: the Actor's defaultRunOptions.build. When the two disagree, the CLI reports on a build that nobody runs, or reports nothing at all.
Version 1.10.0, both installs (npm/node and the bundled build).
Problem 1 — an Actor without a latest tag looks like it has no schema
$ apify actors info apify/cheerio-scraper --input
Error: No input schema found for this Actor.
$ echo $?
0
Same for --readme. But the schema is there — apify/cheerio-scraper tags its builds beta, development, version-1, version-2, version-3, and its default build (version-3) is 3.0.22, with a 30-field input schema and a 32,059-character README:
$ curl -s https://api.apify.com/v2/acts/apify~cheerio-scraper/builds/default \
| jq '.data.actorDefinition.input.properties | length'
30
Two things make this awkward to notice: the message goes to stdout, and the exit code is 0 — so a pipeline can't tell it from a successful run.
Problem 2 — when both exist but differ, the output is silently wrong
apify/rag-web-browser has latest → 0.0.32 while its default build is version-1 → 1.0.28. Both schemas have 15 properties, so nothing looks off, but six of them differ:
only in latest (0.0.32) |
only in default (1.0.28) |
initialConcurrency, maxConcurrency, minConcurrency, maxRequestRetriesSearch, proxyGroupSearch, requestTimeoutContentCrawlSecs |
desiredConcurrency, htmlTransformer, removeElementsCssSelector, scrapingTool, serpMaxRetries, serpProxyGroup |
data_xplorer/google-news-scraper-fast is worse: latest → 0.0.29 exposes 5 properties and calls the search field keyword, while the default build stable → 2.8.12 exposes 10 and calls it keywords. An input built from actors info --input fails against the Actor that actually runs.
This is the case that motivated the report — Problem 1 is at least loud.
Where it comes from
src/commands/actors/info.ts#L124 (v1.10.0):
const latest = actorInfo.taggedBuilds?.latest;
--readme and --input both bail out on !latest. The hydration loop just above (L108–117) already fetches every tagged build, and actorInfo.defaultRunOptions.build is part of the same response — so picking the right one needs no extra request:
const defaultTag = actorInfo.defaultRunOptions?.build ?? 'latest';
const target = actorInfo.taggedBuilds?.[defaultTag] ?? actorInfo.taggedBuilds?.latest;
Definitions I worked from
What I checked
20 Actors — 9 first-party apify/*, 11 community — each compared three ways: actors info --input, actors info --input --json + jq, and builds/default.
- 5 have no
latest tag and fail Problem 1, all of them first-party crawlers: cheerio-scraper, web-scraper, playwright-scraper, puppeteer-scraper, website-content-crawler. The other 4 first-party Actors sampled do have latest, as did all 11 community ones — so this isn't a first-party/community split, it's a house style among the crawlers.
- 2 of the remaining 15 hit Problem 2 (the two above).
builds/default matched taggedBuilds[defaultRunOptions.build] in 20/20 — which is why the suggested fix uses the data already in the response rather than a new endpoint.
Workaround in the meantime is builds/default over plain HTTP, which is a shame for a CLI that otherwise covers this.
Is following defaultRunOptions.build (with latest as fallback) the behaviour you'd want here, or is the latest coupling deliberate? Happy to open a PR either way.
Found while validating Actor-tooling docs in apify/awesome-skills — several skills tell agents to fetch input schemas with apify actors info --input.
apify actors info <actor> --inputand--readmeresolve the build throughtaggedBuilds.latest. That tag is a convention — a per-version default that an Actor author can rename or drop. What the platform actually runs is a configuration: the Actor'sdefaultRunOptions.build. When the two disagree, the CLI reports on a build that nobody runs, or reports nothing at all.Version 1.10.0, both installs (npm/node and the bundled build).
Problem 1 — an Actor without a
latesttag looks like it has no schemaSame for
--readme. But the schema is there —apify/cheerio-scrapertags its buildsbeta,development,version-1,version-2,version-3, and its default build (version-3) is3.0.22, with a 30-field input schema and a 32,059-character README:Two things make this awkward to notice: the message goes to stdout, and the exit code is 0 — so a pipeline can't tell it from a successful run.
Problem 2 — when both exist but differ, the output is silently wrong
apify/rag-web-browserhaslatest→0.0.32while its default build isversion-1→1.0.28. Both schemas have 15 properties, so nothing looks off, but six of them differ:latest(0.0.32)initialConcurrency,maxConcurrency,minConcurrency,maxRequestRetriesSearch,proxyGroupSearch,requestTimeoutContentCrawlSecsdesiredConcurrency,htmlTransformer,removeElementsCssSelector,scrapingTool,serpMaxRetries,serpProxyGroupdata_xplorer/google-news-scraper-fastis worse:latest→0.0.29exposes 5 properties and calls the search fieldkeyword, while the default buildstable→2.8.12exposes 10 and calls itkeywords. An input built fromactors info --inputfails against the Actor that actually runs.This is the case that motivated the report — Problem 1 is at least loud.
Where it comes from
src/commands/actors/info.ts#L124(v1.10.0):--readmeand--inputboth bail out on!latest. The hydration loop just above (L108–117) already fetches every tagged build, andactorInfo.defaultRunOptions.buildis part of the same response — so picking the right one needs no extra request:Definitions I worked from
buildTagis a property of an Actor version — "Tag that is automatically set to the latest successful build of the current version", defaultlatest(POST /v2/acts/{actorId}/builds, POST /v2/acts/{actorId}/versions). Nothing requires an Actor to have a version taggedlatest.defaultRunOptions.buildis a field on the Actor, editable via PUT /v2/acts/{actorId}. This is what a run without an explicit build uses.What I checked
20 Actors — 9 first-party
apify/*, 11 community — each compared three ways:actors info --input,actors info --input --json+jq, andbuilds/default.latesttag and fail Problem 1, all of them first-party crawlers:cheerio-scraper,web-scraper,playwright-scraper,puppeteer-scraper,website-content-crawler. The other 4 first-party Actors sampled do havelatest, as did all 11 community ones — so this isn't a first-party/community split, it's a house style among the crawlers.builds/defaultmatchedtaggedBuilds[defaultRunOptions.build]in 20/20 — which is why the suggested fix uses the data already in the response rather than a new endpoint.Workaround in the meantime is
builds/defaultover plain HTTP, which is a shame for a CLI that otherwise covers this.Is following
defaultRunOptions.build(withlatestas fallback) the behaviour you'd want here, or is thelatestcoupling deliberate? Happy to open a PR either way.Found while validating Actor-tooling docs in apify/awesome-skills — several skills tell agents to fetch input schemas with
apify actors info --input.