Skip to content

actors info --input/--readme should follow the Actor's default build, not the latest tag #1454

Closed

Description

@chocholous

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.

Activity

  1. l2ysho commented on Sep 24, 2026

    @l2ysho
    Contributor

    Hi @chocholous, following defaultRunOptions.build is the right behaviour.

    One change: defaultRunOptions.build can also be a build number like 0.0.12, and taggedBuilds is keyed by tag only, so the lookup misses that case. Use client.actor(id).defaultBuild() instead, which calls builds/default and handles both. Fall back to latest only if that fails.

    PR is welcome. Thanks for the detailed report. 👍

  2. assigned and unassigned on Oct 9, 2026
  3. added a commit that references this issue on Oct 19, 2026
    6cb3b29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

t-buildersIssues owned by the Builders team.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions