- Lead the README with tested examples for transcript reads, quotes with source links, and company monitoring.
- Keep detailed async, pagination, error, and Premium polling examples in the SDK guide.
Generated from the API document of 2026-10-15.
- Error and access details expose the optional
urlfield for Terms of Service responses. - The API document includes the current Terms error codes and clarifies that the remaining rate limit is an estimate.
- Published from the current public source history with a matching release tag.
Generated from the API document of 2026-10-12, after the clear-language release (arcmira/mcp 0.10.7). One field set is removed, so it is a minor bump while the package is 0.x.
client.entities.momentum(id, days=...)takes a lookback window from 7 to 365 days (default 30). The response addswindow(after,before,days) andvolume.mentions_window,mentions_prior_window,delta_window_absoluteanddelta_window_pct; the verdict and top shows cover that window. Each call uses 10 credits at any window.MeResponse.freshness(delay_days,served_through) says where results stop on a plan with a delay. Mentions, counts and episode lists carryfreshnessandunlockwhen the plan's delay cut the window.- Errors carry
details.limit(kind,amount,used,unit,resets_at): the limit a refusal met, such as plan credits, the on-demand budget, a member's on-demand limit or Premium hours. - Breaking:
TranscriptSearchResponse.partialandfailed_batchesare removed. The API no longer sends them. - The README states usage as fact: the on-demand budget is set in the dashboard and Arcmira enforces it, so the call takes no spending amount.
Generated from the API document of 2026-10-08, after the on-demand pause. No type or method changed.
- The API's
402 on_demand_pausedarrives asPaymentRequiredErrorwitherror.typequota_exceededand noerror.unlock. The account's included credits are used and on-demand usage is paused after a declined payment. An admin of the account updates the card at https://arcmira.com/dashboard/billing, and on-demand usage resumes once the invoice is paid.
Generated from the API document of 2026-10-08, after the team account changes. This release removes types and a method, so it is a minor bump while the package is 0.x.
Breaking changes from 0.4.
trackers.createis removed, with its request types.POST /v1/trackersanswers410 tracker_create_retired. Follow ids or exact names in a monitor withmonitors.entities.add(monitor_id, entity_ids=[...], names=[AddEntitiesRequestNamesItem(name=..., type=...)]), which reports the plan limit per entity asreason="tracker_limit_reached".Trackerno longer hasnotify_email,notify_webhook,notify_slack,webhook_url,slack_channel_idorslack_integration_id, andtrackers.updateno longer takes them. A tracker alerts through its monitor's delivery; set it withmonitors.update.Tracker.monitor_idis always set.monitors.createno longer takesteam_id.Monitorno longer hasteamormuted, andMonitorTeamis removed. A recipient status is nevermuted.MeResponse.usage.credits.purchasedis removed.
Added.
MeResponse.account(id,name,kindpersonalorteam,plan) andMeResponse.role(owner,adminormember) say whose credits the key spends.email_maskedis the person calling.- The API's
402 member_limitand402 fair_use_caparrive asPaymentRequiredErrorwitherror.typequota_exceededand noerror.unlock.
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.
Generated from the v1 document of 2026-10-04, which prices every read in credits. PremiumQuote replaces the TranscriptPurchaseQuote type.
Paid reads use credits from your plan, then your on-demand budget.
Generated from the v1 document of 2026-10-02. The document dropped from 88 operations to 36. Routes that left it still serve over HTTP, but the SDK no longer has methods for them.
Added.
client.monitors.entities.add(id, entity_ids=None, names=None, person_match_mode=None)follows entities in a monitor by id, or by exact name and type for a name not yet indexed. It reuses the account's tracker for each entity or creates one, then attaches it. Each id or name gets one result, and one that cannot be followed comes back withattached: falseand a reason.trackers.createandnamesacceptorgfororganization, and the duplicate check ignores case.client.integrations.slack.list()lists the account's active Slack workspaces with theslack_integration_idandslack_channel_idvalues a monitor needs for Slack delivery. Slack is connected in the dashboard, not through the API.monitors.createtakesteam_id.Monitorcarriesaccess,mutedandteam.feedback.submittakescategoryandmcp_call_id, andtype="experience"reports how a task went as a whole.- List bodies for mentions, recommendations, search, counts and channel videos echo the applied date window as
window: { after, before }.
Breaking changes from 0.3.
- Premium is one read.
transcripts.get(video_id, quality="premium")answersready(200) when the account owns the transcript. Otherwise it starts transcribing the whole video, using credits from the plan and then the account's on-demand budget, and answerspending(202) with thejoband aRetry-Afterheader. Read again afterRetry-After. Repeated reads join the same job and never use credits twice. When the last transcription of the video failed or was refunded, the read answersfailed(200) with thejobandlast_attemptand uses no credits; passretry=Trueto transcribe it again, which uses credits again.TranscriptResultis nowTranscriptResult_Ready | TranscriptResult_Pending | TranscriptResult_Failed. Priced refusals carry oneRefusedQuotetype. Thepreparation_requiredstate andTranscriptResult_PreparationRequiredare gone. transcripts.prepare_and_waitis removed, along withPreparationError,PreparationFailedError,PreparationTimeoutErrorandPremiumUnavailableError. Loop ontranscripts.get(..., quality="premium")untilstate == "ready". The README has the loop.transcripts.requestandtranscripts.statusare removed, with theTranscriptRequestSubmitResponsetype. The Premium read starts and reports its own job.transcripts.list_requestsstill lists past Premium transcriptions.- A Premium refusal raises from the read itself.
PaymentRequiredError(402) carriesquota_exceededorspend_limit_exceeded, andForbiddenError(403) carriespaid_plan_required. Nothing is charged. - Error extras moved under
error.details.body.quoteis nowbody.error.details.quote,body.existing_request_idisbody.error.details.existing_request_id, andbody.existing_id(409tracker_already_exists) isbody.error.details.existing_id. - Reads take ids.
mentions.listandrecommendations.listrequireentity_id(ent_N), andchannel_idtakes a YouTube channel id (UCplus 22 characters).entity_name,entity_typeandchannel_nameare gone. A name where an id belongs raisesBadRequestErrorwith codeid_requiredand names the parameter. Resolve names first withentities.resolve. - Dates are
afterandbefore, half-open[after, before), on every dated read.mentions.listandrecommendations.listreplacedate_fromanddate_to.date_towas an inclusive day, sodate_to="2026-09-01"becomesbefore="2026-09-02".transcripts.search,mentions.countandchannels.videos.listreplacepublished_afterandpublished_before. recommendations.listtakesclass_(sponsored,organicormention; omit it for all) in place ofmention_class(ad_read,endorsement,mentionorall).RecommendationandRecommendationEnrichmentItemcarryclass_in place ofmention_class, and so doesWrongClassificationChangein feedback corrections.transcripts.searchcallsGET /v1/search. Itskindtakessponsored,organicormentionin place ofmention,recommendation_sponsoredandrecommendation_organic. The response renamesrequested_ktolimitandreturned_ntoreturned, andfilters.published_afterandfilters.published_beforemove towindow.TranscriptSearchChunk.text_withheldis gone.- List bodies name their collection.
MentionListResponse.dataismentions,RecommendationListResponse.dataisrecommendations, andAlertListResponse.dataisalerts. Iterating a pager is unchanged. - Integer ids and
MM:SSstrings are gone.Mentiondropsappearance_id,start_timestampandend_timestamp, andMentionMediadropsid.Recommendationdropsrecommendation_id,start_timestampandend_timestamp. Usestart_seconds,end_secondsandmedia.video_id.Alertreplacesmedia_idandappearance_idwithvideo_id.Entity.numeric_idis gone. Premiumspeakers[].entity_idis anent_Nstring, where 0.3 had an integer. Feedback ids arefbk_N. monitors.updatetakespausedin place ofis_paused, andis_collapsedandsort_orderare gone.Monitor,Trackerand monitor tracker rows carrypausedin place ofis_paused, andMonitordropsis_collapsedandsort_order.- Models use the snake_case wire names. Attribute names were already snake_case in 0.3, but the camelCase aliases (
videoId,watchUrl,invitationStatusand others) are gone, somodel_dump(by_alias=True)and the JSON on the wire now match the attribute names. MentionCountsResponsereplacespublished_afterandpublished_beforewithwindow.FeedbackCorrectionResultdropsnew_mention_class,previous_mention_class,recommendationandrows_affected.feedback.submitno longer requiresquery.typestays required.trackers.createfollows a channel by its YouTube channel id inentity_name. A channel name raisesid_required.me.usage.hitsis gone. Monitor alerts cost credits now and count inusage.credits.
Removed methods and their replacements.
| 0.3 | 0.4 |
|---|---|
entities.search, entities.lookup, entities.cards |
entities.resolve, then entities.get |
entities.mentions.list(id) |
mentions.list(entity_id=id) |
entities.recommendations.list(id) |
recommendations.list(entity_id=id) |
people.get, topics.get, organizations.get, products.get, channels.get |
entities.resolve, then entities.get. For a channel, channels.coverage and channels.videos.list |
people.appearances.list |
mentions.list(entity_id=..., is_appearance=True) |
channels.related.* |
mentions.count(channel_ids=..., entity_types=...) |
channels.guests.list |
mentions.count(channel_ids=..., entity_types="person", mode="appearances") |
people.related.*, topics.related.*, organizations.related.*, products.related.* |
No direct replacement. mentions.list(entity_id=...) gives the episodes, and mentions.count(video_ids=...) counts what else they mention |
transcripts.captions |
transcripts.get(video_id). languages lists every caption track and language selects one |
transcripts.request, transcripts.status, transcripts.prepare_and_wait |
transcripts.get(video_id, quality="premium"), read again on 202 |
corrections.*, transcripts.edits.*, transcripts.speakers.*, transcripts.merges.* |
No SDK method. Report a wrong row with feedback.submit |
team.members, team.spend, team.usage_events.list |
None. The routes are deleted |
The first usable SDK, replacing the URL-only placeholder. The public URL constants remain available.
- Generated synchronous
Arcmiraand asynchronousAsyncArcmiraclients with typed responses and cursor pagination. transcripts.getreturns a union discriminated onstate. The Premium purchase is one job, created bytranscripts.requestand polled withtranscripts.status.transcripts.prepare_and_waitreads Premium, posts the purchase once when needed, polls at the pace the API sets and returns the transcript.ApiErrortext leads with the status, code and message.- Licensed under Apache-2.0.