Skip to content

Commit 9435580

Browse files
Chandler Caseyclaude
andcommitted
2.4.1: monitor billing in the docs (every check is 1 credit)
Since 2026-10-01 every monitor check costs 1 credit whether or not it finds new videos, and so does the read at creation that records what is already there; a failed listing stays free. The README and the create/check docstrings still said the baseline and quiet checks were free. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V2tZj5bJ3BQgp5mK97hq1A
1 parent 3c0c7fa commit 9435580

4 files changed

Lines changed: 26 additions & 12 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@
33
All notable changes to this project are documented here. This project adheres to
44
[Semantic Versioning](https://semver.org).
55

6+
## [2.4.1] - 2026-10-02
7+
8+
### Fixed
9+
10+
- Monitor billing in the README and the `create` / `check` docstrings. Since
11+
2026-10-01 every monitor check costs 1 credit whether or not it finds new
12+
videos, and so does the read at creation that records what is already there;
13+
a check whose listing fails stays free. The docs still described the old
14+
rules (free baseline, free quiet checks). No code changes.
15+
616
## [2.4.0] - 2026-09-27
717

818
### Added

‎README.md‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ res = tf.transcripts.batch(ids, mode="captions") # captions only, no audio fal
8080
## Monitors (2.4.0+)
8181

8282
Watch a YouTube channel or a TikTok/Instagram profile for new videos. Creation
83-
records a free baseline and starts scheduled checks; existing videos are skipped.
84-
Checks with no new videos are free. A check finding videos costs 1 credit, plus
85-
transcript charges when enabled. See [monitor docs](https://transcriptfetch.com/docs/monitors)
86-
for plan limits, audio billing, retention and webhook verification.
83+
reads the target once to record what is already there (existing videos are
84+
skipped) and starts scheduled checks. Every check costs 1 credit whether or not
85+
it finds new videos, and so does that first read; caption transcripts cost 1
86+
credit more each when enabled. A check whose listing fails is free. See
87+
[monitor docs](https://transcriptfetch.com/docs/monitors) for plan limits, audio
88+
billing, retention and webhook verification.
8789

8890
```python
8991
with TranscriptFetch(timeout=120) as tf:
@@ -101,7 +103,7 @@ with TranscriptFetch(timeout=120) as tf:
101103
tf.monitors.update(monitor.id, webhook_url=None, name=None, transcripts=False)
102104
# Omitted settings stay unchanged. None clears webhook_url/name.
103105
tf.monitors.update(monitor.id, status="active")
104-
checked = tf.monitors.check(monitor.id) # may spend credits
106+
checked = tf.monitors.check(monitor.id) # 1 credit, found or not
105107
if checked.error: # listing failure, even with HTTP 200
106108
print(checked.error)
107109
tf.monitors.delete(monitor.id) # removes events too

‎src/transcriptfetch/_version.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.4.0"
1+
__version__ = "2.4.1"

‎src/transcriptfetch/resources/monitors.py‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ def create(
7171
) -> Monitor:
7272
"""Create a scheduled monitor. Save webhook_secret: it is only returned here.
7373
74-
Baseline is free; existing videos are skipped. Checks finding new videos
75-
cost credits. tab selects a YouTube uploads/Shorts/live feed only.
74+
Creation reads the target once (1 credit) and skips the videos already
75+
there. Every later check costs 1 credit whether or not it finds new
76+
videos. tab selects a YouTube uploads/Shorts/live feed only.
7677
"""
7778
body = {
7879
key: value
@@ -131,7 +132,7 @@ def delete(self, monitor_id: str) -> MonitorDeleted:
131132
return MonitorDeleted.model_validate(env["data"])
132133

133134
def check(self, monitor_id: str, *, idempotency_key: Optional[str] = None) -> MonitorCheck:
134-
"""Check now, even when paused. New videos cost credits. Inspect result.error."""
135+
"""Check now, even when paused: 1 credit, found or not. Inspect result.error."""
135136
env = self._c._request(
136137
"POST", _path(monitor_id) + "/check", idempotent=True, idempotency_key=idempotency_key
137138
)
@@ -187,8 +188,9 @@ async def create(
187188
) -> Monitor:
188189
"""Create a scheduled monitor. Save webhook_secret: it is only returned here.
189190
190-
Baseline is free; existing videos are skipped. Checks finding new videos
191-
cost credits. tab selects a YouTube uploads/Shorts/live feed only.
191+
Creation reads the target once (1 credit) and skips the videos already
192+
there. Every later check costs 1 credit whether or not it finds new
193+
videos. tab selects a YouTube uploads/Shorts/live feed only.
192194
"""
193195
body = {
194196
key: value
@@ -249,7 +251,7 @@ async def delete(self, monitor_id: str) -> MonitorDeleted:
249251
async def check(
250252
self, monitor_id: str, *, idempotency_key: Optional[str] = None
251253
) -> MonitorCheck:
252-
"""Check now, even when paused. New videos cost credits. Inspect result.error."""
254+
"""Check now, even when paused: 1 credit, found or not. Inspect result.error."""
253255
env = await self._c._request(
254256
"POST", _path(monitor_id) + "/check", idempotent=True, idempotency_key=idempotency_key
255257
)

0 commit comments

Comments
 (0)