Changelog
Every change that reaches a caller — behaviour, speed, reliability — newest first, taken from the engineering log written as the work happened. Breaking changes get a version bump and a month of overlap.
List results return every mention, in order
A list schema now returns a row for every time the video names something, in the order it comes up, instead of combining rows across the video. A place the host returns to, or a stock discussed three times with three different sentiments, keeps each mention, so you decide how to group, count or deduplicate. The cleaning is unchanged: values that are not in the transcript, prompt echoes and rows with no name are still removed and reported in usage.droppedValues.
An OpenAPI 3.1 description of the API
The whole API is now described at tubeextract.dev/openapi.json (and api.tubeextract.dev/openapi.json), ready for Postman, Swagger UI and client generators. It is built from the same validators the API checks requests with, and the test suite fails if a route or a response field is missing from it.
Plans and credit packs can be paid for
Checkout now takes real payments. Paddle is the merchant of record, so it handles the payment, sales tax and the invoice. Plans bill monthly, or annually at 20% off; a credit pack is a one-time purchase of 10,000 to 2,000,000 credits at $0.0008 each. One checkout is one plan: the quantity is fixed at one.
A refund or chargeback takes back the credits it paid for
When a payment is refunded, the credits it bought are removed in the same share as the money returned: all of them for a full refund, half for half. If some were already spent, the balance goes below zero and new jobs wait until it is back above. A chargeback that is later reversed gives them back. This is the refund policy's unused-share rule, applied by the system instead of by hand.
No overdraft while a subscription is ending
A paid plan can run a quarter of its monthly allowance below zero, repaid from the next renewal. That now applies only to a subscription in good standing: once a cancellation is scheduled or a payment has failed, the balance stops at zero, because there may be no next renewal to repay it from. A cancelled workspace also gets the Free plan's rate limit, key limit and webhook access.
Numbers spoken in words are no longer dropped
A number column is checked against the transcript, so the model cannot invent a figure. Captions often spell numbers out ("twenty four bucks"), and those correct answers were being thrown away: 11 of 15 spoken prices on a synthetic test transcript. A whole number from 2 upward now also matches its English spelling. 0 and 1 are left out, because "no one" and "one of the best" would let an invented value through.
List schemas pick up fewer places that are only mentioned
The instruction for list schemas no longer asks for every entry "anywhere in the text", which pulled in places a video only mentions in passing. On a synthetic test transcript that produced fewer invented rows and found every real one either way. It has not yet been measured on real videos.
Plan changes take effect at the next renewal
Upgrades and downgrades both wait for the renewal. Nothing is charged when you change plan; you keep the plan you paid for, with its allowance and limits, until the renewal bills the new one and grants its allowance. The billing screen shows the pending change until then. Credits needed sooner are a credit pack away, which lands at once.
A published refund policy
Any payment is refundable for 30 days: in full if its credits are untouched or under 10% spent, on the unused share if more. The policy is at /refunds and linked from every page.
Lower prices, larger allowances
Starter is $12 for 50,000 credits a month (was $19 for 25,000), Studio $49 for 250,000 (was $69 for 100,000), Scale $139 for 1,000,000 (was $199 for 350,000). Pay-as-you-go is $0.0008 a credit (was $0.0012), still from 10,000 credits. Annual stays 20% off.
New accounts start with 3,000 credits, up from 1,000.
Rate limits are enforced
The per-minute limits were published and not enforced. They are now, per workspace over a sliding minute: Free 10 requests, Starter 30, Studio 120, Scale 300. Every /v1 response carries X-RateLimit-Limit and X-RateLimit-Remaining, and going past the limit returns 429 with the rate_limited code and a Retry-After header. Webhook delivery is included from Starter.
Closed workspaces are deleted within 30 days, as promised
The terms promise that a closed workspace's results, schemas and job records are deleted within 30 days. Closing only revoked the keys. A pass now runs hourly and, from 29 days after closing, deletes jobs, schemas, webhook endpoints, invitations and API keys. Invoices and the credit history are kept, as billing records.
A column can hold several values
A column typed as a list, such as {"dishes": ["string"]}, returns a real array, and rows found in different parts of a video merge their lists. On the video this was built against, constraining the output to the schema cut extraction from 121 seconds to 27.8.
Schema editor: live template, import and drafting
Column types use the extraction model's own type names, with the earlier names kept as aliases, and a schema can be sent as a typed template plus descriptions. The editor shows the compiled template as you type, imports a pasted template, and drafts columns from a plain-English description.
Deduplication no longer merges different places
Merging near-duplicate rows compared whole names by edit distance, which folded "Lucy's Drive-In" into "Mel's Drive-In". It now compares word by word, and rows that disagree stay apart, so three dishes at one restaurant are three rows. What the filters removed is reported in usage.droppedValues. On two videos with answer keys we wrote, a loosely worded schema went from 1 of 9 expected rows to 4 of 9, and the restaurant video kept 7 of 7.
Transcripts come from caption tracks only
A video with no caption track now fails as no_captions and is not charged. On a real 26-minute video a job took 36.6 seconds end to end. Extraction moved to a newer specialized extraction model at the same time.
Billing is per minute of video
A video costs 10 credits per started minute, charged once its length is known and before extraction runs. A job that fails after that is refunded in full, and a video that fails before it, such as one without captions, is never charged.
A 26-minute video costs 260 credits.
The status page now reports measurements instead of a fixed picture
Every figure on /status is computed from health checks the API runs against itself on a timer: the database, the job queue, the webhook delivery backlog, and the caption-fetch service where it is reachable from the API process. Uptime is the share of due checks that passed, incidents are runs of failed checks, and a component with no history says so rather than showing a number. Anything that cannot be measured is left off the page instead of being assumed healthy. The same readings are available at GET /status, which needs no API key.
Caption fetches are batched across queued videos
Videos waiting in the queue now have their caption tracks fetched together in one call rather than one at a time, which removes a per-video start-up cost that was dominating the work. Measured on the same 100-video batch as before: about 15.7 seconds per video against 30 to 40 seconds, and roughly 26 minutes end to end where the previous path projected 50 to 65. Extraction itself is unchanged, and results were byte-identical to the earlier run.
No pricing change: a batch is still charged one credit per video.
Caption fetching moved to a managed transcript service
Caption fetching now goes through a managed provider built for fetching at volume, which keeps large batches moving without YouTube's IP-level rate limits getting in the way, and the direct path stays as a fallback. The output is identical — same segments, same timings, same distinction between real captions and auto-generated ones — so nothing about a schema or a result changes.
Batches ride out YouTube rate limits
A rate-limited caption fetch is now told apart from a video that has no captions, and it backs off and retries — up to six attempts over about five minutes — so the rest of the batch keeps going. A job stays in processing throughout, and only fails if the limit outlasts every retry.
Faster extraction on long, dense videos
Repetitive model output is now detected and cut short, so every section of a long video returns promptly. On the video this was traced with, total extraction time went from 91.4 seconds to 15.3. Sections that already worked are unaffected and return byte-identical results.