# MCP tool reference

> Every tool on Prefera's MCP server, with its class, permission areas and inputs, written from the live tool registry.

Source: https://prefera.si/docs/agents/tools
Docs index for agents: https://prefera.si/llms.txt

Each tool below is exactly what the server lists to an agent: the same name, title, description and input schema. The same tools run over the REST API at `POST /api/v1/tools/{name}` (see [REST API](/docs/api)).

- **Class** decides the access level a key or connection needs: read, write or publish. See [Permissions, approvals and limits](/docs/agents/permissions).
- **Areas** are the permission areas a call needs. A connection limited to other areas gets `area_not_allowed`.
- Pass `brand` (a brand id or domain) when the workspace has more than one brand. `list_brands` gives the ids.

Prefera's MCP server has 173 tools. This list is written from the server's own tool registry each time the site is built.

Costly tools are limited to 20 calls an hour per key or connected app, and 30 an hour per person in a workspace across all their keys and apps. Over the limit, a call returns the code `limit`.

| Tool | Title | Class |
| --- | --- | --- |
| [list_brands](#list-brands) | List brands | read |
| [losing_questions](#losing-questions) | Losing questions | read |
| [question_detail](#question-detail) | Question detail | read |
| [top_sources](#top-sources) | Top sources | read |
| [proof_results](#proof-results) | Proof results | read |
| [facts](#facts) | Approved facts | read |
| [pitch_list](#pitch-list) | Who to pitch | read |
| [list_fixes](#list-fixes) | List fixes | read |
| [get_fix](#get-fix) | Get a fix | read |
| [get_question_actions](#get-question-actions) | Question actions | read |
| [mark_fix_published](#mark-fix-published) | Mark a fix published | write |
| [get_moves](#get-moves) | All moves | read |
| [search_opportunities](#search-opportunities) | Search opportunities | read |
| [rankings](#rankings) | Your searches and movers | read |
| [tracked_keywords](#tracked-keywords) | Tracked keywords | read |
| [keyword_gap](#keyword-gap) | Keyword gap | read |
| [authority](#authority) | Authority and links | read |
| [directories](#directories) | Directories to list on | read |
| [mark_directory](#mark-directory) | Mark a directory | write |
| [start_fix](#start-fix) | Start a fix | write |
| [run_check](#run-check) | Re-check questions | write |
| [get_results](#get-results) | Results | read |
| [autopilot_plan](#autopilot-plan) | This week's plan | read |
| [flagged_claims](#flagged-claims) | Flagged claims | read |
| [publish_preview](#publish-preview) | Preview as published | read |
| [fix_batch](#fix-batch) | Batch of drafts | read |
| [save_draft_text](#save-draft-text) | Save draft text | write |
| [regenerate_draft](#regenerate-draft) | Write a fresh draft | write |
| [restore_draft_version](#restore-draft-version) | Restore a version | write |
| [accept_flagged_claim](#accept-flagged-claim) | Keep a flagged sentence | write |
| [remove_flagged_claim](#remove-flagged-claim) | Remove a flagged sentence | write |
| [update_fix_details](#update-fix-details) | Update fix details | write |
| [set_fix_destination](#set-fix-destination) | Choose where an article is published | write |
| [set_fix_destinations](#set-fix-destinations) | Choose several sites for an article | write |
| [schedule_fix_publish](#schedule-fix-publish) | Schedule publishing to a site | publish |
| [cancel_fix_schedule](#cancel-fix-schedule) | Cancel a scheduled publish | write |
| [set_autopilot_destinations](#set-autopilot-destinations) | Choose where Autopilot publishes | write |
| [push_fix_to_cms](#push-fix-to-cms) | Send to the connected site as a draft | publish |
| [publish_fix_live](#publish-fix-live) | Publish live | publish |
| [unpublish_fix](#unpublish-fix) | Unpublish | publish |
| [undo_page_edit](#undo-page-edit) | Undo a live page edit | publish |
| [abandon_fix](#abandon-fix) | Abandon a fix | write |
| [stop_tracking_fix](#stop-tracking-fix) | Stop tracking | write |
| [start_fix_batch](#start-fix-batch) | Draft fixes for all winnable questions | write |
| [approve_batch_fix](#approve-batch-fix) | Approve a batch draft | write |
| [publish_ready_drafts](#publish-ready-drafts) | Send ready drafts to the site | publish |
| [find_inbound_links](#find-inbound-links) | Find pages that should link here | write |
| [content_plan](#content-plan) | Content plan | read |
| [start_content_plan](#start-content-plan) | Start or refresh the plan | write |
| [move_plan_item](#move-plan-item) | Move a piece | write |
| [swap_plan_days](#swap-plan-days) | Swap two pieces | write |
| [skip_plan_item](#skip-plan-item) | Skip a piece | write |
| [restore_plan_item](#restore-plan-item) | Restore a piece | write |
| [replace_plan_item](#replace-plan-item) | Swap in another topic | write |
| [draft_plan_item](#draft-plan-item) | Draft a piece now | write |
| [approve_plan_item](#approve-plan-item) | Approve a piece | publish |
| [save_content_plan_settings](#save-content-plan-settings) | Content plan settings | write |
| [set_content_plan_autopilot](#set-content-plan-autopilot) | Content plan autopilot | publish |
| [run_status](#run-status) | Runs: status and history | read |
| [run_now](#run-now) | Run a check now | write |
| [stop_run](#stop-run) | Stop the run | write |
| [outreach_board](#outreach-board) | Outreach board | read |
| [set_prospect_stage](#set-prospect-stage) | Move a prospect | write |
| [find_contact](#find-contact) | Find who to write to | write |
| [draft_follow_up](#draft-follow-up) | Write a follow-up | write |
| [save_follow_up](#save-follow-up) | Save a follow-up | write |
| [approve_outreach_send](#approve-outreach-send) | Approve emails for sending | publish |
| [cancel_queued_email](#cancel-queued-email) | Cancel a queued email | write |
| [question_answers](#question-answers) | Answers for a question | read |
| [all_questions](#all-questions) | All questions | read |
| [competitors](#competitors) | Competitors comparison | read |
| [accuracy](#accuracy) | Accuracy items | read |
| [traffic](#traffic) | Traffic | read |
| [readiness](#readiness) | Site readiness | read |
| [local](#local) | Local | read |
| [alerts](#alerts) | Alerts | read |
| [monday_brief](#monday-brief) | Monday brief | read |
| [brand_style](#brand-style) | Brand style | read |
| [integrations_status](#integrations-status) | Integrations status | read |
| [get_tracking_setup](#get-tracking-setup) | Tracking setup | read |
| [get_usage](#get-usage) | Usage and content credits | read |
| [get_claude_picks](#get-claude-picks) | Claude questions | read |
| [export_data](#export-data) | Export as CSV | read |
| [deep_audit](#deep-audit) | Deep Audit report | read |
| [add_questions](#add-questions) | Add questions | write |
| [discover_questions](#discover-questions) | Discover questions | write |
| [archive_question](#archive-question) | Archive a question | write |
| [restore_question](#restore-question) | Restore a question | write |
| [set_question_country](#set-question-country) | Set a question's country | write |
| [set_question_stage](#set-question-stage) | Set a question's buyer stage | write |
| [promote_suggestion](#promote-suggestion) | Promote a suggested question | write |
| [dismiss_suggestion](#dismiss-suggestion) | Dismiss a suggested question | write |
| [unpin_question](#unpin-question) | Unpin a question | write |
| [add_competitor](#add-competitor) | Add a competitor | write |
| [remove_competitor](#remove-competitor) | Remove a competitor | write |
| [set_competitor_aliases](#set-competitor-aliases) | Set a competitor's aliases | write |
| [find_competitor_domain](#find-competitor-domain) | Find a competitor's website | write |
| [add_fact](#add-fact) | Add a fact | write |
| [update_fact](#update-fact) | Update a fact | write |
| [approve_fact](#approve-fact) | Approve a fact | write |
| [confirm_fact](#confirm-fact) | Confirm a fact is still true | write |
| [retire_fact](#retire-fact) | Retire a fact | write |
| [restore_fact](#restore-fact) | Restore a fact | write |
| [reverify_facts](#reverify-facts) | Re-check facts against their sources | write |
| [track_keywords](#track-keywords) | Track keywords | write |
| [remove_keyword](#remove-keyword) | Stop tracking a keyword | write |
| [add_keyword_to_plan](#add-keyword-to-plan) | Add a keyword to the content plan | write |
| [research_keywords](#research-keywords) | Keyword research lookup | write |
| [add_cluster_to_plan](#add-cluster-to-plan) | Add a keyword cluster to the content plan | write |
| [plan_answer_pages_month](#plan-answer-pages-month) | Plan this month's Answer Pages | write |
| [approve_answer_pages_plan](#approve-answer-pages-plan) | Approve the plan and start drafting | write |
| [set_answer_page_day](#set-answer-page-day) | Set an Answer Page's publish day | write |
| [skip_answer_page](#skip-answer-page) | Skip or restore an Answer Page | write |
| [set_answer_page_format](#set-answer-page-format) | Set an Answer Page's format | write |
| [retry_answer_page](#retry-answer-page) | Try a failed Answer Page again | write |
| [approve_answer_page](#approve-answer-page) | Approve a drafted Answer Page | publish |
| [approve_clean_pages](#approve-clean-pages) | Approve every clean page | publish |
| [publish_answer_page](#publish-answer-page) | Publish an approved Answer Page now | publish |
| [mark_answer_page_published](#mark-answer-page-published) | Mark an Answer Page as published by hand | write |
| [answer_page_handoff](#answer-page-handoff) | Answer Page text and coding-agent prompt | read |
| [set_answer_pages_autopilot](#set-answer-pages-autopilot) | Switch Answer Pages autopilot | publish |
| [unpublish_answer_page](#unpublish-answer-page) | Unpublish an Answer Page | publish |
| [remove_page_image](#remove-page-image) | Remove a page image | write |
| [regenerate_page_image](#regenerate-page-image) | Make a new AI image for a page | write |
| [add_page_image](#add-page-image) | Add an image to a page | write |
| [set_name_competitors](#set-name-competitors) | Name competitors on comparison pages | write |
| [set_fact_check_policy](#set-fact-check-policy) | When a sentence has no approved fact behind it | publish |
| [set_page_photos](#set-page-photos) | AI images in long-form pages | write |
| [post_syndication](#post-syndication) | Post a page to Dev.to or Hashnode | publish |
| [mark_medium_posted](#mark-medium-posted) | Mark a page as posted on Medium | write |
| [set_syndication_platforms](#set-syndication-platforms) | Pick the platforms for a page | write |
| [set_auto_syndicate](#set-auto-syndicate) | Auto-syndicate | publish |
| [dismiss_accuracy_issue](#dismiss-accuracy-issue) | Dismiss an accuracy issue | write |
| [restore_accuracy_issue](#restore-accuracy-issue) | Bring back an accuracy issue | write |
| [mark_alert_read](#mark-alert-read) | Mark an alert read | write |
| [mark_all_alerts_read](#mark-all-alerts-read) | Mark every alert read | write |
| [set_alert_preference](#set-alert-preference) | Set an alert preference | write |
| [derive_voice](#derive-voice) | Derive the brand's voice from posts | write |
| [save_voice](#save-voice) | Save the voice guide | write |
| [clear_voice](#clear-voice) | Remove the voice guide | write |
| [preview_voice](#preview-voice) | Preview a paragraph in a voice | write |
| [set_cover_style](#set-cover-style) | Set the page cover style | write |
| [remove_learned_rule](#remove-learned-rule) | Remove a learned style rule | write |
| [save_byline](#save-byline) | Save the author line | write |
| [set_blog_brief](#set-blog-brief) | Describe the brand's blog | write |
| [report_links](#report-links) | Client report links | read |
| [report_branding](#report-branding) | Client report branding | read |
| [create_report_link](#create-report-link) | Create a client report link | publish |
| [reveal_report_link](#reveal-report-link) | Show a client report link's address | publish |
| [revoke_report_link](#revoke-report-link) | Revoke a client report link | write |
| [save_check_schedule](#save-check-schedule) | Set the check schedule | write |
| [save_question_split](#save-question-split) | Split questions across brands | write |
| [set_watch_daily](#set-watch-daily) | Watch a question daily | write |
| [set_tracking_setup](#set-tracking-setup) | Set the tracking setup | write |
| [set_claude_picks](#set-claude-picks) | Choose the Claude questions | write |
| [set_daily_preset](#set-daily-preset) | Set who picks the daily questions | write |
| [set_daily_slot_split](#set-daily-slot-split) | Daily questions per brand | write |
| [save_local_settings](#save-local-settings) | Local settings | write |
| [toggle_local_checklist](#toggle-local-checklist) | Tick a local checklist item | write |
| [save_local_listing](#save-local-listing) | Correct a Google listing | write |
| [refresh_local](#refresh-local) | Refresh local reviews now | write |
| [run_technical_crawl](#run-technical-crawl) | Run the technical crawl now | write |
| [rerun_readiness](#rerun-readiness) | Re-run the readiness checks | write |
| [refresh_domain_rating](#refresh-domain-rating) | Refresh Domain Rating | write |
| [generate_quick_win](#generate-quick-win) | Write a quick win | write |
| [create_fix_from_faq](#create-fix-from-faq) | Start a fix from the FAQ quick win | write |
| [enrich_source](#enrich-source) | Read a cited page | write |
| [save_entity_item](#save-entity-item) | Tick an entity checklist item | write |
| [email_brief_now](#email-brief-now) | Email a Monday brief now | write |
| [unmark_directory](#unmark-directory) | Clear a directory mark | write |
| [get_approval_status](#get-approval-status) | Check an approval request | read |
| [create_piece](#create-piece) | Create a piece | write |
| [mark_posted](#mark-posted) | Mark a piece posted | write |

## Read tools

Read data. They never change anything.

### list_brands

**List brands.** List the brands tracked in this Prefera workspace, with the id, domain, engines and latest run of each. Start here when the workspace has several brands: the other tools take a brand id or domain.

Class: **read**. Areas: Reports and data.

Inputs:

No inputs.

### losing_questions

**Losing questions.** The buyer questions where AI answers do not name the brand (lost) or name it inconsistently (mixed), from the latest finished run. Lost questions come first, then by buying intent. Each item has the engines that do name the brand, the competitors named instead, and the page that wins the answer. Use it to decide what to write or fix next.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many questions to return. Default 20.

### question_detail

**Question detail.** Everything for one tracked question in the latest run: the outcome, every engine answer (text, whether the brand and which competitors were named), the sources each engine cited, the winning page, and a plain explanation of why the brand wins or loses with next steps. Get question_id from losing_questions.

Class: **read**. Areas: Reports and data.

Inputs:

- `question_id` (string, required). Question id from losing_questions.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### top_sources

**Top sources.** The domains AI engines cite most in the latest run, with how many answers and questions cite them, how many questions each one wins, whether it is the brand, a tracked competitor or a third party, and its most cited pages. Third-party sources that win questions are where outreach or a better page can change the answer.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many domains. Default 15.

### proof_results

**Proof results.** Published fixes and what they did: for each fix the targeted questions against untouched control questions, before and after, and the verdict (flipped, within noise, lost ground, insufficient data). Use it to learn which kinds of changes actually move AI answers for this brand.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### facts

**Approved facts.** The facts the team approved about the brand (pricing, features, limits, claims), each with its source page. Use only these when writing content for the brand: they are the statements Prefera allows drafts to make. Never invent claims beyond them.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### pitch_list

**Who to pitch.** Third-party pages AI engines cite for this brand's questions, ranked by how worth pitching they are, with the author and public contact routes read from each page.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many pages to return. Default 20.

### list_fixes

**List fixes.** Everything Prefera has created for this brand (articles, page edits, social posts, outreach, replies, review drives, press, syndication), newest first, with kind, group, status, topic, target address, posted link and result. Filter by status (draft, ready, published, rechecking, done, abandoned, live for any posted or published one, or drafting for the ones Prefera is still writing in the background), kind, group (site, social, mentioned, republish) and search (title or topic). A status of drafting means the draft is not written yet (call get_fix again in about a minute; it is ready when status is draft); draft_failed means it was not written and its credits went back; redrafting means a fresh draft (regenerate_draft) is being written over the existing one, and redraft_error that it was not written (the previous text is unchanged). Use get_fix with a fix_number to get the draft and the instruction to apply it.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `status` (string). Only fixes in this status (live = published, rechecking or done; drafting = still being written by Prefera). One of: `draft`, `ready`, `published`, `rechecking`, `done`, `abandoned`, `live`, `drafting`.
- `kind` (string). Only this kind (new_page, linkedin_post, x_thread, ...).
- `group` (string). Only this group: site pages, social posts, get mentioned, republish. One of: `site`, `social`, `mentioned`, `republish`.
- `search` (string). Words in the title or the topic.
- `limit` (integer). How many fixes. Default 30.

### get_fix

**Get a fix.** One fix in full: the questions it targets, the target address, the drafted content (Markdown, plus the original text for page edits), the approved facts it may use with their sources, and agent_prompt: a self-contained instruction you can follow to apply it (the exact change, hard rules, how to verify). For on-site fixes (new page, page edit) apply it to the site's code; for off-site fixes (outreach, Reddit reply, review drive) only polish the text: the user sends or posts it. Off-site pieces also carry text, ready to use (an X thread as posts). While Prefera is still writing the draft in the background (after create_piece or start_fix with writer prefera, or regenerate_draft), status is drafting and there is no draft yet: call get_fix again in about a minute; the draft is ready when status is draft (a fresh draft from regenerate_draft: when status is no longer drafting; redrafting and previous_version say which). redraft_error means the last fresh draft was not written and the text shown is the previous one, unchanged. Status draft_failed means it was not written and its credits went back (draft_error says why; try regenerate_draft).

Class: **read**. Areas: Reports and data.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### get_question_actions

**Question actions.** The analyst's ranked actions for one tracked question in the latest run (edit a page, write a page, pitch an author, reply in a thread, run a review drive), each with the target, what to change, and agent_prompt: a self-contained instruction for doing it. Get question_id from losing_questions.

Class: **read**. Areas: Reports and data.

Inputs:

- `question_id` (string, required). Question id from losing_questions.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### get_moves

**All moves.** Everything worth doing next, ranked on one scale: Search opportunities, AI-answer gaps, wrong facts, site checks, link gaps, directories and winnable keywords. Each move has why it is listed, numbers with links into the app, a cautious note on what it may do, and start_fix.move_id when it can become a fix (pass that id to start_fix). Filter by type.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `type` (string). Only moves of this kind. Default all. One of: `all`, `google`, `ai`, `facts`, `authority`, `site`.
- `limit` (integer). How many moves. Default 10.

### search_opportunities

**Search opportunities.** Pages Google already shows but that win fewer clicks than they could (almost ranking, few clicks, long questions, losing clicks, cannibalisation), from Search Console. state ready = a change can start now; resting = a change went live in the last 90 days, so the page is left alone until unlocks_on; in_progress = a change is already open (open_fix). Needs Search Console connected in the app.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `state` (string). Only opportunities in this state. One of: `ready`, `resting`, `in_progress`.
- `limit` (integer). How many rows. Default 15.

### rankings

**Your searches and movers.** How the site does on Google over the last 28 days: how many searches it appears for, how many moved up, down or are new, and the biggest movers in each direction (position, places gained, clicks, the page, and whether it is part of an opportunity). Needs Search Console connected.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many movers in each direction. Default 5.

### tracked_keywords

**Tracked keywords.** The keywords tracked on Google for this brand: best position within the top 30, places gained since the last check, the ranking page and the best competitor result. Also the plan's keyword limit and how many are used.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many keywords. Default 25.

### keyword_gap

**Keyword gap.** Searches a tracked competitor ranks for in the top 20 where the brand has no result, with searches a month, difficulty, which competitors rank, and winnable (difficulty at most the brand's authority plus 15; a rule of thumb, not a promise). Winnable ones come first. Read monthly.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `only_winnable` (boolean). Only keywords marked winnable.
- `limit` (integer). How many keywords. Default 20.

### authority

**Authority and links.** Domain Rating for the brand and its tracked competitors (always shown with the credit "Domain Rating by Ahrefs (https://ahrefs.com/)"; without an Ahrefs reading it is our own 0-100 Authority score and no credit), new and lost links this week, the link gap (sites that link to competitors but not to you, with the page, its type and a reason to ask), how many sites the quality screen hid (hidden_count), and pages that name the brand without a link. Link-gap "strength" is not Domain Rating. When you show a Domain Rating to the user, show the credit with it.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many rows in each list. Default 10.

### directories

**Directories to list on.** The plan of directories worth listing the brand on, in order: what each one costs, how it is reviewed, what kind of link it gives, which competitors are already listed, and where yours stands (todo, submitted, listed). You submit on the directory's own site; then call mark_directory.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `state` (string). Only directories in this state. One of: `todo`, `submitted`, `listed`.
- `limit` (integer). How many directories. Default 25.

### get_results

**Results.** What the published fixes did (targeted vs untouched control questions, before and after, and the verdict: flipped, within noise, lost ground, insufficient data) and the links that appeared after something you did for that site first (link_wins: outreach, link requests, directory listings). Each fix also carries traffic: what its page brought after go-live (visits from Google and from AI assistants, conversions, revenue) against the same number of days before and against similar pages, from the customer's own analytics (it describes, it never claims cause), plus traffic_last_28_days for the whole brand. Use it for the weekly report.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `limit` (integer). How many fixes and link wins. Default 15.

### autopilot_plan

**This week's plan.** The weekly routine for your own agent: the top moves the rules allow right now (best first, each with a reason and the start_fix call to make), what the plan's limits leave room for, the moves to do by hand, and weekly_prompt: a ready-made instruction to schedule in your agent (each Monday: autopilot_plan, start_fix writer=agent for each item, apply, mark_fix_published, report). Starts nothing.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `max` (integer). The most fixes to plan. Default 3.
- `include_offsite` (boolean). Also plan outreach, replies and review requests (the agent writes them; the user sends them). Default false.

### flagged_claims

**Flagged claims.** The sentences of a fix's latest draft that state something no approved fact supports, with their exact start, end and text. Use them with accept_flagged_claim (keep on purpose) or remove_flagged_claim. A draft with none left is ready to publish.

Class: **read**. Areas: Reports and data.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### publish_preview

**Preview as published.** The saved draft of an on-site fix rendered as the connected site will show it (an HTML document, the same as Preview in the app). Read-only.

Class: **read**. Areas: Reports and data.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### fix_batch

**Batch of drafts.** The newest batch of drafts (or batch_id), as the app's review queue: each fix with its state (drafting, failed, review, approve, ready, live), the questions and the counts. Use its batch_id with publish_ready_drafts.

Class: **read**. Areas: Reports and data.

Inputs:

- `batch_id` (string). A batch id; default the newest.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### content_plan

**Content plan.** The content calendar: the settings (days, pieces a week, auto-draft, auto-publish, mix, time), the month's content credit allowance, and every piece in the month shown (day, time, question, type, stage, its fix, and which actions it allows). Pass month (YYYY-MM) to see another month. Before the plan is started, preview shows the first 30 days it would hold.

Class: **read**. Areas: Reports and data.

Inputs:

- `month` (string). YYYY-MM. Default: the rolling window from today.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### run_status

**Runs: status and history.** With run_id: one run's progress (status, answers asked of the total, engines, stopped or failed and why). Without: the brand's latest runs, newest first, and what Run now would ask (answers, questions, engines) against this month's answers left.

Class: **read**. Areas: Reports and data.

Inputs:

- `run_id` (string). A run id (from run_now or this list).
- `limit` (integer). How many runs. Default 10.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### outreach_board

**Outreach board.** Every site worth asking for a link, by stage (found, contacted, replied, negotiating, link live, not interested): the page, why it is listed, the contact, the next step, the follow-up state, whether an email is ready to send or queued, and the outreach fix with its email. Also whether a mailbox is connected and today's sends.

Class: **read**. Areas: Reports and data.

Inputs:

- `stage` (string). Only this stage. One of: `found`, `contacted`, `replied`, `negotiating`, `link_live`, `not_interested`.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### question_answers

**Answers for a question.** The full answers the engines gave to one tracked question: for every engine and sample the text, whether your brand was named, which competitors were named and the cited sources, plus the verdict and the diagnosis. Defaults to the latest finished run; pass run for an older one and engine to see one engine only.

Class: **read**. Areas: Reports and data.

Inputs:

- `question_id` (string, required). Question id from all_questions or losing_questions.
- `run` (string). A finished run id, or "latest" (default).
- `engine` (string). Only this engine, for example chatgpt.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### all_questions

**All questions.** Every question this brand tracks, as the Questions screen lists them: status (Won, Contested, Winnable, Dead, New, Paused), buyer stage, intent, source, country, which engines named you, and the plan's question budget. Filter by status, stage, country, source or text; page with cursor. Set include_suggestions to also get the suggested questions waiting to be added.

Class: **read**. Areas: Reports and data.

Inputs:

- `status` (string). active, won, contested, winnable, dead, new or paused.
- `stage` (string). Buyer stage.
- `country` (string). Two-letter market code, for example US.
- `source` (string). Where the question came from, for example user.
- `search` (string). Only questions containing this text.
- `include_suggestions` (boolean).
- `limit` (integer). How many. Default 50, at most 200.
- `cursor` (string). next_cursor from the previous page.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### competitors

**Competitors comparison.** The Competitors screen: you and each tracked competitor side by side (questions won, share of answers that recommend them, change since the last run, their strongest pages and the questions they hold), with an authority score (DataForSEO rank, not Domain Rating) when stored, the plan's competitor limit and recent moves.

Class: **read**. Areas: Reports and data.

Inputs:

- `country` (string). Two-letter market code for a non-primary market.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### accuracy

**Accuracy items.** Accuracy Watch: what the engines say about the brand that disagrees with the approved facts (and what is confirmed), with the fix offered for each. Reading only; use the facts tools to correct a fact.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### traffic

**Traffic.** Visits and revenue the connected analytics sees for the last 28 days against the 28 before: AI assistant visits (by assistant), Google visits, conversions, revenue and the top pages with the fixes that touched them. Says plainly when no analytics is connected.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### readiness

**Site readiness.** Site readiness results: the checks of the latest read of the site (what passes and what to fix), the technical crawl issues and speed, and the entity checks (organization details engines look for).

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### local

**Local.** The Local screen for a local business: reviews against competitors, the Google Business Profile checklist, competitor categories and the money pages. Says how to switch it on for other brands.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### alerts

**Alerts.** The workspace's alerts, newest first: competitor moves, re-check results, accuracy issues and run status. Filter by unread or kind.

Class: **read**. Areas: Reports and data.

Inputs:

- `filter` (string). Default all. One of: `all`, `unread`, `rival_move`, `recheck_result`, `accuracy`, `run_status`, `usage`, `sentiment`, `daily_move`.
- `limit` (integer). How many. Default 30, at most 100.

### monday_brief

**Monday brief.** The Monday brief for a brand: the latest by default, or a past week (week is the Monday date, from weeks in the reply).

Class: **read**. Areas: Reports and data.

Inputs:

- `week` (string). Monday date like 2026-11-02.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### brand_style

**Brand style.** How drafts sound and pages look, and what happens to a sentence with no approved fact at publish time (fact_check_policy: review or publish_anyway; set it with set_fact_check_policy): the learned voice guide, a sample paragraph written in it, the cover style, and blog_brief (what the brand says its blog should be; set it with set_blog_brief). What a page claims still comes only from approved facts.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### integrations_status

**Integrations status.** Which integrations are connected for this brand (Search Console, GA4, CMS, Slack, analytics) and whether each is healthy. Never returns keys, tokens or addresses; connecting and disconnecting happens in the app.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### get_tracking_setup

**Tracking setup.** How this brand's questions are checked (mode mix, daily, weekly or twice_weekly, the weekly answers per engine, the mix's daily count, engines), what the brand checks now and the answers that uses, its room (the questions its setup fits), the brand's share of the workspace's AI answers and question cap, the recommended setup, and how many questions each option allows. Change it with set_tracking_setup.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### get_usage

**Usage and content credits.** This billing month's AI answers used and allowed (the allowance includes the Claude add-on's answers; claude_addon says which tier is on and its Claude answers a month, and on the chosen-questions tier the budget used and left), and the workspace's content credits: plan credits used and left, top-up credits left with their expiry, and when plan credits reset. Credits can't be bought through this connection: the reply links to Billing.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### get_claude_picks

**Claude questions.** The Claude add-on (Claude on the questions you choose): who picks (auto = Prefera, custom = you), the workspace's Claude answer budget a month and what the picks use, and every brand's tracked questions with their Claude mode (daily = 1 Claude answer a day; weekly1, weekly2, weekly3 = 1 to 3 answers on each weekly run; null = no Claude). Change it with set_claude_picks.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### export_data

**Export as CSV.** The app's CSV exports as text: answers (of the latest or a given run), questions or proof. At most 2000 rows are returned; the reply says truncated and gives the full download link when there are more.

Class: **read**. Areas: Reports and data.

Inputs:

- `kind` (string, required). One of: `answers`, `questions`, `proof`.
- `run` (string). Finished run id (answers only).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### deep_audit

**Deep Audit report.** The Deep Audit bought for this brand. Without audit_id it lists the audits; with audit_id it returns that report (where you lose, the pages AI cites instead, what to fix first). Says not_purchased when none was bought.

Class: **read**. Areas: Reports and data.

Inputs:

- `audit_id` (string). Audit id from the list.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### answer_page_handoff

**Answer Page text and coding-agent prompt.** Answer Pages: the page text (Markdown) of a drafted page of the plan, the cover image details, and, when a coding agent is set up, the prompt to apply it. Read-only.

Class: **read**. Areas: Reports and data.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### report_links

**Client report links.** The brand's active client report links: id, last six characters, when created and last viewed, and whether the address can be shown again. Never returns the addresses; use reveal_report_link for one.

Class: **read**. Areas: Reports and data.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### report_branding

**Client report branding.** The white-label branding of the workspace's client reports (agency name, logo address, strategist, accent colour) when the plan includes it.

Class: **read**. Areas: Reports and data.

Inputs:

No inputs.

### get_approval_status

**Check an approval request.** When this connection has "ask me in Prefera first", a publish-class call returns status pending_approval and an approval_id instead of running. Pass that id here to see whether a person approved it (it then ran once, as them, and the result is included), denied it, or let it expire (72 hours). Poll every few minutes, not in a loop.

Class: **read**. Areas: Reports and data.

Inputs:

- `approval_id` (string, required). The approval_id from a pending_approval result.
- `brand` (string). Optional. With several workspaces, the brand the request was for.

## Write tools

Change data in Prefera (drafts, questions, settings). Nothing goes live.

### mark_fix_published

**Mark a fix published.** Record that a fix is now live (on-site: after you deployed it, pass the live url) or was posted or sent (off-site; url optional). Does exactly what Publish or Mark as done does in the app: freezes the targeted questions and starts Prefera's re-check, so Proof can show whether it worked. Needs an API key created by an owner or editor. Only call it after the change is actually live; the user's own posting or sending is theirs to confirm.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `url` (string). The live address of the page. Required for page edits and new pages.
- `note` (string). Optional note recorded with the fix (for example the commit or deploy it shipped in).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### mark_directory

**Mark a directory.** Record that the brand's listing was submitted to a directory or is now live (optionally with the listing address). Same as the buttons in the app; it submits nothing itself. Only call it after the listing was really sent or is live. Needs a key made by an owner or editor.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `slug` (string, required). Directory slug from directories.
- `status` (string, required). submitted = sent for review; listed = live. One of: `submitted`, `listed`.
- `listing_url` (string). The address of the live listing (https://...). Optional.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### start_fix

**Start a fix.** Create a fix from a move (move_id from get_moves or autopilot_plan), a Search opportunity (opportunity_id) or a losing question (question_id). writer "agent" (default): your own model writes the change, so Prefera makes no model call; the fix is labelled "Written by your agent" and the reply carries agent_prompt (the full instruction): apply it, then call mark_fix_published. writer "prefera": Prefera drafts it like the app does, in the background: the reply comes back at once with fix_number and status drafting; call get_fix with fix_number in about a minute, the draft is ready when status is draft. Both count toward the plan's fix limits and pace; pages in their 90-day rest and pages with an open change are refused. Needs a key made by an owner or editor.

Class: **write**. Areas: Writing articles.

Inputs:

- `move_id` (string). Move id from get_moves or autopilot_plan (items with start_fix).
- `opportunity_id` (string). Opportunity id from search_opportunities.
- `question_id` (string). Question id from losing_questions.
- `writer` (string). Who writes the change. "agent" = you (no Prefera model spend), "prefera" = Prefera drafts it. Default agent. One of: `agent`, `prefera`.
- `kind` (string). With question_id only: what kind of fix. Default is chosen from the question. One of: `new_page`, `page_edit`, `reddit_reply`, `outreach`, `review_drive`.
- `url` (string). With question_id and kind page_edit: the address of the page to edit.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### run_check

**Re-check questions.** Ask Prefera to re-check chosen questions (question_ids, up to 10) or a live fix's questions (fix_number), or read the progress of a run you started (run_id). Within the plan: one active run per brand, the month's answer allowance and an hourly limit apply. Prefera already schedules a fix's own re-checks after mark_fix_published, so use this sparingly. Starting needs a key made by an owner or editor.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `fix_number` (integer). Re-check the questions of this live fix.
- `question_ids` (array of string). Question ids from losing_questions.
- `run_id` (string). A run id returned earlier: returns its status and progress instead of starting anything.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### save_draft_text

**Save draft text.** Replace a draft's Markdown (and optionally its title), as typing in Fix Studio does. The claim check runs on the new text; the result lists any sentences still flagged. Live, done or abandoned fixes are frozen.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `body_md` (string, required). The whole draft in Markdown.
- `title` (string).

### regenerate_draft

**Write a fresh draft.** Have Prefera write a new draft from the approved facts, as a new version (the old text stays in the version history; restore_draft_version brings it back). It is written in the background (a long article takes a minute or two): the reply comes back at once with fix_number, status "drafting", previous_version and next_step. Call get_fix with fix_number in about a minute; it is ready when status is no longer "drafting" and the draft version is above previous_version. redraft_error on get_fix means it was not written: the previous text is unchanged and any credits taken for it went back. Spends model tokens: counts toward the draft limit, and each fix can be redrafted only a few times (a failed attempt is not counted).

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### restore_draft_version

**Restore a version.** Bring back an earlier version of a draft as a new version (nothing is lost).

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `version` (integer, required). The version number to restore.

### accept_flagged_claim

**Keep a flagged sentence.** Keep one flagged sentence on purpose (recorded against the person who connected this key or app). Sentences that talk about missing facts can't be kept.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `start` (integer, required). start of the flagged sentence, from flagged_claims.
- `end` (integer, required). end of the flagged sentence, from flagged_claims.
- `text` (string, required). The flagged sentence exactly, from flagged_claims.

### remove_flagged_claim

**Remove a flagged sentence.** Delete one flagged sentence from the draft (saved as a new version).

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `start` (integer, required). start of the flagged sentence, from flagged_claims.
- `end` (integer, required). end of the flagged sentence, from flagged_claims.
- `text` (string, required). The flagged sentence exactly, from flagged_claims.

### update_fix_details

**Update fix details.** Change a fix's title, target address, Reddit thread title or post, the author or publication of an outreach fix, the contact, or the email subject. Frozen once the fix is live.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `title` (string).
- `target_url` (string or null). The page address; null clears it.
- `thread_title` (string).
- `thread_post` (string).
- `author_name` (string).
- `publication` (string).
- `page_title` (string).
- `contact` (string).
- `subject` (string).

### set_fix_destination

**Choose where an article is published.** Pick which connected site or Prefera-hosted blog this fix publishes to, when the brand has more than one (get_fix lists them as destinations). Only before the draft has been sent: once it is in a destination, unpublish it there first.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `destination_id` (string, required). The id of one of get_fix's destinations.

### set_fix_destinations

**Choose several sites for an article.** Publish one article to more than one connected site. destination_ids are ids from get_fix's destinations; the first is the original unless primary_id says otherwise. Copies go live only after the original is live and carry its address as the canonical link where the site has such a field. Publishing the same article on more than one of your sites splits the credit between the copies: Google and AI engines pick one copy to show, and it may not be the one you want. The first site is the original; the others point to it (canonical link) where that site allows it. Replaces the earlier choice; keeps any schedule already set. A site the article is already in can't be dropped.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `destination_ids` (array of string, required). Ids from get_fix's destinations.
- `primary_id` (string). Which one is the original (default: the first).

### cancel_fix_schedule

**Cancel a scheduled publish.** Cancel the scheduled time of one destination (destination_id) or all of the article's destinations. Nothing is published.

Class: **write**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `destination_id` (string). Leave out to cancel every schedule of this fix.

### set_autopilot_destinations

**Choose where Autopilot publishes.** The connected sites Autopilot (Answer Pages and the content plan) publishes each page to; empty goes back to the single default site. Publishing the same article on more than one of your sites splits the credit between the copies: Google and AI engines pick one copy to show, and it may not be the one you want. The first site is the original; the others point to it (canonical link) where that site allows it. While Autopilot is on this needs the publish permission.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `destination_ids` (array of string, required).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### abandon_fix

**Abandon a fix.** Drop a fix. It stays in the list; a live one stops being measured.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### stop_tracking_fix

**Stop tracking.** Close a live fix without touching the page (edited by hand, connection removed, page already taken down).

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### start_fix_batch

**Draft fixes for all winnable questions.** Create one fix per winnable losing question group, drafted by Prefera in the background, within the month's allowance. Spends model tokens. Returns the batch; follow it with fix_batch.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### approve_batch_fix

**Approve a batch draft.** Re-run the claim check and mark a batch draft ready when nothing unsupported is left. Never publishes.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### find_inbound_links

**Find pages that should link here.** The closest pages of the brand's own site that should link to this fix's page, with the anchor and the sentence to change. Reads up to 8 pages (vendor credits).

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### start_content_plan

**Start or refresh the plan.** mode "start" starts the plan ("Use this plan"); "refresh" plans again (3 a day per brand). Pieces not drafted yet are re-planned; moved, drafted and skipped ones stay. May fetch fresh search data (vendor credits).

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `mode` (string, required). One of: `start`, `refresh`.
- `mix` (string). The mix to keep when starting. One of: `guides`, `balanced`, `comparisons`.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### move_plan_item

**Move a piece.** Move a piece to another day (today up to three months ahead), optionally at a time of day. The move is kept when the plan refreshes.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `day` (string, required). YYYY-MM-DD.
- `time` (string). HH:MM in the workspace time zone.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### swap_plan_days

**Swap two pieces.** Swap the days of two pieces that are not live yet; both then stay on those days when the plan refreshes.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `a` (string, required). The piece id from content_plan (items[].id).
- `b` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### skip_plan_item

**Skip a piece.** Take a piece off the plan (it moves to Skipped; restore_plan_item brings it back).

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### restore_plan_item

**Restore a piece.** Put a skipped piece back on the content plan: on its own day, or tomorrow when that day has passed.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### replace_plan_item

**Swap in another topic.** Replace a piece that is not drafted yet with the next best topic of the same kind (the old one goes to Skipped).

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### draft_plan_item

**Draft a piece now.** Have Prefera write this piece's draft now (in the background; it waits for approval). Costs content credits (4 for an answer_first article, 6 for long_form, 1 per AI image) and counts toward the draft limit; spends model tokens. For a new page, format (answer_first or long_form) and images (0 to 10 AI images inside) choose its length before it is written.

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `format` (string). One of: `answer_first`, `long_form`.
- `images` (integer).

### save_content_plan_settings

**Content plan settings.** Change the plan's days, pieces a week, auto-draft (drafts written ahead, waiting for approval), how many days ahead, the mix, the time of day, and what Autopilot writes (its format and the images inside each article), and Social autopilot: which social drafts (LinkedIn post, X thread, short video script) are made from each article when it goes live; each counts toward the month's fixes and is never posted by Prefera. Only what you pass changes. Auto-publish is set with set_content_plan_autopilot.

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `days` (array of integer). Weekdays, 1 = Monday ... 7 = Sunday.
- `per_week` (integer).
- `auto_draft` (boolean).
- `draft_ahead` (integer).
- `mix` (string). One of: `guides`, `balanced`, `comparisons`.
- `publish_time` (string). HH:MM in the workspace time zone.
- `autopilot_format` (string). What automatic drafting writes: answer_first, long_form, or mix (long-form for comparison, best-for, how-to and guide pages, answer-first otherwise). Shared with Answer Pages Autopilot. One of: `answer_first`, `long_form`, `mix`.
- `images_per_article` (integer). AI images inside each automatically written article (0 to 10), each costs 1 content credit from the workspace's pool (shared by all brands).
- `draft_linkedin_post` (boolean). Social autopilot: when an article goes live, also draft a LinkedIn post from it (a draft only; the person posts it). Default off.
- `draft_x_thread` (boolean). Social autopilot: when an article goes live, also draft an X thread from it. Default off.
- `draft_video_script` (boolean). Social autopilot: when an article goes live, also draft a short video script from it. Default off.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### run_now

**Run a check now.** Start a full check of the brand's tracked questions now, as Run now in the app. Spends answers from the month's allowance: call run_status first to see how many it would use. Refused without a plan, next to a run already going, or past the month's answers.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### stop_run

**Stop the run.** Stop the brand's waiting or running check: nothing more is asked; answers already collected are kept and shown as a partial run. A run that had not started is not counted.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### set_prospect_stage

**Move a prospect.** Move a prospect to another stage, as dragging it on the board.

Class: **write**. Areas: Sending outreach email.

Inputs:

- `prospect_id` (string, required). The prospect id from outreach_board.
- `stage` (string, required). One of: `found`, `contacted`, `replied`, `negotiating`, `link_live`, `not_interested`.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### find_contact

**Find who to write to.** Read the prospect's page and up to two contact pages of their site for a byline, an address or a contact page. Uses page reads (vendor credits). Check where an address came from before sending.

Class: **write**. Areas: Sending outreach email, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `prospect_id` (string, required). The prospect id from outreach_board.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### draft_follow_up

**Write a follow-up.** Have Prefera write the follow-up email for a contacted prospect (it waits for approval). Spends model tokens.

Class: **write**. Areas: Sending outreach email, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `prospect_id` (string, required). The prospect id from outreach_board.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### save_follow_up

**Save a follow-up.** Save your own text as the follow-up email for a prospect (it waits for approval).

Class: **write**. Areas: Sending outreach email.

Inputs:

- `prospect_id` (string, required). The prospect id from outreach_board.
- `text` (string, required).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### cancel_queued_email

**Cancel a queued email.** Cancel an approved email that has not gone out yet. Nothing is sent.

Class: **write**. Areas: Sending outreach email.

Inputs:

- `prospect_id` (string, required). The prospect id from outreach_board.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### add_questions

**Add questions.** Add one or many buyer questions to track (up to 50). The same checks as the app: junk, duplicates and off-topic lines are skipped and reported, a warning is added only with allow_warnings, and only what fits the plan's question limit is added. Asked on every engine from the next run.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `questions` (array of string, required). The question texts, as a buyer would ask them.
- `stage` (string). Buyer stage for all of them. Omit to let Prefera pick from the wording. One of: `discovery`, `comparison`, `decision`, `how_to`.
- `country` (string). Two-letter country code to ask them in. Omit for the brand's main market.
- `allow_warnings` (boolean). Add lines that only drew a warning (the app's Add anyway).

### discover_questions

**Discover questions.** Suggest new buyer questions from real searches (Search Console, demand data, People Also Ask) and refresh demand. Suggestions are not tracked until promoted. Spends Prefera's search budget: limited per brand per hour and per connection.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### archive_question

**Archive a question.** Stop tracking a question. It keeps its history and frees a slot. Get question_id from all_questions.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### restore_question

**Restore a question.** Bring an archived question back to tracking, within the plan's question limit.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_question_country

**Set a question's country.** Move one or more questions (up to 200) to another country, or back to the main market with country null. Takes effect from the next run.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_ids` (array of string, required).
- `country` (string or null, required). Two-letter country code, or null for the main market.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_question_stage

**Set a question's buyer stage.** Change the buyer stage of one question (discovery, comparison, decision, how_to).

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `stage` (string, required). One of: `discovery`, `comparison`, `decision`, `how_to`.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### promote_suggestion

**Promote a suggested question.** Start tracking a suggested question, within the plan's question limit.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### dismiss_suggestion

**Dismiss a suggested question.** Remove a suggestion for good: Discover never offers it again. Only suggestions; tracked questions are archived instead.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### unpin_question

**Unpin a question.** Let buying intent decide again whether a question is checked (undo a pin).

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### add_competitor

**Add a competitor.** Track a competitor by name and website, within the plan's competitor limit. Its numbers are counted from answers you already have. aliases are other names an answer may use for it (up to 8).

Class: **write**. Areas: Questions and tracking.

Inputs:

- `name` (string, required).
- `domain` (string). Its website, for example example.com. Leave empty to track by name only.
- `aliases` (array of string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### remove_competitor

**Remove a competitor.** Stop tracking a competitor. Get competitor_id from competitors.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `competitor_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_competitor_aliases

**Set a competitor's aliases.** Replace the other names an answer may use for a competitor (up to 8). Mention detection updates from the next run.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `competitor_id` (string, required).
- `aliases` (array of string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### find_competitor_domain

**Find a competitor's website.** Look up the website of a competitor the answers name without one (cited pages first, then a quick lookup). Returns a domain to pass to add_competitor; nothing is saved. Limited per brand per hour and per connection.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `name` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### add_fact

**Add a fact.** Add a fact about the brand that drafts may use (it is approved on adding, as in the app). group is the fact's section, for example Pricing, Product, Company. A source_url is optional.

Class: **write**. Areas: Writing articles.

Inputs:

- `group` (string, required).
- `statement` (string, required).
- `source_url` (string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### update_fact

**Update a fact.** Change a fact's wording and its source link. The statement is required; leave source_url out to clear the link.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required). Fact id from facts.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `statement` (string).
- `source_url` (string).

### approve_fact

**Approve a fact.** Approve a pending fact so drafts can use it. On a held fact's corrected wording (see accuracy) this approves the new wording and retires the old fact.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required). Fact id from facts.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### confirm_fact

**Confirm a fact is still true.** Mark a fact as still true after a re-check flagged it, so drafts can use it again. Get id from facts.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required). Fact id from facts.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### retire_fact

**Retire a fact.** Retire a fact so drafts stop using it. It stays in the list and can be brought back with restore_fact.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required). Fact id from facts.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### restore_fact

**Restore a fact.** Bring a retired fact back so drafts can use it again. Get id from facts.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required). Fact id from facts.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### reverify_facts

**Re-check facts against their sources.** Re-read the source page of each sourced fact and flag the ones that changed or went away. Spends Prefera's model and page-reading budget: limited per brand per hour and per connection.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### track_keywords

**Track keywords.** Track search keywords for rankings (up to 100 at a time), within the plan's tracked-keyword limit shared across the workspace. Duplicates are skipped. The first check starts right away.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `keywords` (array of string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### remove_keyword

**Stop tracking a keyword.** Stop tracking a keyword and drop its rank history. Get id from tracked_keywords.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### add_keyword_to_plan

**Add a keyword to the content plan.** Turn a keyword into a pinned new-page piece on the next free day of the content plan (within the plan's monthly pieces).

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `keyword` (string, required).
- `volume` (integer or null). Searches a month, when known.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### research_keywords

**Keyword research lookup.** Look up keyword ideas for a topic: a shared result from the last 30 days when there is one, else one paid request. Counts against the plan's monthly lookups. Returns ideas and topic clusters (cluster_id feeds add_cluster_to_plan). Limited per brand per hour and per connection.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `seed` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### add_cluster_to_plan

**Add a keyword cluster to the content plan.** Add a topic cluster from research_keywords to the content plan: the pillar first, then its supporting articles, at the plan's own pace. Reads the shared result; no lookup is spent.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `seed` (string, required).
- `cluster_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### plan_answer_pages_month

**Plan this month's Answer Pages.** Pick this month's pages from the questions the brand loses (the Plan this month button). Limited per workspace per hour and capped by the plan's pages a month. Needs Answer Pages on the plan.

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### approve_answer_pages_plan

**Approve the plan and start drafting.** Approve the month's plan so Prefera drafts every page (spends model budget; limited per workspace per hour).

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_answer_page_day

**Set an Answer Page's publish day.** Answer Pages: pick the day (YYYY-MM-DD) one page of the month's plan publishes, or leave day out to clear it. (Content plan pieces move with move_plan_item.)

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `day` (string or null).

### skip_answer_page

**Skip or restore an Answer Page.** Answer Pages: take a page out of the month's plan (skipped true; the question stays on the list) or put it back (skipped false). (Content plan pieces use skip_plan_item and restore_plan_item.)

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `skipped` (boolean, required).

### set_answer_page_format

**Set an Answer Page's format.** Answer Pages: choose how long a planned page is and how many AI images go inside it. format is one of: answer_first, long_form (answer-first about 1,100 to 1,600 words, long-form about 1,800 to 2,800); images is 0 to 10. Applies when the page is next written; the reply says it in one line.

Class: **write**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `format` (string). One of: `answer_first`, `long_form`.
- `images` (integer or null). AI images inside the page (0 to 10); null goes back to the brand default.

### retry_answer_page

**Try a failed Answer Page again.** Answer Pages: queue the draft of a page whose draft failed (spends model budget; limited per workspace per hour).

Class: **write**. Areas: Content plan and autopilot, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### mark_answer_page_published

**Mark an Answer Page as published by hand.** Answer Pages: record that a page is live at an address you published it to yourself. Only call it after the page is really live.

Class: **write**. Areas: Publishing to sites.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
- `url` (string, required).

### remove_page_image

**Remove a page image.** Remove one image of a page draft. key is the image's place (for example photo-1, cover).

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the page draft.
- `key` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### regenerate_page_image

**Make a new AI image for a page.** A new AI image for one place of a page draft. Costs 1 content credit from the workspace's pool (shared by all its brands), plus the spend guard, 20 an hour per brand and per connection. When no credits are left it is refused; upload your own instead.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the page draft.
- `key` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### add_page_image

**Add an image to a page.** Add an image inside a page draft, after one of its prose sections (not the first or last; get_fix lists images.addable_sections). mode "generate" makes an AI image from description (or from the section) and costs 1 content credit from the workspace's pool (shared by all its brands), plus the spend guard, 20 an hour per brand and per connection. mode "upload" takes image_base64 (JPEG, PNG or WebP, up to 5 MB, at least 600px wide) and spends nothing. At most 10 images inside a page. Remove one with remove_page_image.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the page draft.
- `section` (string, required). The heading of the section the image goes after.
- `mode` (string, required). One of: `generate`, `upload`.
- `description` (string). generate: what the image should show (optional).
- `image_base64` (string). upload: the image bytes, base64.
- `mime` (string). upload: the image's type. One of: `image/jpeg`, `image/png`, `image/webp`.
- `alt` (string). upload: the alt text (optional).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_name_competitors

**Name competitors on comparison pages.** On: comparison and alternatives pages written from now on name each competitor, briefly, from its own site. Off: they describe the options without naming a company.

Class: **write**. Areas: Writing articles.

Inputs:

- `on` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_page_photos

**AI images in long-form pages.** Turn AI images in long-form answer pages on or off for the brand (every paid plan). Pages already written keep theirs.

Class: **write**. Areas: Writing articles.

Inputs:

- `on` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### mark_medium_posted

**Mark a page as posted on Medium.** Record that you posted the page on Medium yourself, with its address. Posts nothing.

Class: **write**. Areas: Publishing to sites.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the published page, from the content plan or the fix.
- `url` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_syndication_platforms

**Pick the platforms for a page.** Which platforms a page is syndicated to: devto, hashnode, medium, linkedin. Posts nothing.

Class: **write**. Areas: Publishing to sites.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the published page, from the content plan or the fix.
- `platforms` (array of string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### dismiss_accuracy_issue

**Dismiss an accuracy issue.** Dismiss an open accuracy issue (it comes back if the next run repeats it). Get id from accuracy. Needs Accuracy Watch on the plan.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `id` (string, required). Issue id from accuracy.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### restore_accuracy_issue

**Bring back an accuracy issue.** Bring a dismissed accuracy issue back to open. Get id from accuracy.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `id` (string, required). Issue id from accuracy.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### mark_alert_read

**Mark an alert read.** Mark one alert read so it stops counting as unread. Get id from alerts.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### mark_all_alerts_read

**Mark every alert read.** Mark every unread alert of the workspace read in one go, like the Mark all read button.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_alert_preference

**Set an alert preference.** Turn email or Slack delivery of one alert kind on or off for the person this connection acts for. kind is one of: competitor_move, recheck_result, accuracy, run_status, usage, sentiment, daily_move, agent_approval, social_ready, brief.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `kind` (string, required). One of: `competitor_move`, `recheck_result`, `accuracy`, `run_status`, `usage`, `sentiment`, `daily_move`, `agent_approval`, `social_ready`, `brief`.
- `channel` (string, required). One of: `email`, `slack`.
- `value` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### derive_voice

**Derive the brand's voice from posts.** Read 3 to 5 posts (pasted as texts, or by address as urls) and derive the brand's voice guide from them. Replaces the current guide. Spends model budget: limited per brand per hour (the app's limit) and 20 an hour per connection.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `texts` (array of string).
- `urls` (array of string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_voice

**Save the voice guide.** Save an edited voice guide (tone, sentences, person, formality, use, avoid, formatting, examples). An empty guide returns drafts to the house style.

Class: **write**. Areas: Writing articles.

Inputs:

- `guide` (object, required). tone, sentences, person, formality, formatting (strings); use, avoid, examples (arrays of strings).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### clear_voice

**Remove the voice guide.** Remove the brand's voice guide: new drafts go back to the house style. Pages already written are not changed.

Class: **write**. Areas: Writing articles.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### preview_voice

**Preview a paragraph in a voice.** The same paragraph rewritten in the given voice guide (unsaved edits included); claims stay the same. Spends model budget.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `paragraph` (string, required).
- `guide` (object, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_cover_style

**Set the page cover style.** How the brand's page covers look: editorial, illustrated, minimal, photo. Covers drawn from now on use it.

Class: **write**. Areas: Writing articles.

Inputs:

- `style` (string, required). One of: `editorial`, `illustrated`, `minimal`, `photo`.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### remove_learned_rule

**Remove a learned style rule.** Remove one rule Prefera learned from your edits; it is not learned again. Get key from brand_style.

Class: **write**. Areas: Writing articles.

Inputs:

- `key` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_byline

**Save the author line.** The author line (name and a short bio) added to articles and answer pages; an empty name removes it. Optional reviewer name and role.

Class: **write**. Areas: Writing articles.

Inputs:

- `name` (string, required).
- `bio` (string, required).
- `reviewer_name` (string).
- `reviewer_role` (string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_blog_brief

**Describe the brand's blog.** Say in words what the brand's blog should be: a description (up to 1,500 characters) and optional short fields (readers, focus, avoid, include, other; up to 300 each). Plans and drafts follow it under the usual fact and link rules. Empty everything to remove it. Read it with the brand style tool.

Class: **write**. Areas: Writing articles.

Inputs:

- `about` (string).
- `readers` (string).
- `focus` (string).
- `avoid` (string).
- `include` (string).
- `other` (string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### revoke_report_link

**Revoke a client report link.** Revoke one report link (id from report_links): the address stops working at once.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `link_id` (string, required). Report link id (a UUID) from report_links.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_check_schedule

**Set the check schedule.** The weekday(s) (days: 0 Sunday to 6 Saturday) and hour (0-23, in timezone) checks run on, within the plan's cadence. reset true goes back to the default schedule.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `days` (array of integer).
- `hour` (integer).
- `timezone` (string).
- `reset` (boolean).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_question_split

**Split questions across brands.** Owner only. How the workspace's question pool is shared by its brands: split maps every brand id to a whole number of questions, or null for an even share.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `split` (object or null, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_watch_daily

**Watch a question daily.** Watch one question daily (on true) or stop (on false). It takes effect at the next daily refresh, from the next day, if a daily slot is free.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `question_id` (string, required).
- `on` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_tracking_setup

**Set the tracking setup.** How this brand's questions are checked, inside the workspace's monthly AI answers: mode mix, daily, weekly, twice_weekly (mix = the most important questions daily, the rest weekly with 3 answers; recommended), samples 1-3 (weekly only), daily (mix only: how many questions daily; null = recommended) and engines. Read the counts each option allows with get_tracking_setup first. Takes effect from the next run; daily questions change from tomorrow. Nothing is deleted.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `mode` (string, required). One of: `mix`, `daily`, `weekly`, `twice_weekly`.
- `samples` (integer).
- `daily` (integer or null).
- `engines` (array of string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_claude_picks

**Choose the Claude questions.** The Claude add-on (Claude on the questions you choose): which questions get Claude and how often, inside the workspace's Claude answer budget. picks lists { question_id, mode } with mode daily, weekly3, weekly2, weekly1 (daily = 1 Claude answer a day; weeklyN = N answers on each weekly run) or null to take Claude off; the first change switches from Prefera's pick to yours, starting from its list. mode auto hands the pick back to Prefera and clears yours. Refused when the picks would not fit the budget (read it with get_claude_picks). Weekly picks apply from the next run; daily ones from tomorrow.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `mode` (string). One of: `auto`, `custom`.
- `picks` (array of object).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_daily_preset

**Set who picks the daily questions.** Who picks the brand's daily questions: balanced, advanced (balanced: Prefera picks; advanced: only the watched ones). How many is the tracking setup (set_tracking_setup). Takes effect from tomorrow.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `preset` (string, required). One of: `balanced`, `advanced`.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_daily_slot_split

**Daily questions per brand.** Owner only. How many questions each brand on the mix checks daily: split maps brand id to a whole number (leave a brand out or null for its share of the plan's recommended daily questions). Each brand's share of the answers decides how many fit.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `split` (object, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_local_settings

**Local settings.** The service area and the Google categories on the brand's local profile.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `area` (string).
- `categories` (array of string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### toggle_local_checklist

**Tick a local checklist item.** Tick (done true) or untick one item of the Google Business Profile checklist. Ids are in local.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `id` (string, required).
- `done` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_local_listing

**Correct a Google listing.** Which Google listing is read for the brand (subject "brand") or a tracked competitor (subject is its id): the business name as Google shows it. The next weekly read uses it.

Class: **write**. Areas: Integrations and settings.

Inputs:

- `subject` (string, required).
- `query` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### refresh_local

**Refresh local reviews now.** Read what has finished and post this week's local reads. Spends vendor credits: the app's per-brand hourly limit and 20 an hour per connection.

Class: **write**. Areas: Integrations and settings, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### run_technical_crawl

**Run the technical crawl now.** Crawl the brand's site for technical problems now (the app allows it once every six hours). Runs in the background; read readiness afterwards.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### rerun_readiness

**Re-run the readiness checks.** Re-run the site readiness checks now (the app allows it every ten minutes; the app's per-brand hourly limit and 20 an hour per connection apply).

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### refresh_domain_rating

**Refresh Domain Rating.** Refresh the brand's and its competitors' Domain Rating now. Paid plans; once an hour per brand, shared with the app's button.

Class: **write**. Areas: Questions and tracking, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### generate_quick_win

**Write a quick win.** Write one quick win from the approved facts: llms (llms.txt), robots (robots.txt additions), jsonld (structured data) or faq (an FAQ block). Returns the text to put on the site.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `kind` (string, required). One of: `llms`, `robots`, `jsonld`, `faq`.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### create_fix_from_faq

**Start a fix from the FAQ quick win.** Turn the FAQ quick win into a draft fix (a new page, or an edit of your FAQ page), claim-checked. Limited like every new draft: per workspace per hour.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### enrich_source

**Read a cited page.** Read one page the engines cited for this brand (address from top_sources) to learn its author and contact routes. Only cited pages are read. 60 an hour per workspace.

Class: **write**. Areas: Writing articles, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `url` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### save_entity_item

**Tick an entity checklist item.** Tick or untick one item of the Entity checklist, optionally with the address of your profile on that site.

Class: **write**. Areas: Writing articles.

Inputs:

- `id` (string, required).
- `done` (boolean, required).
- `url` (string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### email_brief_now

**Email a Monday brief now.** Email one Monday brief (id from monday_brief) to everyone in the workspace who keeps the Monday brief on. 4 an hour per brand.

Class: **write**. Areas: Integrations and settings, Actions that cost credits. Costly: spends answers, model tokens or credits.

Inputs:

- `brief_id` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### unmark_directory

**Clear a directory mark.** Take the submitted or listed mark off a directory (back to todo). To mark one submitted or listed use mark_directory.

Class: **write**. Areas: Questions and tracking.

Inputs:

- `slug` (string, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### create_piece

**Create a piece.** Create any piece Prefera makes: kind is one of new_page, page_edit, linkedin_post, linkedin_article, x_thread, video_script, reddit_reply, outreach, data_pitch, press_release, review_drive, syndication. Say what it is about with exactly one of: topic (the person's own words, 3 to 300 characters; not measured by Proof because it targets no question), question_ids (tracked questions; one for posts, threads, scripts, replies and press releases, up to six otherwise), or, for social pieces and syndication, source_url (a page on the brand's own site) or source_fix_number (one of its live articles). writer "prefera" (default): Prefera writes it from the approved facts in the background, so the call returns at once with fix_number and status "drafting" (a long article with images takes a minute or two). Call get_fix with fix_number in about a minute; the draft is ready when status is "draft", and get_fix then returns the text ready to use (an X thread also as posts, one per post; a LinkedIn article as article and post). Status "draft_failed" means it was not written and the credits went back. It spends model tokens and counts toward the month's fixes or articles (the credits are taken when it is created). writer "agent" creates it without a Prefera draft and returns agent_prompt for your own model to write from; no Prefera model spend. The flow: create it, wait for the draft with get_fix, optionally edit the text with save_draft_text, then the person (or their agent, from the person's own account) posts or sends it, then record the public link with mark_posted. Prefera never posts anything itself.

Class: **write**. Areas: Writing articles.

Inputs:

- `kind` (string, required). One of: `new_page`, `page_edit`, `reddit_reply`, `outreach`, `review_drive`, `linkedin_article`, `syndication`, `press_release`, `data_pitch`, `x_thread`, `linkedin_post`, `video_script`.
- `topic` (string). What it is about, in the person's own words.
- `question_ids` (array of string). Tracked question ids (losing_questions, all_questions).
- `source_url` (string). Social pieces and syndication: a page on the brand's own site to build it from.
- `source_fix_number` (integer). Social pieces and syndication: the number of one of the brand's live articles.
- `target_url` (string). page_edit: the page to rewrite. reddit_reply: the thread. outreach: their article (optional).
- `title` (string).
- `writer` (string). Default "prefera". One of: `prefera`, `agent`.
- `format` (string). new_page: answer_first or long_form. One of: `answer_first`, `long_form`.
- `images` (integer). new_page: AI images inside (0 to 10), each costs 1 content credit.
- `news_note` (string). press_release: the news in a line or two (required).
- `news_type` (string). One of: `launch`, `feature`, `data`.
- `author_name` (string).
- `publication` (string).
- `contact` (string).
- `platform` (string). review_drive: the review site.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### mark_posted

**Mark a piece posted.** Record that an off-site piece (LinkedIn post or article, X thread, short video script, Reddit reply, syndication, outreach, data pitch, press release, review drive) was posted or sent: url is the public address (http or https; required for posted pieces, optional for emails), and the time is now. Does exactly what Mark as posted does in the app; a piece that targets questions starts its re-check, a topic-only piece is just recorded. Only call it after the person's own account really posted it. Articles and page edits are refused here: publish them with push_fix_to_cms and publish_fix_live, or record them with mark_fix_published.

Class: **write**. Areas: Writing articles.

Inputs:

- `fix_number` (integer, required).
- `url` (string).
- `note` (string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

## Publish tools

Change the live site, send email or make a public link. Clients should ask the person before each call.

### schedule_fix_publish

**Schedule publishing to a site.** Publish live to one or more of the article's chosen sites at a set time (UTC, ISO 8601 such as 2026-12-01T09:00:00Z). A copy must be scheduled at or after the original. Runs through the same checks as publish_fix_live, as the person who owns this connection, and only if they still may publish then. Publish-class: ask the person first.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.
- `schedule` (array of object, required).

### push_fix_to_cms

**Send to the connected site as a draft.** Create (or update) the draft of this page in the connected CMS. Nothing goes live: publish_fix_live does that. Needs a ready draft (no unsupported claims). Publish-class: changes the customer's site.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### publish_fix_live

**Publish live.** Make the CMS draft of this fix live on the customer's site (GitHub: marks the pull request ready; it is live once merged). Starts Prefera's re-check. Publish-class: ask the person first.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### unpublish_fix

**Unpublish.** Take a page that went live through the connected site back off it. Publish-class: changes the customer's site.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### undo_page_edit

**Undo a live page edit.** Publish the earlier version of a page again, undoing a live page edit made through the connected site. Publish-class.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_number` (integer, required). The fix number from list_fixes.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### publish_ready_drafts

**Send ready drafts to the site.** Every ready on-site draft of a batch with a connected CMS becomes a CMS draft (nothing goes live; publish each with publish_fix_live). Publish-class.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `batch_id` (string, required). The batch id from fix_batch.
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### approve_plan_item

**Approve a piece.** Approve a written draft (the claim check runs again). An approved on-site page goes live on its day through the connected site without another click, so this is publish-class: ask the person first.

Class: **publish**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). The piece id from content_plan (items[].id).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### set_content_plan_autopilot

**Content plan autopilot.** Auto-publish: clean on-site drafts go live on their day without approval (needs a connected site); auto_publish_edits lets page edits publish too. Turning it on is publish-class (ask the person first); turning it off needs only write access.

Class: **publish**. Areas: Content plan and autopilot.

Inputs:

- `auto_publish` (boolean, required).
- `auto_publish_edits` (boolean).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### approve_outreach_send

**Approve emails for sending.** Approve the emails of these prospects (up to 25) for sending from the connected mailbox: they are queued and go out within the mailbox's daily cap and spacing. Real emails to other people: publish-class, so show the person each email and ask first.

Class: **publish**. Areas: Sending outreach email.

Inputs:

- `prospect_ids` (array of string, required). Prospect ids from outreach_board (sendable ones).
- `brand` (string). Brand id or domain (for example ledgerline.io). Optional when the workspace tracks only one brand.

### approve_answer_page

**Approve a drafted Answer Page.** Answer Pages: approve one drafted page. The claim check runs again and it is approved only when no unsupported claim is left. With a site connected it then goes live on its day (or when publish_answer_page is called), so this needs the publish permission. (Content plan pieces use approve_plan_item.)

Class: **publish**. Areas: Content plan and autopilot.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### approve_clean_pages

**Approve every clean page.** Approve every drafted page that passed the claim check with nothing flagged. Pages with flagged claims stay for a person. With a site connected, approved pages go live on their day, so this needs the publish permission.

Class: **publish**. Areas: Content plan and autopilot.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### publish_answer_page

**Publish an approved Answer Page now.** Answer Pages: publish an approved page to the connected site now, like the Publish button. Publish-class: needs the publish permission.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_answer_pages_autopilot

**Switch Answer Pages autopilot.** Autopilot on: pages that pass every check publish on their day without a person approving. Turning it ON is publish-class and needs the publish permission; turning it off only needs write access.

Class: **publish**. Areas: Content plan and autopilot.

Inputs:

- `on` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### unpublish_answer_page

**Unpublish an Answer Page.** Answer Pages: take a published page back off the connected site (the site keeps it as a draft). Publish-class: needs the publish permission.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `item_id` (string, required). Plan item id (a UUID) from the content plan.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_fact_check_policy

**When a sentence has no approved fact behind it.** Brand setting. "review" (default): publishing waits until each sentence with no approved fact is removed, backed by a fact or kept by a person. "publish_anyway": at publish time, meta sentences, FACT NEEDED placeholders and unsourced claims about a named competitor are removed first (saved as a new draft version), every other unsupported sentence is kept automatically (recorded), and the page publishes without review, also through autopilot and publish_ready_drafts. Markup and link safety checks still block. policy is one of: review, publish_anyway. Publish-class: it lets content go live unchecked, so it needs the publish permission. Read the current value with brand_style.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `policy` (string, required). One of: `review`, `publish_anyway`.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### post_syndication

**Post a page to Dev.to or Hashnode.** Post a published page to the connected Dev.to and/or Hashnode account with a link back to the page (the Syndicate studio's Post button). Weekly page cap and 20 posts an hour per brand apply. Publish-class: needs the publish permission.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `fix_id` (string, required). Fix id (a UUID) of the published page, from the content plan or the fix.
- `platforms` (array of string).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### set_auto_syndicate

**Auto-syndicate.** On: pages Answer Pages autopilot publishes are also posted to the connected platforms that fit the brand. Turning it ON is publish-class and needs the publish permission; off needs write access.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `on` (boolean, required).
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### create_report_link

**Create a client report link.** Create a read-only client report link for the brand and return its address. Anyone with the address can view the brand's client report, so share it only with the client. Up to 20 active links per brand.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.

### reveal_report_link

**Show a client report link's address.** Return the address of one active report link (id from report_links). The address grants client-view access to the report: treat it like a password.

Class: **publish**. Areas: Publishing to sites.

Inputs:

- `link_id` (string, required). Report link id (a UUID) from report_links.
- `brand` (string). Brand id or domain. Optional when the workspace tracks only one brand.
