diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59a69c2..27a3c24 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## 0.4.3
+
+Generated from the API document of 2026-10-04, evening, whose descriptions lead with credits. `MeResponse.period_resets_at` is a string on every plan.
+
## 0.4.2
Generated from the v1 document of 2026-10-04, which prices every read in credits. `PremiumQuote` replaces the `TranscriptPurchaseQuote` type.
diff --git a/VERSION b/VERSION
index 2b7c5ae..17b2ccd 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.4.2
+0.4.3
diff --git a/fern/openapi.json b/fern/openapi.json
index 0e59269..f14bd44 100644
--- a/fern/openapi.json
+++ b/fern/openapi.json
@@ -983,7 +983,7 @@
},
"rows": {
"type": "integer",
- "description": "Rows the whole video uses, 75 rows per 15-minute block. A row is 4 credits, so Premium uses 300 credits per block."
+ "description": "Credits the whole video uses, in rows: 300 credits per 15-minute block (75 rows; a row is 4 credits)."
}
},
"required": [
@@ -1263,11 +1263,8 @@
"description": "The account email with the local part masked after its first character, e.g. z***@example.com. Null when the account has none."
},
"period_resets_at": {
- "type": [
- "string",
- "null"
- ],
- "description": "ISO 8601 time the plan credits reset: 00:00 UTC on the first of next month. Null on the free plan, whose 1,000 credits a month reset on usage.credits.plan.resets_at."
+ "type": "string",
+ "description": "ISO 8601 time the plan credits reset: 00:00 UTC on the first of next month, on every plan."
},
"tier": {
"type": "string",
@@ -1293,15 +1290,15 @@
"properties": {
"rows_used": {
"type": "integer",
- "description": "Plan credits used this month, in rows: usage.credits.plan.used divided by 4, rounded up. A row is 4 credits."
+ "description": "Plan credits used this month, in rows (a row is 4 credits): usage.credits.plan.used divided by 4, rounded up."
},
"rows_remaining": {
"type": "integer",
- "description": "Credits left from the plan, grants and top-ups, on-demand excluded, in rows: divided by 4, rounded up. A row is 4 credits."
+ "description": "Credits left from the plan, grants and top-ups, on-demand excluded, in rows (a row is 4 credits): divided by 4, rounded up."
},
"monthly_rows": {
"type": "integer",
- "description": "The plan credits a month, in rows: usage.credits.plan.credits divided by 4 when the plan has a limit. A row is 4 credits."
+ "description": "Plan credits a month, in rows (a row is 4 credits): usage.credits.plan.credits divided by 4 when the plan has a limit."
},
"current_spend_cents": {
"type": "integer",
@@ -1524,7 +1521,7 @@
},
"rows_allotted": {
"type": "integer",
- "description": "On a paid plan, its monthly allowance in rows; a row is 4 credits. On the free plan, the account's row allotment from before credits (1,000 for a new account). The free plan uses 1,000 credits a month, read from usage.credits on GET /v1/me."
+ "description": "Plan credits a month, in rows (a row is 4 credits), on a paid plan. On the free plan, the account's allotment from before credits (1,000 for a new account). The free plan has 1,000 credits a month; read the balance from usage.credits on GET /v1/me."
},
"next": {
"type": "string",
@@ -3762,7 +3759,7 @@
},
"watch_url": {
"type": "string",
- "description": "Site-relative watch URL with the timestamp, e.g. /watch?v=...&t=4787."
+ "description": "Absolute watch URL on arcmira.com with the timestamp, e.g. https://arcmira.com/watch?v=...&t=4787."
},
"cite_line": {
"type": [
@@ -5907,7 +5904,7 @@
},
"rows_billed": {
"type": "integer",
- "description": "Rows this captions read used: 1 row per started 15 minutes, and a row is 4 credits. 0 on a repeat of the same video, quality, language, and range inside the 7 day dedupe window. Premium reads report 0, because the Premium transcript job carries their charge."
+ "description": "Credits this captions read used, in rows (a row is 4 credits): 4 credits per started 15 minutes. 0 on a repeat of the same video, quality, language, and range inside the 7 day dedupe window. Premium reads report 0, because the Premium transcript job carries their charge."
},
"as_of": {
"type": [
@@ -10791,7 +10788,7 @@
],
"operationId": "quote_transcription",
"summary": "Quote a whole-video Premium transcript",
- "description": "Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.",
+ "description": "Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.",
"security": [
{
"bearerAuth": []
diff --git a/reference.md b/reference.md
index 3de0fea..15ad042 100644
--- a/reference.md
+++ b/reference.md
@@ -1373,7 +1373,7 @@ client.transcripts.get(
-
-Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
+Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
diff --git a/src/arcmira/_package.py b/src/arcmira/_package.py
index 8278610..a774dfd 100644
--- a/src/arcmira/_package.py
+++ b/src/arcmira/_package.py
@@ -1,5 +1,5 @@
# Written by scripts/install-generated.py from VERSION.
-__version__ = '0.4.2'
+__version__ = '0.4.3'
homepage = "https://arcmira.com"
docs = "https://arcmira.com/docs"
api_base = "https://api.arcmira.com/v1"
diff --git a/src/arcmira/core/client_wrapper.py b/src/arcmira/core/client_wrapper.py
index cc8ad8a..c01059a 100644
--- a/src/arcmira/core/client_wrapper.py
+++ b/src/arcmira/core/client_wrapper.py
@@ -33,7 +33,7 @@ def get_headers(self) -> typing.Dict[str, str]:
import platform
headers: typing.Dict[str, str] = {
- "User-Agent": "arcmira/0.4.2",
+ "User-Agent": "arcmira/0.4.3",
"X-Fern-Language": "Python",
"X-Fern-Runtime": f"python/{platform.python_version()}",
"X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}",
diff --git a/src/arcmira/transcripts/client.py b/src/arcmira/transcripts/client.py
index 3ee874e..24defd7 100644
--- a/src/arcmira/transcripts/client.py
+++ b/src/arcmira/transcripts/client.py
@@ -195,7 +195,7 @@ def get(
def quote(self, video_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> PremiumQuote:
"""
- Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
+ Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
Parameters
----------
@@ -469,7 +469,7 @@ async def main() -> None:
async def quote(self, video_id: str, *, request_options: typing.Optional[RequestOptions] = None) -> PremiumQuote:
"""
- Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
+ Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
Parameters
----------
diff --git a/src/arcmira/transcripts/raw_client.py b/src/arcmira/transcripts/raw_client.py
index ade787e..3425117 100644
--- a/src/arcmira/transcripts/raw_client.py
+++ b/src/arcmira/transcripts/raw_client.py
@@ -396,7 +396,7 @@ def quote(
self, video_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> HttpResponse[PremiumQuote]:
"""
- Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
+ Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
Parameters
----------
@@ -1002,7 +1002,7 @@ async def quote(
self, video_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> AsyncHttpResponse[PremiumQuote]:
"""
- Optional free quote: what a Premium read of this video would use right now, as rows and credits (a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
+ Optional free quote: what a Premium read of this video would use right now, as credits (charge; quote.rows restates it in rows, and a row is 4 credits), where the credits would come from, and max_on_demand_cents, the on-demand budget the read would need beyond the plan's credits within the account limit. It does not reserve credits or budget and does not start a transcript. A video with no known duration, or one past the 12 hour cap, answers 400 invalid_query with param video_id.
Parameters
----------
diff --git a/src/arcmira/types/me_response.py b/src/arcmira/types/me_response.py
index c0677c2..054a27b 100644
--- a/src/arcmira/types/me_response.py
+++ b/src/arcmira/types/me_response.py
@@ -35,9 +35,9 @@ class MeResponse(UniversalBaseModel):
The account email with the local part masked after its first character, e.g. z***@example.com. Null when the account has none.
"""
- period_resets_at: typing.Optional[str] = pydantic.Field(default=None)
+ period_resets_at: str = pydantic.Field()
"""
- ISO 8601 time the plan credits reset: 00:00 UTC on the first of next month. Null on the free plan, whose 1,000 credits a month reset on usage.credits.plan.resets_at.
+ ISO 8601 time the plan credits reset: 00:00 UTC on the first of next month, on every plan.
"""
tier: str = pydantic.Field()
diff --git a/src/arcmira/types/me_response_usage.py b/src/arcmira/types/me_response_usage.py
index 5af0757..0ad4235 100644
--- a/src/arcmira/types/me_response_usage.py
+++ b/src/arcmira/types/me_response_usage.py
@@ -10,17 +10,17 @@
class MeResponseUsage(UniversalBaseModel):
rows_used: int = pydantic.Field()
"""
- Plan credits used this month, in rows: usage.credits.plan.used divided by 4, rounded up. A row is 4 credits.
+ Plan credits used this month, in rows (a row is 4 credits): usage.credits.plan.used divided by 4, rounded up.
"""
rows_remaining: int = pydantic.Field()
"""
- Credits left from the plan, grants and top-ups, on-demand excluded, in rows: divided by 4, rounded up. A row is 4 credits.
+ Credits left from the plan, grants and top-ups, on-demand excluded, in rows (a row is 4 credits): divided by 4, rounded up.
"""
monthly_rows: int = pydantic.Field()
"""
- The plan credits a month, in rows: usage.credits.plan.credits divided by 4 when the plan has a limit. A row is 4 credits.
+ Plan credits a month, in rows (a row is 4 credits): usage.credits.plan.credits divided by 4 when the plan has a limit.
"""
current_spend_cents: int = pydantic.Field()
diff --git a/src/arcmira/types/signup_verified_response.py b/src/arcmira/types/signup_verified_response.py
index 2c31bcb..6d7bb88 100644
--- a/src/arcmira/types/signup_verified_response.py
+++ b/src/arcmira/types/signup_verified_response.py
@@ -34,7 +34,7 @@ class SignupVerifiedResponse(UniversalBaseModel):
rows_allotted: int = pydantic.Field()
"""
- On a paid plan, its monthly allowance in rows; a row is 4 credits. On the free plan, the account's row allotment from before credits (1,000 for a new account). The free plan uses 1,000 credits a month, read from usage.credits on GET /v1/me.
+ Plan credits a month, in rows (a row is 4 credits), on a paid plan. On the free plan, the account's allotment from before credits (1,000 for a new account). The free plan has 1,000 credits a month; read the balance from usage.credits on GET /v1/me.
"""
next: str = pydantic.Field()
diff --git a/src/arcmira/types/transcript_quote.py b/src/arcmira/types/transcript_quote.py
index f7d91b6..568aecc 100644
--- a/src/arcmira/types/transcript_quote.py
+++ b/src/arcmira/types/transcript_quote.py
@@ -14,7 +14,7 @@ class TranscriptQuote(UniversalBaseModel):
rows: int = pydantic.Field()
"""
- Rows the whole video uses, 75 rows per 15-minute block. A row is 4 credits, so Premium uses 300 credits per block.
+ Credits the whole video uses, in rows: 300 credits per 15-minute block (75 rows; a row is 4 credits).
"""
if IS_PYDANTIC_V2:
diff --git a/src/arcmira/types/transcript_response.py b/src/arcmira/types/transcript_response.py
index d47880e..fd47e5a 100644
--- a/src/arcmira/types/transcript_response.py
+++ b/src/arcmira/types/transcript_response.py
@@ -65,7 +65,7 @@ class TranscriptResponse(UniversalBaseModel):
rows_billed: int = pydantic.Field()
"""
- Rows this captions read used: 1 row per started 15 minutes, and a row is 4 credits. 0 on a repeat of the same video, quality, language, and range inside the 7 day dedupe window. Premium reads report 0, because the Premium transcript job carries their charge.
+ Credits this captions read used, in rows (a row is 4 credits): 4 credits per started 15 minutes. 0 on a repeat of the same video, quality, language, and range inside the 7 day dedupe window. Premium reads report 0, because the Premium transcript job carries their charge.
"""
as_of: typing.Optional[str] = pydantic.Field(default=None)
diff --git a/src/arcmira/types/transcript_search_chunk.py b/src/arcmira/types/transcript_search_chunk.py
index ea8e1b0..b180c6d 100644
--- a/src/arcmira/types/transcript_search_chunk.py
+++ b/src/arcmira/types/transcript_search_chunk.py
@@ -70,7 +70,7 @@ class TranscriptSearchChunk(UniversalBaseModel):
watch_url: str = pydantic.Field()
"""
- Site-relative watch URL with the timestamp, e.g. /watch?v=...&t=4787.
+ Absolute watch URL on arcmira.com with the timestamp, e.g. https://arcmira.com/watch?v=...&t=4787.
"""
cite_line: typing.Optional[str] = pydantic.Field(default=None)