Conversation
Over MCP there was no way to make an Actor public in Apify Store or take it off again, and the Epic keeps this out of update-actor because publishing is public and counts against the daily publication limit. Both tools take an Actor ID or name of the caller's own account and flip isPublic with an update that sends nothing else. An Actor already in the requested state is answered without an API call. publish-actor checks the title and categories first, because the API rejects a missing one with a generic schema-validation message; every other 4xx rejection (tagged build, Store terms, README, schemas, runs, daily limit, paid or critical Actor on unpublish) comes back as a soft failure carrying the API's own message. The publish result includes the Store page URL. Both are in the actors category, so they are served by default, and both are marked destructive so clients confirm with the user. Closes #1419
The catch that turns an API 4xx into a soft failure also wrapped the account and Actor lookups, so a 401 or 403 there (a bad or scoped token) came back as invalid input without the token hint. It now wraps only the isPublic update, whose rejections name the unmet requirement; a failed read reaches the generic mapper, which reports it as an auth failure. The same applies to unpublish-actor.
apify-client retries every 429, and the API answers a sixth publication in 24 hours with a 429. The limit message therefore arrived only after nine attempts over two to four minutes, past the MCP request timeout, and each attempt made the API notify Apify admins. The isPublic update now goes through a client built with maxRetries 0; the lookups keep the session client. Publishing is idempotent, so the agent can repeat it after a transient failure.
The API answers an Actor with no run, or no successful run, with 'cannot-publish-actor' and a message that only says to contact support. That is the usual state right after push and build, and the tool passed the message on as the whole answer. It now adds that this usually means no successful run yet and that running the Actor once fixes it, naming call-actor only when the session has it.
A name lookup matches case-insensitively, and the resolver hands back the caller's spelling, so input 'my-actor' for an Actor named 'My-Actor' returned fullName and a Store URL in the wrong case. Both tools now build fullName from the resolved Actor's username and name.
The description said the Actor could simply be published again later. Publishing again repeats every publication check, including the input and output schemas that Actors published before that rule never had to pass, and counts against the daily limit; unpublishing also notifies the users who ran the Actor recently. The description now says so, so an agent does not treat unpublish and republish as a free round trip.
The no-retry client used for publishing took the default API base URL, so a server configured with another API host would publish against the wrong one. It now takes the session client's base URL.
This was referenced Sep 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
publish-actorandunpublish-actor: make an Actor public in Apify Store or private again. Both return the Actor's name and visibility; publishing also returns the Store URL.Why
Publishing lists the Actor in Store and counts against a daily quota, so it should not hide inside a general update. Closes #1419. Part of Epic #1412.
How
publish-actor-taskandunpublish-actor-task: one argument,actor, as an ID or a name within the caller's own account. An Actor already in the requested state returns at once without an API call.publish-actorchecks title and categories first. The other platform rejections (a tagged build, a README and schemas in the default build, a successful run, accepted Store terms, the daily limit of 5 per rolling 24 hours) come back as soft failures with the platform's message.destructiveHint: trueon both, as agreed on the Epic.Testing
Unit tests cover the short-circuits, a missing title or categories, each rejection type, the payloads, the Store URL, another account refused, not found, and schema conformance.
type-check,lint,format,test:unit,check:agentspass.Notes
refactor/actor-resolution).actorscategory, which is served by default: the default tool list grows by this tool, and itsstructuredContentreaches the hosted server's default sessions.AI disclosure: implemented with Claude Code; awaiting human review.
🤖 Generated with Claude Code