Skip to content

Catalog refresh v0.37.0: Shorts gets its own SKU, twitter.search drops lang - #31

Merged
kev1n merged 1 commit into
mainfrom
catalog-refresh-v0.37.0
Sep 6, 2026
Merged

Catalog refresh v0.37.0: Shorts gets its own SKU, twitter.search drops lang#31
kev1n merged 1 commit into
mainfrom
catalog-refresh-v0.37.0

Conversation

@kev1n

@kev1n kev1n commented Sep 6, 2026

Copy link
Copy Markdown
Member

Regenerated against the live gateway exactly as regen.yml does (fetch then pnpm generate), then reviewed. regen.yml has classified blocked and failed on every run since 2026-09-01T06:55Z, so the published SDKs are five days stale at v0.36.0. This is the human decision the fail-closed gate was holding out for.

Every blocked item traces to a deliberate upstream change

classifier item SKU upstream
output required fields changed company_enrichment.crustdata_v3 anyapi#1044 - a null title on one junk row aborted the whole transform
input required fields changed tiktok.video anyapi#1030 - url moved into an anyOf with the new id
output.segments[].words[].confidence numeric bounds changed tiktok.video_transcript_full anyapi#1023 - unaligned audio reports a negative log-scale score, which minimum: 0 rejected
input.limit default changed yelp.search anyapi#1003 - explicit "default": 20 so lane eligibility reads the same number the docs sell
output.shorts[] required fields changed youtube.channel_shorts anyapi#1023 - a titleless Short was required to have a title
input.lang field removed twitter.search anyapi#940 - lang collapsed the SKU to one apify lane at 9x the price; retired in favour of lang: inside the query
input.type enum member "shorts" removed youtube.search_hashtag anyapi#961 - no source returns a hashtag Shorts row with the channel and publish time this endpoint requires
input.startDate / input.endDate added threads.search anyapi#940
input.id added tiktok.video anyapi#1030
new SKU youtube.search_shorts - anyapi#965

Nothing here reads as an accident. Every one is a merged PR with its own measurement, so the batch is accepted rather than the classifier weakened - generator/src/classify.ts is untouched.

One correction to the brief: the "shorts" enum member was removed by anyapi#961, not #965. They are siblings from the same evening - #965 promoted Shorts to their own SKU, #961 removed the hashtag Shorts filter that could not be attributed.

What a customer has to change

  • twitter.search: lang is gone. Move it into the query: query: "coffee lang:en". The gateway still folds a sent lang into the query, so an untyped caller keeps working, but the emitted type no longer offers the field.
  • youtube.search_hashtag: type no longer accepts "shorts". Only "all".
  • Shorts now live on youtube.search_shorts: client.youtube.searchShorts({ query }) / client.youtube.search_shorts(query=...), cursor-paginated, $0.002 per request.
  • tiktok.video: url is now optional because id was added; send one. Existing url callers are unaffected.
  • company_enrichment.crustdata_v3 name and youtube.channel_shorts shorts[].title are now optional.
  • tiktok.video_transcript_full word confidence may be negative on unaligned audio; read the sign before treating it as a probability.

Also: threads.search gains optional startDate/endDate, and eleven SKUs reprice, most of them down (maps.reviews $0.0441 -> $0.0035, yelp.search $0.0605 -> $0.0035, perplexity.search $0.0111 -> $0.0036).

Version

0.36.0 -> 0.37.0 (minor). The precedent for an accepted narrowing is #29, which released as v0.34.0. Applied in lockstep to packages/typescript/package.json, packages/python/pyproject.toml, and packages/python/src/getanyapi/__init__.py via version:apply, exactly as regen.yml does.

Bumping here rather than leaving it to the next regen (as #29 did) matters: with the refresh committed, the next regen classifies none and no-ops, so an unbumped tree would never publish.

Gate

pnpm run generate:check   No drift, before the refresh and after
pnpm check                exit 0
  dash guard              pass
  release:test            12 pass
  generate:check          No drift
  @anyapi/generator       158 pass
  @getanyapi/sdk          472 pass, tsup build, consumer-typecheck OK
packages/python           pyright 0 errors, mypy 86 files clean, pytest 499 pass
scripts/live-discovery-ts.mjs       PASS 363 APIs
scripts/live-discovery-python.py    PASS 363 APIs

Releasing

Not tagged: AGENTS.md forbids tagging an unmerged commit. After merge, push v0.37.0 on the merge commit (or dispatch release.yml with tag=v0.37.0) to publish to npm and PyPI.

🤖 Generated with Claude Code

Accepts the blocked classification that has stopped every regen run since
2026-09-01T06:55Z. All eleven surface changes trace to a deliberate merged
AnyAPI change, so the fail-closed gate did its job and this is the review it
was waiting for. Minor bump, following the v0.34.0 precedent for a reviewed
narrowing (#29).

Breaking, in the order a customer will hit them:

  twitter.search      input.lang is gone. X honours "lang:" inside the query,
                      and declaring lang collapsed the SKU to one apify lane at
                      9x the price, so it was retired upstream (anyapi#940). Put
                      it in the query: query: "coffee lang:en". The gateway
                      still folds a sent lang into the query, so an untyped
                      caller keeps working; the SDK type no longer offers it.

  youtube.search_hashtag
                      input.type no longer accepts "shorts", only "all". No
                      source we buy returns a hashtag Shorts row with the
                      channel and publish time this endpoint requires, so the
                      filter was unpublished (anyapi#961).

  youtube.search_shorts
                      new SKU, and the replacement for the Shorts rows above:
                      client.youtube.searchShorts({ query }) /
                      client.youtube.search_shorts(query=...), cursor-paginated,
                      $0.002 per request (anyapi#965).

  company_enrichment.crustdata_v3
                      output name is now optional. A single null title aborted
                      the whole transform and threw away every good row beside
                      it (anyapi#1044).

  youtube.channel_shorts
                      output.shorts[].title is now optional, same reason
                      (anyapi#1023).

  tiktok.video        input.url is now optional because input.id was added: the
                      SKU accepts either (anyapi#1030). Existing url callers are
                      unaffected. The IR carries no anyOf, so both read as
                      optional in the emitted types; send one.

  tiktok.video_transcript_full
                      output.segments[].words[].confidence lost its 0..1 bounds.
                      On audio the recognizer could not align, it reports a
                      negative log-scale score, and the old bound rejected real
                      responses (anyapi#1023). Read the sign before treating the
                      number as a probability.

  yelp.search         input.limit now documents its default of 20, which is what
                      the gateway already applied (anyapi#1003).

Also in this refresh: threads.search gains optional startDate and endDate
(anyapi#940), and eleven SKUs reprice, most of them down - maps.reviews
$0.0441 -> $0.0035, yelp.search $0.0605 -> $0.0035, perplexity.search
$0.0111 -> $0.0036, youtube.video_transcript_full $0.00308 -> $0.001.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kev1n
kev1n merged commit 14d7f0c into main Sep 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant