add_voice_material
ChatGPTSave something real the writer has just told you to their material bank: a story they lived, a number they measured, an opinion they hold, or an example they use. Future drafts draw on it instead of making things up. Save only what the writer supplied; never add anything you wrote or assumed.
amend_scheduled_item
ChatGPTPreview or amend the time or timezone of a scheduled Note or Article using its exact current revision. apply defaults to false for a non-mutating preview; apply=true performs the amendment after client-side confirmation. Successful retries are desired-state idempotent, and applied changes are reread and verified. Cover, content, paywall, email-delivery, and destination rewrites are unsupported.
amend_scheduled_note_content
ChatGPTPreview or replace the text of an untouched, text-only queued LinkedIn post using its scheduled Note id and exact current revision. Changes the queued delivery snapshot, not a shared draft. apply defaults to false for a non-mutating preview; apply=true performs the replacement after client-side confirmation. Provider-accepted, in-flight, media-bearing, and Article schedules are unsupported.
archive_draft
ChatGPTArchive an owned draft so it no longer appears in draft lists. Active scheduled items must be cancelled first.
cancel_scheduled_item
ChatGPTCancel a scheduled note or article, with optional kind or automatic detection by id.
cancel_scheduled_post
ChatGPTCancel a pending scheduled post. Already-published posts cannot be cancelled. Returns the new status.
cancel_substack_verification
ChatGPTCancel the selected code request for the connected account owner. Does not cancel article schedules, delete drafts, or disconnect Substack. Use only when the user wants to cancel this verification request.
complete_substack_verification
ChatGPTSubmit the six-digit code the connected account owner provides in this conversation for the same connection and code request. Never guess or automatically repeat a code. Confirmation can resume previously approved articles waiting on this connection; it is not proof of publication. Check an existing schedule afterward, or retry the same saved draft with its original settings if no schedule exists.
create_article_from_note
ChatGPTCreate a linked article draft from a saved note. Preserves the note; repeated requests open the same article without overwriting edits. Does not publish.
create_draft
ChatGPTCreate a new draft owned by the authenticated user. Returns the created draft id and title.
create_generated_notes
ChatGPTGenerate short notes in the writer's voice with Narrareach's note generator, from their own writing (source "profile") or from an article or post you pass in. Each note comes with a suggested time that avoids what is already on their calendar. This saves and schedules nothing: show the notes to the writer, then schedule each one they approve with schedule_note, passing the note as content, the platforms, its suggestedTime unchanged as scheduledFor (it is an absolute time) unless the writer picks another, the same workspace you used here, and this result's requestId as generationId. To schedule several approved notes at once, use schedule_notes with the same fields per note and a clientRequestId for each. Use create_draft only to keep a note unscheduled in the personal account (no workspace); it cannot save into a team workspace. Up to 10 notes per call and 20 calls per day; a call can take a minute or two.
create_reader_reply_draft
ChatGPTSave an owned comment reply for review. Generates in the writer’s voice when text is omitted. Returns the comment, parent note, and linked article for review. Does not publish.
decide_voice_suggestion
ChatGPTRecord the writer's answer to one suggestion from get_voice_profile. Ask the writer first and call this only after they answer: "approve" adds it as a rule (pass text if they reword it), "dismiss" means they said no, "later" asks again in a week. One suggestion per call. Never decide for the writer.
get_audience_overview
ChatGPTCheck whether Audience is ready for a Substack publication and which filters it supports: the filter columns with their operators and values, plus how many subscriber tags and saved segments the publication has. Counts only; never returns subscribers. Workspace owner only, on a plan that includes agents.
get_draft
ChatGPTGet a single draft by id, including full HTML content.
get_import_status
ChatGPTRead where the writer’s imports stand: the onboarding writing import, Substack imports (pages, notes, and articles imported, and whether voice preparation ran), blog automation sources (status, last sync, item counts), and social history imports. Statuses, counts, and error categories only; no imported text. Read-only.
get_note
ChatGPTGet a single scheduled or posted note by id, including full content and stored metrics, the connected account it names (socialAccountId) and why it is waiting if held (failureCode).
get_platform_analytics
ChatGPTFetch analytics for a connected platform. Returns account-level summary data where available, otherwise stored Narrareach note performance and connection readiness.
get_posting_schedule
ChatGPTRead the writer's Note posting schedule: the saved cadence (preferred times, posts per day, days of the week, weekend skipping), the effective schedule Narrareach uses (the default when nothing is saved), the schedule timezone, the next open queue slot, and the open slots for the next few days. To add a Note to the queue, pass nextOpenSlot.scheduledFor (or an openSlots entry's scheduledFor) unchanged to schedule_note's scheduledFor. In a team workspace the queue is the owner's, so members read the owner's schedule.
get_research_desk_answer
ChatGPTCheck on a Research Desk question started with start_research_desk_question. While done is false the desk is still researching: call again every 10 to 20 seconds, and do not start a new question meanwhile. Once done is true, answer is the desk's reply and noteIdeas are Notes it wrote for the writer to review; nothing is scheduled until the writer does it. failureMessage explains a question that could not be answered.
get_scheduled_item_readiness
ChatGPTInspect one scheduled Note or Article using stored Narrareach evidence without contacting a provider. Returns revision, draftId, destination, timing, cover, subscribe controls, paywall, email delivery, stored remote receipt, issues, and next action. Article draft content is local and is not a provider-verified copy; queued Note content is stored on the scheduled Note.
get_settings
ChatGPTRead the writer's main Narrareach Settings: preferences (preferredTimezone, capitalizeGeneratedNotes, articleLinkPlacement, and tagArticleLinksWithUtm for UTM tags on article links), the default account on each platform (Substack publication, LinkedIn destination, Instagram, and Threads, Facebook, TikTok, Pinterest and X accounts), connection health per platform, and email notification settings. Reads what Narrareach has stored; it does not refresh connections with any platform. Change preferences with update_settings. Personal account only.
get_stats_insights
ChatGPTRead stored Narrareach Stats for a period: reach, engagement, conversion, publishing rhythm, engagement peak, other-writers timing benchmark, and latest audience snapshot. Does not live-fetch Substack or per-platform account analytics.
get_stats_snapshot
ChatGPTRead the stored daily audience series for a period: subscribers, paid subscribers, followers, email open rate, unsubscribes, impressions, engagements, and (for the owner) ARR and Medium earnings, one point per day, plus the latest point and the change over the period. Reads what Narrareach has stored; it does not live-fetch Substack. Team members see only their assigned publication, without ARR or account-wide fields.
get_substack_verification_status
ChatGPTRead whether your connected Substack publication needs a code and whether a code request is waiting. Does not request a code, change the connection, or publish. Only the connected account owner can check it.
get_transcript
ChatGPTGet the transcript of a YouTube video, a podcast episode (an RSS feed, an Apple Podcasts link, or an episode page that links its audio), or a direct link to an audio file, so you can quote, summarise or repurpose it. Pass url, or uploadUrl for a file the writer uploaded to Narrareach. For a feed or show, episode picks an episode by title or guid; the latest is used otherwise. Short sources come back ready with the text. Long audio is transcribed in the background: the result is status processing with a transcriptId, so call get_transcript_status with it every 20 seconds or so until it is ready. Spotify links cannot be transcribed. A transcript someone already requested is returned from the cache and does not count against the allowance. When the day's audio minutes are used up, podcast feed and Apple Podcasts links are refused, even for an episode already in the cache; cached YouTube videos, audio file links (with or without an extension) and uploads still work. Uses the connected writer's own daily transcript allowance (YouTube requests and audio minutes, reset at midnight UTC), not a team workspace owner's; available on the Revenue Writer plan and above. Counts as five requests against the rate limit.
get_transcript_status
ChatGPTCheck on a transcript that get_transcript returned as processing. While status is processing, call again every 20 seconds or so; long audio can take several minutes. Once ready, the result has the text. Reading a transcript does not use the allowance.
get_user_profile
ChatGPTGet the authenticated Narrareach user — name, email, timezone, plan, connected platforms, Substack publications, and any team workspaces/writers available for multi-writer scheduling on this connection.
get_voice_profile
ChatGPTRead the writer's voice profile: how they sound, their do/don't rules, topics, stances, real material, instructions, and a few of their own posts as examples. Call this before drafting or rewriting anything in the writer's voice.
list_content_versions
ChatGPTList a note and its linked article with independent statuses and destinations.
list_drafts
ChatGPTList the authenticated user's drafts, newest first. Excludes archived drafts and returns compact summaries without full HTML content.
list_hashtag_sets
ChatGPTPersonal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
list_inspiration_posts
ChatGPTList posts the user has saved to their inspiration library (newest first).
list_instagram_destinations
ChatGPTList the connected Instagram accounts available for Notes. Returns each accountId for schedule_note.instagramDestinations, how many accounts one Note may target, and defaultDestination: the account a Note posts to when instagramDestinations is omitted. When defaultIsAmbiguous is true several accounts are connected and none is marked default, so ask the writer which account to use and pass it explicitly.
list_linkedin_article_destinations
ChatGPTList personal profiles and Company Pages available for LinkedIn Articles. With authorUrn, also returns newsletters owned by that author.
list_linkedin_destinations
ChatGPTRefresh and list LinkedIn personal profiles and Company Pages available for Notes. Returns accountId, organizationUrn for Pages, and the configured default destination.
list_medium_publications
ChatGPTList Medium publications available to the connected account with writer access or higher. Uses the saved list unless refresh is true. Returns publication ids and canPublish: true indicates direct publishing permission; false indicates editorial review with content unpublished until editor acceptance.
list_notes
ChatGPTList the user’s notes across every supported note platform. Includes scheduled, failed, and posted notes with the latest stored engagement snapshot when available. Each note carries socialAccountId (the connected account it names on Threads, Facebook, TikTok, Pinterest or X; null means the only account or the default) and failureCode (why a held note is waiting).
list_reader_activities
ChatGPTPull Substack likes, comments, and restacks from the authenticated Narrareach account.
list_reader_reply_drafts
ChatGPTList saved reply drafts for the selected publication, filtered by status. Does not publish or change drafts.
list_scheduled_items
ChatGPTList Notes and Articles in one bounded schedule view with destination, content-readiness checks, stored provider receipt state, and next action. workspace and writer scope authorized team Notes; team Articles remain private to their owner. Each Note destination carries accountId (the connected account it names; null means the only account or the default) and accountCanChange. A held Note reports why in issues (social_account_choice_required, social_account_disconnected, missed_while_account_unavailable, x_account_changed) with a writer-facing deliveryNote. Reads stored evidence without contacting a provider.
list_scheduled_posts
ChatGPTList scheduled posts for the authenticated user, ordered by scheduled time ascending.
list_social_accounts
ChatGPTList the connected Threads, Facebook, TikTok, Pinterest and X accounts a Note can be sent to. Returns one entry per platform with each accountId for schedule_note.socialAccountIds, defaultAccountId (the account used when none is named), and accountChoiceRequired: true when several accounts are connected and none is the default, in which case ask the writer which account and pass it in socialAccountIds. X is listed only when the writer has added X accounts for posting from more than one; a writer who uses a single X connection has no X entry and needs no socialAccountIds for X. Instagram and LinkedIn have their own tools: list_instagram_destinations and list_linkedin_destinations. The default account is set, and accounts are connected or reconnected, by the writer in Narrareach Settings; no tool does either.
list_social_posts
ChatGPTList the writer’s own posts on connected Instagram, Threads, Facebook, LinkedIn, Bluesky, Pinterest, TikTok and X accounts, including posts published outside Narrareach, newest first, with the latest metrics each platform reported (likes, comments, shares, saves, sends, clicks, views, reach, impressions, follows, reposts). source says whether the post went out through Narrareach. Metrics a platform does not report are null, not 0 (for example, Threads has no reach and Bluesky only likes, comments and shares); on X the view count is impressions. Filter by platform, source, and from/to on published time; page with page.nextCursor. Personal account only; Substack is covered by list_notes and get_platform_analytics.
list_topic_suggestions
ChatGPTSuggest timely topics the writer could write about now, for each of their content pillars (their profile themes and the tags they use most). Each suggestion has the topic, its pillar, a fit score (0 to 100), why it is timely now, a suggested angle, and evidence: the trend sources and headline links behind it. Show the evidence links so the writer can check them; do not present a suggestion as fact beyond what they say. pillars lists the writer's pillars with their ids; pass pillarId to see one. When recommendations is empty, emptyReason says why: refreshing means the writer's niches are still being searched, so call again in about 30 seconds; unknown_pillar means that pillarId is not one of theirs, so call again without it; no_trends or no_matches mean nothing timely fits right now, so do not retry soon; no_pillars and no_profile mean the writer needs themes or a niche on their Narrareach profile; check_unavailable means try again later. To draft Notes on a suggestion in the writer's voice, call create_generated_notes with source "articles", postTitle set to the topic (trimmed to 300 characters), postContent set to its whyNow, its suggestedAngle, and each headline title with its URL (one per line; a headline without a URL by its title only), postUrl set to the first link's URL (left out when that link has none), and customInstructions "Use only the facts in this text; do not add any." The generator writes from that text and checks the notes against it, so the evidence goes with the notes. Each create_generated_notes call costs 10 requests against the rate limit. Available on the Revenue Writer plan and above, on the writer's own plan. Counts as three requests against the rate limit.
list_voice_changes
ChatGPTList recent changes to the writer's voice profile, newest first: what changed, who made it, where (the Voice page, an assistant, the API), and when. Only the newest change can be undone; pass its id to undo_voice_change.
list_voice_examples
ChatGPTList the writer's own posts, newest first, that can be pinned as examples of how they sound, with the example ids update_voice_examples takes. Search by text or date and page with nextCursor. Also returns which posts are pinned and which are excluded. Posts outside the writer's main languages, that read like a reply to someone else, or that began as a Narrareach draft (startedFromDraft) are marked: they are never chosen automatically but can be pinned. A note sent to several platforms is listed once, as its Substack copy when there is one.
list_workspaces
ChatGPTDiscover the authenticated account’s personal context and authorized team workspaces, writers, and publications. Returns workspace and writer identifiers for team scheduling; no login switch is required.
preview_audience_segment
ChatGPTCount how many subscribers match a set of filters, without listing them. Columns: type (is, is_not, is_any_of); started_at (on, before, after); activity (gt, gte, lt, lte, is, is_not). Each column at most once; combine Type values with is_any_of. Returns the count and a plain-language rule. Never returns subscribers or emails. Workspace owner only, on a plan that includes agents.
preview_note_quote
ChatGPTResolve a public Substack Note for review. Read-only: publishable is always false. No dedicated quote field is available yet. A Substack Note URL in Note text is attached by Substack as a quote; the URL stays visible in the text.
refresh_medium_stats
ChatGPTSync the writer's Medium stats from Medium and store them, then return them in the same shape as get_platform_analytics for MEDIUM. Use when get_platform_analytics reports no stored Medium stats, or the writer asks for fresh numbers.
refresh_substack_benchmark
ChatGPTRecompute the Substack Notes benchmark from the latest public notes and save it. Scores up to 10 recent notes against the content baseline. Defaults to the publication of the saved benchmark, then the default connected Substack publication. Personal account only. Limited to once every 6 hours; when limited, returns the saved benchmark unchanged with rateLimited true. Never publishes.
remove_voice_material
ChatGPTRemove one item from the writer's material bank, when the writer asks you to drop it. Use the material id from get_voice_profile (pass detail "full" to see every item). The writer can undo it.
remove_voice_rule
ChatGPTRemove one rule from the writer's voice profile, when the writer asks you to drop it. Use the rule id from get_voice_profile. The writer can undo it.
reply_to_reader_activity
ChatGPTPublish a reply to an owned Substack comment activity. A successful reply moves the activity to History.
reschedule_scheduled_item
ChatGPTReschedule a scheduled note or article, with optional kind or automatic detection by id. Pending LinkedIn session sync leaves the existing schedule unchanged. Returns the outcome and informational advisories.
save_hashtag_sets
ChatGPTPersonal saved hashtag sets. Saving sets never inserts hashtags into content or publishes anything. Up to 20 sets, 30 hashtags per set.
save_voice_preference
ChatGPTSave one writing preference the writer has just stated in their own words in this conversation, such as "stop ending with a moral" or "I write in short paragraphs". It becomes a rule in their voice profile and applies to future drafts. Do not infer a preference from a single edit, and do not save anything the writer did not say. Style only: it cannot allow invented facts, stories, quotes, or numbers. The writer can undo it on the Voice page in Narrareach.
schedule_article
ChatGPTSchedule an article to Substack, Medium, LinkedIn Articles, or X. LinkedIn Articles uses a separate browser-session connection from regular LinkedIn posts. If no draftId is provided, a new article draft is created automatically. Supports a cover image, inline images, and Substack-only inline videos (public URLs, data URIs, or raw base64), plus optional SEO metadata for supported destinations. If a LinkedIn Articles session sync is pending, new article input is saved as a draft and nothing is scheduled until the user syncs LinkedIn Articles and retries with the returned draftId. Relay any returned advisories as informational status; they do not mean scheduling failed.
schedule_note
ChatGPTSchedule a note to any combination of Substack, LinkedIn, X, Bluesky, Threads, Instagram, Facebook, TikTok, and Pinterest; Instagram, TikTok, and Pinterest require an image or video. Creates a note draft when draftId is absent. Character limits: Bluesky 300, Threads 500, LinkedIn 3000, X 25000 (posted as a thread). Explicit platformVersions must fit their limits; otherwise overlong platform text is shortened at a sentence boundary, with adjustedPlatforms and warnings returned. When a writer has several connected accounts on Threads, Facebook, TikTok, Pinterest or X, the Note goes to the default account unless socialAccountIds names one from list_social_accounts; with several and no default the request is refused until one is named. Authorized team routing uses workspace and writer. Substack Notes publish from the verified connected profile, not a publication page.
schedule_notes
ChatGPTSchedule up to 50 notes in one call, each exactly as schedule_note would (same platforms, limits, account defaults and Substack profile rules). Every note is checked first, and each gets its own result: scheduled (scheduleIds), duplicate (already scheduled with the same text, platform and time, so existingScheduleIds are returned and nothing is copied), or failed (reason says what to fix). One bad note does not stop the others. A note can quote a Substack Note or post with quoteUrl, as in schedule_note. Give every note its own clientRequestId and reuse the same ids when retrying the batch, so notes that already went through are returned rather than scheduled again. workspace, writer and publication apply to every note. For media, platformVersions, first replies or account choices, use schedule_note for that note.
send_reader_reply_draft
ChatGPTPublish one saved reply only after the user has reviewed and approved its full text and target comment. Supply updatedAt as expectedUpdatedAt. SENDING is unconfirmed: inspect the thread, never create a replacement to retry. Recovery is available only in the Narrareach app: open Activity, check reply status, then confirm the reply did not post.
start_substack_verification
ChatGPTRequest verification for the selected Substack connection after its owner asks to continue. Returns an email or authenticator code prompt, or verified: true when Substack confirms without a code. Confirmation can resume previously approved articles waiting on this connection. Does not create a new schedule. Check existing article status before retrying. When a code is needed, ask in a normal chat message, end your turn, and wait for the user’s reply. If a code prompt closes without an answer, keep waiting in the conversation; do not request another code or retry publishing.
undo_voice_change
ChatGPTUndo the most recent change to the writer's voice profile, when the writer asks you to. It undoes one change, whoever made it, and can itself be undone.
update_draft
ChatGPTUpdate an unscheduled draft. Only the provided fields are changed. Cannot edit drafts owned by other users. An active scheduled Article must be cancelled or amended through a provider-safe schedule workflow; changing its local draft would not reliably update the provider copy.
update_reader_activity
ChatGPTMove an owned reader activity item to Inbox or History.
update_reader_reply_draft
ChatGPTEdit an unsent reply draft and record the revision. Supply its current updatedAt as expectedUpdatedAt. Does not publish.
update_scheduled_note_account
ChatGPTSend an already scheduled Note from a different connected account on Threads, Facebook, TikTok, Pinterest or X. Use the scheduled Note id and an accountId from list_social_accounts. Works only while the Note has not started sending. A Note held for an account choice resumes if its time is still ahead; if its time has passed, the result has needsNewTime: true and the Note must be rescheduled. Only change the account the writer asked for. Personal account only: it changes Notes you own, not a team workspace's.
update_settings
ChatGPTChange the writer's preferences: preferredTimezone, capitalizeGeneratedNotes, articleLinkPlacement (where article links go in Notes: COMMENT or BODY), and tagArticleLinksWithUtm (add UTM tags to article links). Only the fields passed change; call get_settings first and change only what the writer asked for. Default accounts, connections, notifications, billing and security cannot be changed here: the writer changes them in Narrareach Settings. To move one scheduled Note to another connected account, use update_scheduled_note_account. Personal account only.
update_voice_examples
ChatGPTChoose which of the writer's own posts show how they sound, when the writer asks you to: pin posts so they are used first (up to 6), unpin them, exclude posts that are not how they sound, restore excluded posts, or reset to their most recent posts. Example ids come from list_voice_examples. One call is one change the writer can undo.
update_voice_profile
ChatGPTSet sections of the writer's voice profile when the writer asks you to: how they sound, their niche, their audience, their instructions for drafts, or their topics. Pass only the sections to change; each replaces what is there (topics replaces the whole list). Use the writer's own words and never fill a section in on your own. Style only: it cannot allow invented facts, stories, quotes, or numbers. One call is one change the writer can undo.
update_voice_rule
ChatGPTReword one rule in the writer's voice profile, when the writer asks you to change it. Use the rule id from get_voice_profile. Style only: a rule cannot allow invented facts, stories, quotes, or numbers.
update_voice_stances
ChatGPTAdd or remove stances in the writer's voice profile: what they believe ("believe") or would never say ("never"). Add only stances the writer has stated in their own words; never infer one. Stance ids for removal come from get_voice_profile. One call is one change the writer can undo.
upload_media
ChatGPTUpload one image or video for later scheduling from a public HTTPS URL, data URI, base64 bytes, or a file the user attached in the chat. In ChatGPT, pass an attached image or video in file. URL ingestion depends on the source host allowing automated access. Files that exist only in your client (sandbox paths, local disk) are unreachable as url or data: use file where supported, send their bytes as a data URI or base64, or ask the user for a public HTTPS link, such as a Canva download or share link. Success is confirmed only by the returned publicUrl. Returns a public media URL. API documentation: https://www.narrareach.com/api-docs.
verify_substack
ChatGPTCompatibility tool for existing connections. New clients can use get_substack_verification_status, start_substack_verification, complete_substack_verification, and cancel_substack_verification for individual operations. Confirm Substack without leaving this conversation or signing in again. Use the exact connectionId from the publishing response or get_user_profile. Check status first. When the user wants to continue, use start to request a code, then ask them for it here. If start returns verified: true, skip code entry. Ask in a normal chat message and wait for the user’s reply; if a prompt closes without an answer, keep waiting in chat without requesting another code. Use complete with the returned id and the code they provide. Never guess a code, repeat submissions automatically, or send the code to another tool. Only the connected account owner can confirm. After completion, poll the existing schedule if its ID is known. Otherwise promptly retry the same saved draft with the original settings; the scheduler checks for an existing matching schedule before creating one. Verification is not proof of scheduling or publishing.