PBN.LTD API docs
View as Markdown

MCP tool reference

The 343 tools the PBN.LTD MCP server (https://app.pbn.ltd/mcp) offers, in the order tools/list returns them. Each one is the same operation as the REST endpoint named beside it (paths relative to https://app.pbn.ltd/api/v1), with the same permission, the same limits and the same audit trail - see the API reference for the full description of what each field means.

A connection only sees the tools its permissions allow. "Kind" is the behaviour annotation the tool carries: read never changes anything, write does, and DESTRUCTIVE replaces or deletes something that cannot be brought back.

All tools

ToolWhat it doesPermissionKind
account_limitsSite slots (plan + extra-site add-ons), subscription state and paid-until date, the default per-site limits, every paused (frozen) site with the re…account:readread
account_meThe account and the key making the call. The cheapest call there is, which makes it a key test.account:readread
account_usage_refreshStarts a fresh disk / database / file-count measurement for the account's sites - the usage tab's "Check now", for many sites at once. It returns a…account:writewrite
meta_limitsThe rate limits and size limits that apply to the key making the call. overridden is true when support has raised or lowered a limit for this key…kb:readread
billing_invoice_pdfThe PDF of an invoice or credit note of this account (Content-Type application/pdf).billing:readread
billing_invoicesEvery payment and refund of the account, newest first. document is the invoice / credit note when one has been issued, with its number for the PDF.billing:readread
billing_summarySubscription (state, plan, paid-until date, days left, payment method), unpaid state with the date sites are removed if it stays unpaid, site slots…billing:readread
sites_createCreates a site exactly as the Add new site form does - same validation, same slot limit, same checks - for every type: WordPress, Static HTML, PHP…sites:writewrite
sites_create_optionsThe fields the Create site form accepts for this account right now, with their choices (site types, CDNs, PHP versions, templates, blueprints, grou…sites:writeread
sites_deleteDeletes the site for good (files, database, DNS zone, CDN), exactly like Delete site in the panel. It ALSO deletes the email of the site's domain o…sites:deleteDESTRUCTIVE
sites_edit_optionsThe fields the Edit site form offers for THIS site right now (they depend on type, CDN and state), with choices and current values.sites:writeread
sites_getEverything the site page shows: state, URL, settings, why it is paused (freeze.reasons), nameserver status (current vs required, pointed, autopilot…sites:readread
sites_listThe same search, filters and order as the sites list in the panel. total is the number of matching sites. A key restricted to some sites only see…sites:readread
sites_malwareWhat the nightly malware scan (and any "scan again") found on this site, in the same words as the site's Malware scan tab: open findings, files in…sites:readread
sites_malware_rescanStarts a malware scan of this site now (usually one to five minutes); the site's malware report shows it as last_rescan. One scan per site at a tim…sites:writewrite
sites_updateChange any setting the Edit site form offers: name, domain, PHP version, HTTPS, www, group, admin e-mail, login URL, auto-updates, mailbox. Only th…sites:writewrite
cleaner_getSite Cleaner for this site: whether the add-on is active, the last scan (what can be removed and how much it saves), the running job, recent jobs (…sites:readread
cleaner_runRuns Site Cleaner. scan lists unused plugins/themes, junk files and database clutter (free). clean removes the selected items after taking a ba…sites:writewrite
cleaner_scheduleSets automatic cleaning for the site (needs the add-on to actually clean).sites:writewrite
health_getThe online badge (online / offline / slow / paused... with the reason) and, for application sites, the last integrity check (V1 config lines, admin…sites:readread
health_integrity_checkChecks the application now (WordPress, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki): V1's config lines, the site URL, the admin account,…sites:writewrite
health_recheckProbes the home page again now (same probe and recording as the platform's monitor) and asks the server why if it fails. Asynchronous: follow the j…sites:writewrite
health_repair"Repair site": checks, repairs everything repairable (backups first, on the server), checks again. You get an e-mail listing what was repaired.sites:writewrite
sites_admin_loginA single-use login link to the site's admin (WordPress wp-admin, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki), valid for 60 seconds - the…sites:loginwrite
sites_php_versionChanges only the site's PHP version. The web server is reconfigured in the background (a job is returned).sites:writewrite
sites_purge_cacheClears the CDN cache of both hostnames (as Purge CDN cache in the panel). The site must be live.sites:writewrite
sites_reinstallInstalls the site again from scratch (as Reinstall in the panel) - the current files and database are replaced. Refused while the site is busy, swi…sites:writeDESTRUCTIVE
sites_temp_unfreezeA site paused ONLY for a usage limit (disk / database / files) comes back for 30 minutes so you can clean it up (3 times per site per day). At the…sites:writewrite
sites_usageThe Usage & add-ons tab: disk, database and file-count use against the limits (plan + add-ons), what is over, CDN bandwidth for metered CDNs, and t…sites:readread
sites_usage_refreshStarts a fresh measurement of disk, database and files (the usage tab's "Check now"). Returns the current figures with busy=true; the site's usage…sites:writewrite
dns_check_nowThe site page's "Check again now" button, for a site that is waiting for its nameservers or finishing its CDN: reads the nameservers the registry r…dns:writewrite
dns_createAdds a record with the panel's own validation. It is published to the site's DNS provider within a minute or two (follow the job); your records are…dns:writewrite
dns_deleteDeletes a record; it is removed at the DNS provider within a minute or two.dns:writeDESTRUCTIVE
dns_listThe site's own DNS records (the DNS records tab), and the publishing state: the DNS provider, when the records were last published and any record t…dns:readread
dns_updateChanges a record; send only the fields that change.dns:writeDESTRUCTIVE
sites_nameserversThe nameservers the domain must use (required), what it uses now (current, checked daily), whether it is pointed, whether the DNS zone expired at t…dns:readread
backups_createTakes a full backup (files + database) now, as Create backup in the panel. A job is returned; the backup reads Ok when it is done.backups:writewrite
backups_deleteDeletes a backup. A backup that a blueprint uses cannot be deleted.backups:writeDESTRUCTIVE
backups_downloadA temporary link to download the backup archive (tar.gz) - valid about 4 hours.backups:readread
backups_getOne backup of the site.backups:readread
backups_listThe site's backups, newest first (automatic daily ones, manual ones and uploaded ones).backups:readread
backups_restoreReplaces the site's files and database with the backup (as Restore in the panel). Refused while the site is busy, switched off or the plan has expi…backups:writeDESTRUCTIVE
files_deleteDeletes a file, or a folder (with recursive=true when it is not empty). There is no undo - take a backup first for anything important.files:writeDESTRUCTIVE
files_listFolders first, then files; up to 5,000 entries. Symbolic links are listed (type "link") but never followed. Available under the same rule as the Fi…files:readread
files_mkdirCreates a folder (and any missing parent folders).files:writewrite
files_moveRenames or moves a file or folder inside the site folder.files:writewrite
files_readReturns a file of up to 5 MB (the account's limits give the exact size). encoding=raw streams the bytes directly.files:readread
files_statType, size, modification time and mode of one path.files:readread
files_writeWrites a file of up to 25 MB atomically (a temporary file renamed into place), owned by the site's web server user. Refuses to write through symbol…files:writewrite
logs_accessRequests that reached the web server for this site's hostnames, newest last. The client IP is the visitor as the CDN reported it. 30 fetches per 10…logs:readread
logs_errorsRecent PHP and web server errors of THIS site (the Error log tab): last 7 days, grouped, sanitised (paths shown relative to the site folder, secret…logs:readread
tickets_createOpens a ticket (support is e-mailed as for a panel ticket). The ticket limits apply: at most 2 open tickets at a time (409 ticket_limit).tickets:writewrite
tickets_getA ticket with every public message (yours and support's). can_reply says if you may add a message now (ticket limits: one message before support an…tickets:readread
tickets_listYour tickets, newest first.tickets:readread
tickets_queuesThe categories (queues) a ticket can be opened in.tickets:readread
tickets_replyAdds your message to the ticket (support is notified). One message until support answers.tickets:writewrite
kb_articleOne article as plain text and as sanitised HTML, with related articles.kb:readread
kb_searchThe dashboard's knowledge-base search (keyword + meaning). Every key may use it.kb:readread
sites_kb_suggestionsKnowledge-base articles that fit what is going on with this site right now (why it is paused, nameservers not pointed, offline...), with app and pu…sites:readread
jobs_getThe live status of a job: running, succeeded or failed, with a message. Each read counts against the rate limit like any call.account:readread
jobs_listJobs the API started for this account, newest first.account:readread
autopost_article_actionThe same buttons as an article's page.content:writewrite
autopost_campaign_createCreates an auto-posting campaign exactly as the New campaign page does (same fields, same checks). It writes with one of your AI keys, so add a key…content:writewrite
autopost_campaign_deleteDeletes the campaign. Articles not written yet are cancelled; articles already published stay on your sites.content:writeDESTRUCTIVE
autopost_campaign_formEvery field a campaign takes when it is created or changed, from the page's own form: label, whether it is required, the allowed values and the hel…content:readread
autopost_campaign_updateChanges only the fields you send (the rest stay as they are), with the Edit campaign page's checks. Sending site_ids replaces the campaign's sites.content:writewrite
autopost_key_deleteRemoves the key from your account (nothing changes at the provider). Campaigns using it are paused until you choose another key.content:writeDESTRUCTIVE
autopost_key_testAsks the provider whether the key works (the page's Test button). A key that works again resumes the campaigns that were paused because of it.content:writewrite
autopost_keysThe keys to your own AI accounts that campaigns write with: provider, whether the last test worked and how many campaigns use each. The key itself…content:readread
autopost_modelsThe text and picture models on offer. A campaign's model must belong to the provider of the key it writes with.content:readread
autopost_overviewWhether auto posting is available on the account (and why not), how many campaigns and AI keys it has and how many articles are in each state.content:readread
campaigns_getOne campaign with its last ten runs.content:readread
campaigns_listThe AI auto-posting campaigns on the account: what they write, when they run next and how many articles they have made.content:readread
campaigns_statusPauses a campaign or starts it again. A campaign paused by our staff or by a problem with an AI key cannot be resumed from here - fix the cause first.content:writewrite
campaigns_write_nowAsks a campaign to write and publish now, the same as the "Write now" button. Returns the run.content:writewrite
content_createWrites the post and puts it on the site. Works for every site type: WordPress, Joomla, Drupal, PrestaShop, OpenCart, Grav and MediaWiki get a nativ…content:writewrite
content_getOne post in full, with its text and the history of what happened to it.content:readread
content_listThe latest posts the site itself reports, and every post this account has written for it through PBN.LTD (including ones still being written or wai…content:readread
content_mediaPuts a picture or file on the site and gives back the address to use in a post. On WordPress it goes into the media library; on every other site ty…content:writewrite
content_optionsBefore writing anything, ask this: it says how a post appears on this site type, which fields it supports (featured picture, categories, tags, auth…content:readread
content_queueEvery post on the account that is queued, being written, waiting for approval, scheduled, publishing, published, failed or cancelled - newest first…content:readread
content_removeRemoves a published post from the site, or cancels one that has not gone out yet. There is no undo.content:writeDESTRUCTIVE
content_updateChanges a post that has not gone out yet. A post that is already on the site cannot be edited from here - remove it and write a new one.content:writewrite
runs_getOne run of a campaign and every article in it.content:readread
code_checkRuns PHP's own syntax check over a file or every .php file in a folder, in the exact PHP version the site runs. Do this before switching a plugin o…sites:readread
extdeploy_connection_removeForgets the account's credentials here. Nothing is changed at the provider. Refused while sites still publish through it.extdeploy:writeDESTRUCTIVE
extdeploy_connection_testAsks the provider whether the stored credentials still work (the page's Test button).extdeploy:writewrite
extdeploy_connectionsThe accounts at GitHub, GitLab, Cloudflare, Netlify, Vercel, Render, AWS or Azure you have connected, and whether each still works. The credentials…extdeploy:readread
extsites_deployPublishes the site to its provider again, or rolls it back to a deploy that is already there. This replaces what is live at that provider. No files…sites:writeDESTRUCTIVE
extsites_domain_addAttaches the domain at the provider and returns the DNS records to publish wherever that domain's DNS is answered.extdeploy:writewrite
extsites_domain_refreshAsks the provider again whether the domain's DNS and certificate are in place.extdeploy:writewrite
extsites_domain_removeDetaches the domain at the provider (its DNS records are yours to remove).extdeploy:writeDESTRUCTIVE
extsites_getOne site on a third-party host, as its page shows it: state, address, source, build settings, what its provider supports (can), its custom domain…extdeploy:readread
extsites_historyThe recent deploys of one external site, newest first - what to pass to a rollback.sites:readread
extsites_listThe sites this account publishes to outside PBN.LTD (GitHub Pages, Cloudflare Pages, Netlify, Vercel and the rest), with their address and the stat…sites:readread
extsites_logWhat happened during one deploy, line by line (the page's "Log").extdeploy:readread
extsites_removeStops managing the site here. With delete_remote the project is deleted at the provider too, and whatever it serves goes offline.extdeploy:writeDESTRUCTIVE
files_upload_archiveUnpacks a zip of a built website (or a plugin or theme) into the site. Every file goes through the same path a single upload uses, so the same rule…files:writewrite
plugins_deleteSwitches a plugin off and deletes its files. There is no undo; the plugin's own data in the database is removed the way the plugin asks for.sites:writeDESTRUCTIVE
plugins_installInstalls a plugin on a WordPress site, from wordpress.org or from a zip you send. A plugin that is on our blocked list is refused. Activating a plu…sites:writeDESTRUCTIVE
plugins_listEvery plugin installed on a WordPress site, whether it is active, its version and whether an update is waiting.sites:readread
plugins_stateActivates or deactivates a plugin. Activating can take a site down; deactivating is how you put it back.sites:writeDESTRUCTIVE
sites_set_homeMakes a page the front page of the site. On WordPress this sets the site's own "front page" setting; on the other site types the file you name is c…sites:writeDESTRUCTIVE
sites_verifyFetches a page of the site and says exactly what came back: the HTTP status, how long it took, its size, its title and any redirect. The page is al…sites:readread
themes_activateSwitches the site to another theme. This changes how every page looks at once; switching back undoes it.sites:writeDESTRUCTIVE
themes_listEvery theme on a WordPress site and which one is in use.sites:readread
backlinks_tracker_getOne backlink domain: each distinct link to it (address + text) with how many times, posts and sites carry it, and which of your sites each address…sites:readread
backlinks_tracker_link_changeThe bulk link editor's "Edit": the link is searched and replaced in the posts of every site that carries it (one job per site, in each site's opera…content:writewrite
backlinks_tracker_link_removeThe bulk link editor's "Delete": the whole link, its text too, is removed from the posts of every site that carries it (one job per site). It canno…content:writeDESTRUCTIVE
backlinks_tracker_listThe backlink tracker: every domain the posts on your sites link to, with how many links, posts and sites carry them (your_site_id when the domain…sites:readread
seo_metrics_siteThe same figures as the site's SEO metrics charts tab: Trust Flow, Citation Flow, backlinks and referring domains at every reading, with the change…sites:readread
registrars_automaticSwitches automatic nameserver updates for this connection on or off (the page's toggle, but with an explicit value, so repeating the call is safe).registrars:writewrite
registrars_connectChecks the key with the registrar FIRST and only saves a working account (same as the Registrar connections page). We then read the domain list; si…registrars:writewrite
registrars_disconnectDeletes the connection and its stored keys (the nameserver update history is kept). Nothing changes at the registrar. Needs "confirm": true.registrars:writeDESTRUCTIVE
registrars_domain_checkThe question the add-a-site form asks while you type: is this domain in one of your connected accounts (or registered with Zinn Digital), so we poi…registrars:readread
registrars_getOne connection, with the domain names we can see in that registrar account (up to 1,000).registrars:readread
registrars_historyEvery nameserver change we made (or tried) at your registrars: what the registrar had before (the value to go back to), what we set, the result, an…registrars:readread
registrars_listYour connected registrar accounts: status, how many domains we can see in each, and whether automatic nameserver updates are on. The keys are never…registrars:readread
registrars_providersEvery registrar we can set nameservers at, with the steps to create an API key there, the IP addresses to allow (when the registrar needs an allow-…registrars:readread
registrars_refreshReads the domain list of this registrar account again (about a minute). Once every 2 minutes.registrars:writewrite
registrars_site_statusWhat the site page says about automatic nameserver updates for this site: whether we set its nameservers for you, through which registrar, what hap…registrars:readread
registrars_site_update_nsThe site page's "Update nameservers at my registrar" button: sets the nameservers this site needs at the registrar that holds its domain, now, and…registrars:writewrite
registrars_testAsks the registrar whether the stored key still works and records the answer on the connection.registrars:writewrite
registrars_update_waitingSets the nameservers now for every site waiting for DNS whose domain is in a connected account (the page's "update all" button). Paced to stay insi…registrars:writewrite
security_botsThe same as the two bot switches on the Security tab. The change is saved at once and applied at Cloudflare within a few minutes (status reads "a…security:writewrite
security_email_protectionThe CDN hides e-mail addresses on the site's pages from spam bots (on by default): each address becomes a /cdn-cgi/l/email-protection link plus a s…security:writewrite
security_getThe same as the site's Security tab: whether "I'm Under Attack" is on (and when it switches itself off), the site's firewall rules and rate-limitin…security:readread
security_rule_addAdds a firewall rule (or a rate-limiting rule) to the site at Cloudflare, within the plan's limit. Returns every rule of the site.security:writewrite
security_rule_deleteRemoves one rule from the site at Cloudflare.security:writeDESTRUCTIVE
security_rule_stateRules run in order: the first that matches decides.security:writewrite
security_rule_updateReplaces one rule (same shape as when adding it). Only rules made on this dashboard can be changed here.security:writewrite
security_under_attackEvery visitor gets a short browser check before the site loads while it is on - use it while the site is being hammered, then switch it off.security:writewrite
wayback_archiveThe days the public web archive has a copy of the domain's home page on, as the calendar shows. The first look-up of a domain reads the archive in…wayback:readread
wayback_getOne restore: its progress and, while it is "planned" (ready to order), a sample of the pages that would be rebuilt and your existing sites it could…wayback:readread
wayback_orderUses ONE restore credit and starts the rebuild (restore credits are bought in packs on the Wayback page; paying one restore by card through FastSpr…wayback:writewrite
wayback_startReads that day's copy from the archive and works out what would be rebuilt. Nothing is charged: the restore waits at "planned" until you order it.wayback:writewrite
wayback_statusYour restore credits, the price of a restore of each kind (what the page would charge, with your VAT), how many new sites your plan still has room…wayback:readread
hourly_backups_download_prepareBuilds a .tar.gz of that restore point (files and database), as the tab's Download button. The site's hourly backups show the download as "ready" w…backups:readwrite
hourly_backups_getThe same as the hourly part of the site's Backups tab: whether hourly backups are on for this site (and paid until when), when the next one runs, e…backups:readread
hourly_backups_nowTakes a restore point now, as the "Back up now" button (once per site every 10 minutes). It appears among the site's hourly backups within a minute…backups:writewrite
hourly_backups_restoreRolls the site back to exactly how it was at that restore point, as the tab's "Restore this backup" dialog. A backup of how the site looks now is t…backups:writeDESTRUCTIVE
mail_alias_deleteRemoves one alias, forwarder or the catch-all. No mailbox or mail is touched.mail:writeDESTRUCTIVE
mail_alias_saveSaves one alias, forwarder or the catch-all (the same checks as the Mail tab).mail:writewrite
mail_getThe same as the site's Mail tab: whether PBN.LTD Mail is set up (where = "external" when the domain's mail is at an outside provider), whether it…mail:readread
mail_mailbox_createCreates a mailbox within what the site may have (402 when an extra mailbox has to be bought first - in the Mail tab). Returns the mail state; the p…mail:writewrite
mail_mailbox_deleteDeletes the mailbox with everything in it. The site's first (included) mailbox can only go once it is the last one.mail:writeDESTRUCTIVE
mail_mailbox_passwordSets a new password (yours, or a generated one read with Show in the Mail tab). Every phone and mail program using the mailbox must then be given t…mail:writewrite
mail_out_of_officeThe same as the out-of-office form on the Mail tab.mail:writewrite
mail_setupThe Mail tab's "Set up mail": makes the site's mail account and its signing keys and publishes its records where we answer DNS for the domain.mail:writewrite
rank_domainThe domain, each Google version it is tracked in (country, language, device), and every keyword in each with its current position (null = not in th…rank:readread
rank_domain_addStarts tracking a domain (hosted with us or anywhere else). Then add a Google version and keywords. Adding a domain you track already returns it.rank:writewrite
rank_domain_removeStops tracking the domain and all its keywords. The history is kept, but re-adding the domain does not restart its keywords - they have to be added…rank:writeDESTRUCTIVE
rank_domainsEvery domain you track, with its keyword count, average position and how many keywords are in the top 10 and top 3.rank:readread
rank_group_addWhich Google to check the keywords in: country or city, language and device. Your plan sets how many per domain. Adding one that exists returns it.rank:writewrite
rank_keywordThe keyword and every completed check in the period: the position (null = not in the first 100 results) and the page of yours that ranked.rank:readread
rank_keyword_checkAsks for an extra check of this keyword now (results usually within the hour). The same bounds as the button: once per keyword in 24 hours, a daily…rank:writewrite
rank_keyword_removeRemoves the keyword AND its position history (the same as the Remove button). Needs "confirm": true.rank:writeDESTRUCTIVE
rank_keywords_addAdds keywords to a Google version with the panel's own rule: what fits inside your plan is added, the rest is listed in not_added (add a keyword pa…rank:writewrite
rank_languagesThe language codes to use for a Google version.rank:readread
rank_locationsThe location codes to use for a Google version. Up to 40 matches.rank:readread
rank_plansThe plans (keywords, Google versions per domain, cadence), the extra-keyword pack and the extra Google versions pack with their live prices (US dol…rank:readread
rank_statusWhether rank tracking is on this account, the plan, how many keywords it covers and how many are tracked, how often they are checked (weekly or dai…rank:readread
aivis_brandThe brand, every prompt with the latest answer from each AI engine, the domains cited instead of you, the daily visibility trend and starter prompt…aivis:readread
aivis_brand_addStarts tracking a brand (any domain, hosted with us or not). Then add prompts. Adding one you track already returns it.aivis:writewrite
aivis_brand_removeStops tracking the brand and all its prompts. The history is kept, but re-adding the brand does not restart its prompts. Needs "confirm": true.aivis:writeDESTRUCTIVE
aivis_brand_updateThe next round of answers uses the new settings.aivis:writewrite
aivis_brandsEvery brand (domain) you track, with its visibility numbers.aivis:readread
aivis_plansThe plans and the extra-prompt pack with their live prices (US dollars a month, before VAT), and the AI engines a prompt can be asked of (their key…aivis:readread
aivis_promptWhat each AI engine answered last time (the full answer text, as on the prompt page) and the last 30 results.aivis:readread
aivis_prompt_checkAsks the prompt's AI engines again now (answers usually within the hour). The same bounds as the button: once per prompt in 24 hours and a daily nu…aivis:writewrite
aivis_prompt_enginesSets which AI engines the next round asks for this prompt.aivis:writewrite
aivis_prompt_removeRemoves the prompt AND its answers history (the same as the Remove button). Needs "confirm": true.aivis:writeDESTRUCTIVE
aivis_prompts_addAdds prompts with the panel's own rule: what fits inside your plan is added, the rest is listed in not_added (add a prompt pack or move up a plan).…aivis:writewrite
aivis_statusWhether AI visibility is on this account, the plan, how many prompts it covers and how many are tracked, how often they are asked, the number of tr…aivis:readread
index_addAdds pages with the panel's own rules: a page that would pass the plan's URL limit or its checks a month is not added (see not_added). The first ch…index:writewrite
index_checkChecks the page immediately (usually 1-2 seconds). Uses one check of the monthly allowance; at most once an hour per page and a daily number per ac…index:writewrite
index_deleteStops tracking. Its history is kept and comes back if you add the page again.index:writeDESTRUCTIVE
index_getThe page and up to 100 of its most recent checks.index:readread
index_listEvery page you track, newest first, with its current status.index:readread
index_statusThe plan, how many pages may be tracked, checks a month included and used, the checks your chosen frequencies plan for, and how many tracked pages…index:readread
index_updateRefused when the new frequency would pass the plan's checks a month.index:writewrite
redis_siteWhether Redis is on for this site: "queued" while a switch is being applied (up to a minute), then "on" or "off"; "error" with the reason in detail.redis:readread
redis_statusWhether Redis is on for the account (plan, memory per server, paid until) and its state on each of your sites. Buying, renewing and cancelling are…redis:readread
redis_switchThe same as the site's Redis switch. WordPress sites get the object cache installed and configured for them (and removed again when switched off, t…redis:writewrite
firewall_getThe same as the site's "Website firewall" tab: whether the firewall is on for this site, and the requests it recently refused (when, what was asked…sites:readread
seo_quoteThe exact price the checkout would charge for a NEW order of these tools (before any existing subscription is taken into account), VAT for your acc…seo:readread
seo_subscriptionWhat your SEO tools order covers today (tools, plans, period, discounts) and the next period if it is already paid. Tools bought on their own (not…seo:readread
seo_toolsEvery SEO tool, whether it needs hosting, whether your account has it, its plans and pack (prices per month before VAT, from the live price rows),…seo:readread
research_domainRanked keywords (top 100 by traffic), estimated monthly traffic, position spread, top pages and competitors. Uses 1 credit - or none if this accoun…research:runwrite
research_gapKeywords the competitors rank for and your domain does not, most-shared first. One credit per competitor not asked in the last 14 days.research:runwrite
research_keywordsUp to 100 keywords, by search volume. Uses 1 credit - or none if this account asked the same question in the last 30 days.research:runwrite
research_listThe keywords in one of your lists, with their saved metrics.research:readread
research_listsYour saved keyword lists.research:readread
research_localMonthly searches for each keyword in that area. Uses 4 credits (or none if asked before).research:runwrite
research_marketsThe countries (location_code) and languages (language_code) keyword research and domain overview answer for. Free.research:readread
research_statusFor keyword research and domain overview: whether it is on the account, the plan, credits a month and credits used this month.research:readread
alerts_createDomains matching it today are the starting point, not news: from now on you get an e-mail when a NEW one matches.vetting:writewrite
alerts_deleteDeletes the saved search and stops its e-mails. What it already told you about is forgotten with it.vetting:writeDESTRUCTIVE
alerts_listEvery aged-domain search you saved, what it looks for and how many domains match it now.vetting:readread
alerts_matchesThe aged domains this saved search matches at this moment, with the price you would pay and a link to each listing.vetting:readread
vetting_getThe whole report: the verdict, every reason, the key numbers, the anchor texts, the link and traffic history and what the site was in the web archive.vetting:readread
vetting_listEvery vetting report this account has run, newest first, with its verdict and score.vetting:readread
vetting_runRuns a full report and returns it. Spends one report credit, unless you already vetted this domain recently - then the report you already have come…vetting:writewrite
vetting_statusHow many report credits this account holds, how many reports it has run, and the prices.vetting:readread
footprint_checkQueues a check. Results are usually ready within a few minutes, in the footprint report it returns. Uses one of your monthly "Check now" runs; the…footprint:writewrite
footprint_getThe report with every finding: what it is, what it means, which of your sites it affects and how to fix it. A finding marked owner: platform is o…footprint:readread
footprint_runsEvery finished report, newest first.footprint:readread
footprint_site_addAdds a site hosted elsewhere. If you have no slots left this answers 422 naming the pack that would cover it - nothing is bought automatically.footprint:writewrite
footprint_site_removeRemoves it and frees its slot straight away.footprint:writeDESTRUCTIVE
footprint_sitesThe sites hosted elsewhere that are included in your checks. Sites hosted with us are always included and never use a slot.footprint:readread
footprint_statusYour plan, how often checks run, how many external sites you may hold and how many you are using, and the score from the most recent check.footprint:readread
audit_getThe audit with every finding: what it is, what it means, which pages it affects and how to fix it. A finding with source: server comes from your…audit:readread
audit_listYour finished audits, newest first.audit:readread
audit_pagesEvery page the crawl fetched, with what was measured on it.audit:readread
audit_startQueues an audit; results are usually ready within a few minutes, in the audit it returns. A site whose ownership you have not proved is crawled sha…audit:writewrite
audit_statusYour plan, audits a month included and used, the page cap per audit, and your most recent audit.audit:readread
audit_verificationThe three ways to prove a site is yours. Any one of them is enough, and a site hosted with us needs none.audit:readread
audit_verifyLooks for the DNS record, the meta tag and the file, in that order.audit:writewrite
backlinks_add_domainRefused when it would pass the plan's domain limit, or when the chosen cadence would plan more refreshes a month than the plan includes.backlinks:writewrite
backlinks_add_linksAdds links with the panel's own rules: anything past the plan's link limit is not added (see not_added). Checking a link costs nothing - we fetch t…backlinks:writewrite
backlinks_check_linkFetches the page immediately and re-reads the link. Costs nothing and uses no allowance; at most once every 10 minutes per link.backlinks:writewrite
backlinks_delete_domainStops watching the profile: no more scheduled refreshes, and it no longer counts towards your plan. Nothing is charged.backlinks:writeDESTRUCTIVE
backlinks_delete_linkStops watching. Its history is kept and comes back if you add the link again.backlinks:writeDESTRUCTIVE
backlinks_domainThe profile with its top referring domains, anchors, linked pages and monthly history. Reads what is stored - it never spends a refresh.backlinks:readread
backlinks_domainsEvery domain whose backlink profile you watch, most recently added first, with its latest totals (backlinks, referring domains, referring domains w…backlinks:readread
backlinks_linkThe link and up to 100 of its most recent checks.backlinks:readread
backlinks_linksEvery link you watch, problems first.backlinks:readread
backlinks_refresh_domainUses one profile refresh of the monthly allowance, unless a recent shared snapshot of that domain can be reused, in which case it costs nothing. At…backlinks:writewrite
backlinks_statusThe plan, how many links and profiles may be watched, profile refreshes a month included and used, the refreshes your chosen cadences plan for, and…backlinks:readread
backlinks_update_linkSets how often this one link is re-checked (daily, weekly or monthly) and schedules its next check to match. The answer is the link with its new fr…backlinks:writewrite
mentions_addRefused when it would pass the plan's brand limit, or when the chosen schedule would plan more checks a month than the plan includes.mentions:writewrite
mentions_brandReads what is stored - it never spends a check.mentions:readread
mentions_brandsEvery brand phrase you track, most recently added first, with its mention counts by sentiment, visibility and when it was last checked. Reads what…mentions:readread
mentions_checkUses one check of the monthly allowance, unless a recent shared snapshot of that phrase can be reused, in which case it costs nothing. At most once…mentions:writewrite
mentions_deleteStops listening. Everything already found is kept.mentions:writeDESTRUCTIVE
mentions_listNewest first.mentions:readread
mentions_statusThe plan, how many phrases may be tracked, checks a month included and used, the checks your chosen schedules plan for, and the overall sentiment s…mentions:readread
mentions_updateSets how often we search for new mentions of this phrase. Refused with validation_failed when the new pace would plan more checks a month than your…mentions:writewrite
local_add_keywordsAdds keywords to one of your towns. Refused before anything is spent if the month would not fit inside your plan.local:writewrite
local_businessOne business: its profile facts, the towns it is searched from, and every change we have seen to its listing.local:readread
local_businessesEvery business you track, with the facts of its Google business profile as we last read them and how it is doing in the map results.local:readread
local_check_nowPuts those keywords at the front of the queue. They are checked within a few minutes and each one uses a check from this month's allowance.local:writewrite
local_historyEvery check we have made of that keyword, so you can chart it yourself.local:readread
local_keywordsEvery keyword you track, where it sits in the map results and in the ordinary results, and how it moved since the check before.local:readread
local_statusYour plan, what it covers, how much of this month's checks you have used, and how your businesses are doing on the map overall.local:readread
reports_clientsEvery client you report on, what of theirs a report covers and when the next one is due.reports:readread
reports_getThe whole report: every section as it was frozen when it was made, the plain "what changed" summary, and the share link while it is live.reports:readread
reports_listEvery report made on this account, newest first. The share link itself is only returned by the single-report endpoint.reports:readread
reports_makeBuilds the report from what the account has already collected - it never spends any of your search credits - and returns it with its share link.reports:writewrite
reports_revokeThe link stops working at once for everybody who has it. The report itself is kept and you can turn the link back on from the panel.reports:writeDESTRUCTIVE
reports_statusYour plan, how many clients and reports it covers and how many you have used this month.reports:readread
updates_holdsEvery plugin update we held back across your sites because it stopped the site working (the same list as the "Held plugin updates" page). "holding"…updates:readread
updates_site_holdsThe held plugin updates of one site (the site page's "Plugin updates" section).updates:readread
updates_try_againThe "Try again" button. Nothing is installed now: the site's next update run tries this version again, loading the site before and after. If it sto…updates:writewrite
extradb_cancelCancelling stops the renewal reminders and removes the database (full copy first) when its paid months end; nothing more is charged. "cancel": fals…extradb:writeDESTRUCTIVE
extradb_createAdds an extra database where your account gets them free of charge (created in a minute or two). Every other account buys one in the browser: this…extradb:writewrite
extradb_deleteRemoves the database now. A full copy is taken first and kept for the days in removed_copy_kept_days (ask support to put it back). Needs "confirm":…extradb:writeDESTRUCTIVE
extradb_getOne extra database, with its restore points (its own daily backups, newest first; each id is a point the database can be restored to).extradb:readread
extradb_listEvery extra database in your account (all sites), with its state, size, paid period and last backup. Credentials are shown on the site's Extra data…extradb:readread
extradb_restorePuts the database back as it was at the chosen daily backup: everything written since is replaced. A copy of the database as it is now is taken fir…extradb:writeDESTRUCTIVE
extradb_siteWhether this site can have extra databases (every site type with a database), the price per database per month (before VAT, from the live price row…extradb:readread
staging_accessThe username and password that protect the staging site, to share it with someone who has no account (the same "Password to share" the staging page…staging:writewrite
staging_cancelEnds the staging add-on now and removes EVERY staging site of the account. Months already paid are not refunded. Your live sites are not affected.…staging:writeDESTRUCTIVE
staging_copy_from_liveCopies the live site over the staging copy (files and/or database), replacing any changes made on staging. The live site is not changed. Needs "con…staging:writeDESTRUCTIVE
staging_copy_to_livePublishes the staging copy: OVERWRITES the live site's files and/or database with the staging ones. An undo copy of what it replaced is kept for 7…staging:writeDESTRUCTIVE
staging_createMakes a private staging copy of one of your live sites (files and database). It takes a few minutes for a typical site; the staging site reads "rea…staging:writewrite
staging_deleteRemoves the staging copy (its files, database and address). The live site is not touched and the slot is free again straight away. Needs "confirm":…staging:writeDESTRUCTIVE
staging_eligibleYour live sites and, for each, whether a staging copy can be made of it now and, when not, the reason in plain words (only WordPress and Static HTM…staging:readread
staging_getOne staging site with its last ten jobs (create, copy to live, copy from live, remove).staging:readread
staging_listEvery staging site in your account that exists now (being created, ready, copying, paused, needs attention or being removed), newest first, with it…staging:readread
staging_sftpSFTP for one staging site. The first call switches it on and returns the login WITH a new password; later calls return the login with "password": "…staging:writewrite
staging_statusWhether staging is on for your account, until when it is paid, how many staging sites you have and may have at once, the size limits, and the month…staging:readread
turnstile_disableTakes the plugin off the site first (read back), then deletes the widget. Your forms are no longer protected by the bot check. Needs "confirm": tru…turnstile:writeDESTRUCTIVE
turnstile_enableSwitches the bot check on for this site, or saves new settings when it is already on. We create the Turnstile widget, install our small WordPress p…turnstile:writewrite
turnstile_getWhat the site's Turnstile tab shows: whether the bot check can be used here (WordPress sites), whether it is on, the mode, which forms it protects,…turnstile:readread
turnstile_rotateIssues a new secret key for the site's widget and installs it on the site straight away. The new key is never shown - it only lives on your site. F…turnstile:writewrite
cron_accountAll cron jobs on every site of the account (at most 25), each with its site id and domain.cron:readread
cron_createAdds a job and puts it on the site's server within about a minute. It runs as the site's own user, in the site folder, with the site's PHP version,…cron:writewrite
cron_deleteDeletes the job and its run history, and takes it off the server within about a minute. A run already going finishes.cron:writeDESTRUCTIVE
cron_getThe job and its last 10 runs: when, how long, the exit code, and the output (the first 1,000 and last 7,000 bytes of long output are kept).cron:readread
cron_listEvery cron job of the site with its schedule (as written and in words, UTC), what it runs, whether it is on, why it is paused if it is (the site is…cron:readread
cron_runStarts the job on its server at once (once a minute per job, 10 times in 10 minutes per account). The run is recorded like a scheduled one, with tr…cron:writewrite
cron_runsNewest first. status: ok, failed (non-zero exit code), timeout (stopped at 15 minutes), skipped (the previous run was still going, or the server wa…cron:readread
cron_updateChange any of the fields; the others stay as they are. To change the schedule give schedule_mode with its fields. Switching a job on again (`enab…cron:writewrite
reputation_addAdds a business and searches Google, Trustpilot and Tripadvisor for its profiles. The results arrive as candidates within a minute or two, for th…reputation:writewrite
reputation_confirmOnly a profile you confirm is ever read. Its first reading starts at once.reputation:writewrite
reputation_countriesThe countries you can choose when adding a business (pass location_code as country).reputation:readread
reputation_deleteRemoves the business with its profiles, reviews, history and brand terms.reputation:writeDESTRUCTIVE
reputation_getOne business: per platform its confirmed profile (or the candidates found, waiting for you to confirm which is yours), the latest reviews (poor una…reputation:readread
reputation_listEvery business you watch with its confirmed review profiles and their latest reading (null = not read yet, never zero). covered is false for a bu…reputation:readread
reputation_profile_removeForgets the confirmed profile on one platform (search again to pick another).reputation:writeDESTRUCTIVE
reputation_refreshAsks for a fresh reading of every confirmed profile and brand term of this business within the next few minutes. The same bound as the "Read now" b…reputation:writewrite
reputation_searchSearches the three platforms again for this business's profiles (the same daily limit per business as the button). New candidates replace the old o…reputation:writewrite
reputation_statusYour plan, how many businesses and brand terms it covers and how many you watch.reputation:readread
reputation_term_addAdds a brand term whose Google page one is read every week (within your plan's brand terms, up to 10 per business).reputation:writewrite
reputation_term_deleteRemoves a brand term and its page-one history.reputation:writeDESTRUCTIVE
products_addAdds a product and reads both shelves at once. Refused before anything is spent if your plan has no room.products:writewrite
products_deleteRemoves the product and its history.products:writeDESTRUCTIVE
products_getOne product with every listing we read on each shelf ("counted" = comparable to your product; "yours" = recognised by your seller name or ASIN).products:readread
products_listEvery product you track, with the latest reading of each shelf.products:readread
products_statusYour plan, how many products it covers and how your products are doing on the shelves.products:readread
competitors_addAdds a domain to your watch-list; its first reading arrives within minutes. Refused before anything is spent if your packs have no room.competitors:writewrite
competitors_deleteRemoves the domain from your watch-list.competitors:writeDESTRUCTIVE
competitors_getOne domain with its top pages and the history of its weekly readings.competitors:readread
competitors_listEvery domain you watch, with its latest weekly reading (null = not measured, never zero).competitors:readread
competitors_statusYour packs, how many domains they cover (plus any free domain) and how many you watch.competitors:readread
agency_addAdds domains to your list; their first reading arrives within minutes. Adds as many as your plan has room for and says why each other one was skipp…agency:writewrite
agency_deleteRemoves the domain from your list.agency:writeDESTRUCTIVE
agency_getOne domain with the history of its weekly readings (newest first, up to two years).agency:readread
agency_listEvery domain you track, with its latest weekly reading (null = not measured, never zero).agency:readread
agency_statusYour plan, how many domains it covers and how many you track.agency:readread
agency_updateChanges the client label or note, or switches the domain off / on.agency:writewrite
mailroute_get"route": "ours" = our mail servers (the default); "own" = the customer's own provider, with its state ("pending" while being set up on the server,…sites:readread
mailroute_offSwitches the site back to our mail servers within a minute. The settings are kept unless forget=true.sites:writeDESTRUCTIVE
mailroute_providersThe providers a site can send through and what each needs: a key only (Resend, SendGrid, Postmark), a login and key (Brevo, Mailgun, Amazon SES, wh…sites:readread
mailroute_setStores the settings (the key encrypted) and switches the site's e-mail to that provider within a minute. The answer's "state" says whether it is se…sites:writewrite
mailroute_testSends one real e-mail the way the website does (from inside the site, through the provider) and returns the provider's answer in plain words. At mo…sites:writewrite
country_lock_getWhether the site is locked to certain countries, which ones, whether search-engine crawlers are let in, the addresses that are always let in, and w…sites:readread
country_lock_setLocks the site to the countries given (or everyone except them), or switches the lock off. Live on the site within about a minute - read it back wi…sites:writewrite
boost_statusWhether Performance Boost is on for the account (level, multiplier, last paid day), how many sites it covers, and what each level costs a month for…boost:readread
prodisc_offersWhether the account gets 50% off the first payment of our Pro plugins (an active, paid hosting plan), and each plugin in the offer with its state f…prodisc:readread
moneysites_buyPlace a money-site order (a WordPress plan, optionally with WooCommerce, or an application plan). Zinn Digital LTD bills it, so the answer carries…moneysites:writewrite
moneysites_getOne money site in full: state, plan, hostnames, PHP version, region, usage against the plan's allowances, recent jobs and errors, and the links for…moneysites:readread
moneysites_listEvery money site on this account, with its state, plan, application and last known usage.moneysites:readread
moneysites_moreThe other hosting lines of our sister company Zinn Digital - agency, reseller, enterprise, cloud, AI, developer, LMS and mail hosting - each with i…moneysites:readread
moneysites_moveOne move: the step it is on, what it is doing now, and its log (what was checked and when).moneysites:readread
moneysites_move_cancelCancels a move before the domain is switched. The site stays exactly as it is on PBN hosting. Refused once the domain switch has started.moneysites:writewrite
moneysites_move_checkWhether the site can be moved now, into which money-site plan and slot, and what happens. When it cannot, reason_code says why (no_plan, no_free_…moneysites:readread
moneysites_move_startStarts the one-click move.moneysites:writewrite
moneysites_movesEvery move of a PBN site to money-site hosting on this account, newest first, with its steps and state.moneysites:readread
moneysites_orderOne order, re-read from Zinn Digital if it is still open.moneysites:readread
moneysites_order_cancelCancel an order that has not been paid. Nothing was charged, so nothing is refunded.moneysites:writeDESTRUCTIVE
moneysites_ordersEvery money-site order on this account, newest first, with its state and what it cost.moneysites:readread
moneysites_plansEvery money-site hosting plan on sale - Managed WordPress hosting (Start to Enterprise; any of them can be ordered with WooCommerce installed and s…moneysites:readread
moneysites_refreshAsks Zinn Digital for this account's sites and orders again: after paying, or when a site set up by our team is not listed yet.moneysites:readread
moneysites_site_addon_payFor an add-on order that is awaiting payment: the same order's pay link again (never a second order). Refused when there is nothing to pay.moneysites:writewrite
moneysites_site_addonsWhat the site's plan already includes, the add-ons that can be added to THIS site (valid for its plan, priced by the server), and the add-on orders…moneysites:readread
moneysites_site_addons_requestAsks for add-ons on this site. The server checks every code against the site's plan and prices it. When add-ons can be placed online, the answer ca…moneysites:writewrite
moneysites_site_planThe Zinn Digital subscription that pays for this money site, read live: its plan, price, whether it renews and on which date, or the date it ends w…moneysites:readread
moneysites_site_plan_cancelCancels the plan that pays for this money site AT THE END OF THE PAID PERIOD: renewal is switched off, the site stays live until ends_on, then th…moneysites:writeDESTRUCTIVE
moneysites_woocommerceWhether WooCommerce is installed on one of your PBN-line WordPress sites, which version, and the health checks: plugin active, shop/cart/checkout p…moneysites:readread
moneysites_woocommerce_setAdds WooCommerce to a PBN-line WordPress site, free of charge, or switches it off again. The install runs in the background and usually takes a min…moneysites:writewrite
jobs_waitWaits for a job (site create, backup, restore, delete, reinstall, DNS publish) and returns it once it has succeeded or failed, or when the wait run…account:readread

Account

The account behind the key: profile, plan, site slots, limits and usage.

account_limits

Plan, slots, limits and frozen sites · read-only · permission account:read · REST equivalent GET /account/limits

Site slots (plan + extra-site add-ons), subscription state and paid-until date, the default per-site limits, every paused (frozen) site with the reason(s) it is paused, and the add-ons on the account. Needs the account:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "account_limits",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Account. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

account_me

Who am I · read-only · permission account:read · REST equivalent GET /me

The account and the key making the call. The cheapest call there is, which makes it a key test. Needs the account:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "account_me",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Account. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

account_usage_refresh

Measure usage of the whole account now · write · permission account:write · REST equivalent POST /account/limits/refresh

Starts a fresh disk / database / file-count measurement for the account's sites - the usage tab's "Check now", for many sites at once. It returns at once: each site is reported as started, busy, throttled (the panel's own per-site cooldown and per-account budget apply unchanged) or skipped with the reason. The new figures appear in the account limits and each site's usage a few seconds later. Needs the account:write permission.

ArgumentTypeRequiredDescription
site_idsarraynoOnly these sites (default: every installed site of the account, newest first).
max_sitesintegernoHow many sites to start a measurement for in this call (1-100). Default: 25.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "account_usage_refresh",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Account. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

meta_limits

API limits for this key · read-only · permission kb:read · REST equivalent GET /limits

The rate limits and size limits that apply to the key making the call. overridden is true when support has raised or lowered a limit for this key or for the whole account. Needs the kb:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "meta_limits",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Account. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Billing

Subscription, payment due, invoices and invoice PDFs, add-ons.

billing_invoice_pdf

Download an invoice PDF · read-only · permission billing:read · REST equivalent GET /billing/invoices/{number}.pdf

The PDF of an invoice or credit note of this account (Content-Type application/pdf). Needs the billing:read permission.

ArgumentTypeRequiredDescription
numberstringyesInvoice number, e.g. PBN-2026-001234.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "billing_invoice_pdf",
    "arguments": {
      "number": "PBN-2026-001234"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Billing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

billing_invoices

Payments and invoices · read-only · permission billing:read · REST equivalent GET /billing/invoices

Every payment and refund of the account, newest first. document is the invoice / credit note when one has been issued, with its number for the PDF. Needs the billing:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoItems per page (1-200). Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "billing_invoices",
    "arguments": {
      "limit": 10
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Billing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

billing_summary

Billing overview · read-only · permission billing:read · REST equivalent GET /billing

Subscription (state, plan, paid-until date, days left, payment method), unpaid state with the date sites are removed if it stays unpaid, site slots, add-ons, VAT treatment and the panel links. Needs the billing:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "billing_summary",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Billing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Sites

Every site type: list, search, create, change, delete; status, nameservers, CDN, SEO.

sites_create

Create a site (any type) · write · permission sites:write · REST equivalent POST /sites

Creates a site exactly as the Add new site form does - same validation, same slot limit, same checks - for every type: WordPress, Static HTML, PHP hosting, Joomla, Drupal, PrestaShop, OpenCart, Grav and MediaWiki. A WordPress site also needs title, subtitle, login_url and feedback_email; no other type does, and the create options list exactly what each type requires. Installation runs in the background as a job; once installed, the domain points at the site's nameservers.required. Needs the sites:write permission. Starts a job that finishes later: the answer carries job.id, and the job reads succeeded or failed when it is done.

ArgumentTypeRequiredDescription
typestring (one of: Wordpress, Static HTML, PHP hosting, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki)yesSite type.
namestringyesA unique short name (letters, digits, dashes).
domainstringyesThe domain (or subdomain of one of your sites).
cdnstringnoCDN, one of the choices the create options offer.
php_versionstringnoPHP version value, e.g. "PHP 8.3".
use_httpsbooleannoServe over HTTPS.
use_wwwbooleannowww. as the primary host.
titlestringnoSite title (WordPress and the ready-installed applications). REQUIRED when type is Wordpress.
subtitlestringnoTagline. REQUIRED when type is Wordpress; ignored for other types.
admin_emailstringnoAdministrator e-mail (WordPress and the applications).
feedback_emailstringnoContact-form e-mail address, where the site's contact form sends its messages. REQUIRED when type is Wordpress; ignored for other types.
login_urlstringnoWordPress login path (default wp-login.php). REQUIRED when type is Wordpress.
template_idintegernoWordPress template id (omit for random).
blueprint_idintegernoDeploy from one of your blueprints (WordPress).
group_idintegernoPut the site in this group.
create_mailboxbooleannoRetired and ignored: e-mail accounts at your domain are created on the site's Mail tab.
autoupdate_wordpressbooleannoAuto-update WordPress core and plugins.
form_fieldsobjectnoAny other Create site form field by its form name (its form_field in the create options), e.g. the WordPress theme/plugin pickers.
install_woocommercebooleannoWordPress only: once the site is built, install WooCommerce and set the shop up (shop, cart, checkout and account pages, store open, pretty permalinks). Free. Ignored for other site types. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_create",
    "arguments": {
      "type": "Wordpress",
      "name": "myblog",
      "domain": "myblog-example.com",
      "cdn": "Cloudflare",
      "use_https": true,
      "title": "My blog",
      "subtitle": "Notes from the workshop",
      "admin_email": "[email protected]",
      "feedback_email": "[email protected]"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_create_options

Fields and choices for a new site · read-only · permission sites:write · REST equivalent GET /sites/options

The fields the Create site form accepts for this account right now, with their choices (site types, CDNs, PHP versions, templates, blueprints, groups...) and defaults. Every field name here is accepted when creating a site (unknown ones go in form_fields). required is the answer FOR THE TYPE in the response's type - a WordPress site also needs title, subtitle, login_url and feedback_email, no other type does. required_for_types on each field and the required_by_type map give the whole picture in one call. Needs the sites:write permission.

ArgumentTypeRequiredDescription
typestring (one of: Wordpress, Static HTML, PHP hosting, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki)noDescribe the form for this site type. Which fields are REQUIRED depends on the type, so name the type you are going to create. Default: the form's own default type.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_create_options",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_delete

Delete a site · destructive · permission sites:delete · REST equivalent DELETE /sites/{site_id}

Deletes the site for good (files, database, DNS zone, CDN), exactly like Delete site in the panel. It ALSO deletes the email of the site's domain on our mail service - every mailbox and forwarder and all their mail - when it has any; the response states it in email_deleted and warning. Refused while the site is busy or paused for non-payment/malware, while it has subdomain sites, or while a blueprint is being made from it. Runs in the background: a job is returned. Needs the sites:delete permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_delete",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_edit_options

Fields and choices to edit a site · read-only · permission sites:write · REST equivalent GET /sites/{site_id}/options

The fields the Edit site form offers for THIS site right now (they depend on type, CDN and state), with choices and current values. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_edit_options",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_get

Get one site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}

Everything the site page shows: state, URL, settings, why it is paused (freeze.reasons), nameserver status (current vs required, pointed, autopilot), CDN, SEO, indexation, platform, online status and what can be done with it right now (capabilities). Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_list

List and search sites · read-only · permission sites:read · REST equivalent GET /sites

The same search, filters and order as the sites list in the panel. total is the number of matching sites. A key restricted to some sites only sees those. Needs the sites:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
searchstringnoPart of the domain or name (www. is ignored).
statestring (one of: ok, waiting, activating, working, error, frozen, notinstalled)nook = live, waiting = waiting for DNS, activating = activating CDN, working = being installed/changed, error, frozen = paused, notinstalled.
typestring (one of: Wordpress, Static HTML, PHP hosting, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki, mismatch)noSite type; "mismatch" = the files run a different platform than the site type.
groupstringnoGroup id, or "none" for sites in no group.
cdnstringnoCDN name, e.g. Cloudflare, BunnyCDN, KeyCDN, CDN77.COM, Gcore, CloudFront.
php_versionstringnoPHP version value, e.g. "PHP 8.3".
indexedstring (one of: yes, no, pending)noGoogle indexation state.
onlinestring (one of: online, offline)noThe online badge: offline = a confirmed problem.
sortstring (one of: newest, oldest, name, name_desc, domain, domain_desc)noOrder of the list. Default: newest.
limitintegernoItems per page (1-200). Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_list",
    "arguments": {
      "search": "blog",
      "state": "ok",
      "limit": 20
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_malware

Malware scan results · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/malware

What the nightly malware scan (and any "scan again") found on this site, in the same words as the site's Malware scan tab: open findings, files in quarantine, and the date the site would be paused if the findings stay. Files identical to the official published copies are never listed. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_malware",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_malware_rescan

Scan the site again · write · permission sites:write · REST equivalent POST /sites/{site_id}/malware/rescan

Starts a malware scan of this site now (usually one to five minutes); the site's malware report shows it as last_rescan. One scan per site at a time, ten per account an hour. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_malware_rescan",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_update

Change site settings · write · permission sites:write · REST equivalent PATCH /sites/{site_id}

Change any setting the Edit site form offers: name, domain, PHP version, HTTPS, www, group, admin e-mail, login URL, auto-updates, mailbox. Only the fields sent change. Changes that touch the server (domain, PHP, HTTPS/www) run in the background: a job is returned then. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
namestringnoA unique short name (letters, digits, dashes).
domainstringnoThe domain (or subdomain of one of your sites).
php_versionstringnoPHP version value, e.g. "PHP 8.3".
use_httpsbooleannoServe over HTTPS.
use_wwwbooleannowww. as the primary host.
admin_emailstringnoAdministrator e-mail (WordPress and the applications).
login_urlstringnoWordPress login path (default wp-login.php). REQUIRED when type is Wordpress.
group_idintegernoPut the site in this group.
create_mailboxbooleannoRetired and ignored: e-mail accounts at your domain are created on the site's Mail tab.
autoupdate_wordpressbooleannoAuto-update WordPress core and plugins.
form_fieldsobjectnoAny other Create site form field by its form name, e.g. the WordPress theme/plugin pickers.
ssl_modestring (one of: full, flexible)noCloudflare SSL mode (only offered when the site has its own address records).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_update",
    "arguments": {
      "site_id": 123,
      "php_version": "PHP 8.3",
      "use_www": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Site tools

Cache purge, one-click admin login, reinstall, health checks, Site Cleaner, usage.

cleaner_get

Site Cleaner status · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/cleaner

Site Cleaner for this site: whether the add-on is active, the last scan (what can be removed and how much it saves), the running job, recent jobs (with undo_available) and the schedule. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cleaner_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cleaner_run

Scan, clean or undo · write · permission sites:write · REST equivalent POST /sites/{site_id}/cleaner/{action}

Runs Site Cleaner. scan lists unused plugins/themes, junk files and database clutter (free). clean removes the selected items after taking a backup and checks the site afterwards - it needs the Site Cleaner add-on (402 addon_required otherwise). undo puts a clean back from its backup. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
actionstring (one of: scan, clean, undo)yesscan (free) / clean (needs the Site Cleaner add-on) / undo a clean.
itemsarraynoclean: ids from last_scan.items to remove (omit = the default selection).
job_idintegernoundo: the id of the clean job to undo.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cleaner_run",
    "arguments": {
      "site_id": 123,
      "action": "scan"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cleaner_schedule

Automatic cleaning · write · permission sites:write · REST equivalent PUT /sites/{site_id}/cleaner/schedule

Sets automatic cleaning for the site (needs the add-on to actually clean). Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
schedulestring (one of: off, daily, weekly, monthly)yesHow often Site Cleaner runs by itself.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cleaner_schedule",
    "arguments": {
      "site_id": 123,
      "schedule": "weekly"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

health_get

Health status · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/health

The online badge (online / offline / slow / paused... with the reason) and, for application sites, the last integrity check (V1 config lines, admin account, login health, core files). Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "health_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

health_integrity_check

Integrity check now · write · permission sites:write · REST equivalent POST /sites/{site_id}/health/integrity-check

Checks the application now (WordPress, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki): V1's config lines, the site URL, the admin account, one-click login health and core file checksums. Changes nothing. Takes a few seconds. Needs the sites:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "health_integrity_check",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

health_recheck

Re-check if the site is up · write · permission sites:write · REST equivalent POST /sites/{site_id}/health/recheck

Probes the home page again now (same probe and recording as the platform's monitor) and asks the server why if it fails. Asynchronous: follow the job; its result has the outcome. At most 10 an hour. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "health_recheck",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

health_repair

Repair the site · write · permission sites:write · REST equivalent POST /sites/{site_id}/health/repair

"Repair site": checks, repairs everything repairable (backups first, on the server), checks again. You get an e-mail listing what was repaired. Needs the sites:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "health_repair",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_admin_login

One-click admin login link · write · permission sites:login · REST equivalent POST /sites/{site_id}/admin-login

A single-use login link to the site's admin (WordPress wp-admin, Joomla, Drupal, PrestaShop, OpenCart, Grav, MediaWiki), valid for 60 seconds - the panel's one-click login, for a browser, not for storing. Not for Static HTML / PHP hosting sites. Needs the sites:login permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_admin_login",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_php_version

Change the PHP version · write · permission sites:write · REST equivalent PUT /sites/{site_id}/php-version

Changes only the site's PHP version. The web server is reconfigured in the background (a job is returned). Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
php_versionstringyese.g. "PHP 8.3"
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_php_version",
    "arguments": {
      "site_id": 123,
      "php_version": "PHP 8.3"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_purge_cache

Purge the CDN cache · write · permission sites:write · REST equivalent POST /sites/{site_id}/purge-cache

Clears the CDN cache of both hostnames (as Purge CDN cache in the panel). The site must be live. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_purge_cache",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_reinstall

Reinstall from scratch · destructive · permission sites:write · REST equivalent POST /sites/{site_id}/reinstall

Installs the site again from scratch (as Reinstall in the panel) - the current files and database are replaced. Refused while the site is busy, switched off or being deleted. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
confirmbooleanyesMust be true: this action overwrites the site.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_reinstall",
    "arguments": {
      "site_id": 123,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_temp_unfreeze

Switch a paused site on for cleanup · write · permission sites:write · REST equivalent POST /sites/{site_id}/temporary-unfreeze

A site paused ONLY for a usage limit (disk / database / files) comes back for 30 minutes so you can clean it up (3 times per site per day). At the end it is paused again only if still over the limit. The site's freeze.temporary_unfreeze says if it is available and why not. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_temp_unfreeze",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_usage

Disk, database and file usage · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/usage

The Usage & add-ons tab: disk, database and file-count use against the limits (plan + add-ons), what is over, CDN bandwidth for metered CDNs, and the add-ons on the site. Numbers are measured every few hours, or on demand. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_usage",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_usage_refresh

Measure usage now · write · permission sites:write · REST equivalent POST /sites/{site_id}/usage/refresh

Starts a fresh measurement of disk, database and files (the usage tab's "Check now"). Returns the current figures with busy=true; the site's usage reads busy=false again when it is done (seconds). Same throttles as the panel: one measurement per site every few minutes. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_usage_refresh",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

DNS records

The site's own DNS records (A, AAAA, CNAME, TXT, MX, SRV, CAA, NS).

dns_check_now

Check a waiting site's nameservers now · write · permission dns:write · REST equivalent POST /sites/{site_id}/check-dns-now

The site page's "Check again now" button, for a site that is waiting for its nameservers or finishing its CDN: reads the nameservers the registry really publishes for the domain, compares them with the ones the site needs, looks for an old DNSSEC record left at the registrar, and when everything is right starts the go-live step at once. status is one of not_pointed, dnssec, going_live, finishing, live, unknown. Once per 5 minutes per site. Needs the dns:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dns_check_now",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

dns_create

Add a DNS record · write · permission dns:write · REST equivalent POST /sites/{site_id}/dns

Adds a record with the panel's own validation. It is published to the site's DNS provider within a minute or two (follow the job); your records are never overwritten by the platform. Needs the dns:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
typestring (one of: A, AAAA, CNAME, TXT, MX, SRV, CAA, NS)yesRecord type.
namestringyes"@" for the domain itself, or a name like blog, shop.eu, _dmarc, _sip._tcp.
valuestringyesIPv4 (A), IPv6 (AAAA), host name (CNAME, MX, SRV target, NS), text (TXT) or CA domain (CAA).
priorityintegernoMX and SRV.
weightintegernoSRV.
portintegernoSRV.
caa_flagsinteger (one of: 0, 128)noCAA: 0 or 128 (critical).
caa_tagstring (one of: issue, issuewild, iodef)noCAA tag.
proxiedbooleannoCloudflare only, A/AAAA/CNAME: proxy through the CDN (off = DNS only).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dns_create",
    "arguments": {
      "site_id": 123,
      "type": "TXT",
      "name": "@",
      "value": "google-site-verification=abc123"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

dns_delete

Delete a DNS record · destructive · permission dns:write · REST equivalent DELETE /sites/{site_id}/dns/{record_id}

Deletes a record; it is removed at the DNS provider within a minute or two. Needs the dns:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
record_idintegeryesThe DNS record id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dns_delete",
    "arguments": {
      "site_id": 123,
      "record_id": 5501
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

dns_list

List DNS records · read-only · permission dns:read · REST equivalent GET /sites/{site_id}/dns

The site's own DNS records (the DNS records tab), and the publishing state: the DNS provider, when the records were last published and any record the provider refused (with its error). Records the platform manages for the CDN are not listed and are never changed through this API. Needs the dns:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dns_list",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

dns_update

Change a DNS record · destructive · permission dns:write · REST equivalent PATCH /sites/{site_id}/dns/{record_id}

Changes a record; send only the fields that change. Needs the dns:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
record_idintegeryesThe DNS record id.
typestring (one of: A, AAAA, CNAME, TXT, MX, SRV, CAA, NS)noRecord type.
namestringno"@" for the domain itself, or a name like blog, shop.eu, _dmarc, _sip._tcp.
valuestringnoIPv4 (A), IPv6 (AAAA), host name (CNAME, MX, SRV target, NS), text (TXT) or CA domain (CAA).
priorityintegernoMX and SRV.
weightintegernoSRV.
portintegernoSRV.
caa_flagsinteger (one of: 0, 128)noCAA: 0 or 128 (critical).
caa_tagstring (one of: issue, issuewild, iodef)noCAA tag.
proxiedbooleannoCloudflare only, A/AAAA/CNAME: proxy through the CDN (off = DNS only).
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "dns_update",
    "arguments": {
      "site_id": 123,
      "record_id": 5501,
      "value": "google-site-verification=xyz789"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_nameservers

Nameserver status · read-only · permission dns:read · REST equivalent GET /sites/{site_id}/nameservers

The nameservers the domain must use (required), what it uses now (current, checked daily), whether it is pointed, whether the DNS zone expired at the provider (zone_expired: re-create it from the site page), and the registrar autopilot status when a registrar connection sets them for you. Needs the dns:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_nameservers",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in DNS records. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Backups

List, create, download and restore backups.

backups_create

Create a backup now · write · permission backups:write · REST equivalent POST /sites/{site_id}/backups

Takes a full backup (files + database) now, as Create backup in the panel. A job is returned; the backup reads Ok when it is done. Needs the backups:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_create",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

backups_delete

Delete a backup · destructive · permission backups:write · REST equivalent DELETE /sites/{site_id}/backups/{backup_id}

Deletes a backup. A backup that a blueprint uses cannot be deleted. Needs the backups:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe backup id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_delete",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

backups_download

Download link · read-only · permission backups:read · REST equivalent POST /sites/{site_id}/backups/{backup_id}/download-link

A temporary link to download the backup archive (tar.gz) - valid about 4 hours. Needs the backups:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe backup id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_download",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

backups_get

Get one backup · read-only · permission backups:read · REST equivalent GET /sites/{site_id}/backups/{backup_id}

One backup of the site. Needs the backups:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe backup id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_get",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

backups_list

List backups · read-only · permission backups:read · REST equivalent GET /sites/{site_id}/backups

The site's backups, newest first (automatic daily ones, manual ones and uploaded ones). Needs the backups:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
statestring (one of: Pending, Creating, Ok, Error, Storing)noOnly backups in this state.
limitintegernoItems per page (1-200). Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_list",
    "arguments": {
      "site_id": 123,
      "limit": 10
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

backups_restore

Restore a backup · destructive · permission backups:write · REST equivalent POST /sites/{site_id}/backups/{backup_id}/restore

Replaces the site's files and database with the backup (as Restore in the panel). Refused while the site is busy, switched off or the plan has expired. A job is returned. Needs the backups:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe backup id.
confirmbooleanyesMust be true: this action overwrites the site.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backups_restore",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Files

Browse, read, upload, rename and delete the files of a site.

files_delete

Delete a file or folder · destructive · permission files:write · REST equivalent DELETE /sites/{site_id}/files

Deletes a file, or a folder (with recursive=true when it is not empty). There is no undo - take a backup first for anything important. Needs the files:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesPath relative to the site folder, e.g. "wp-content/uploads" ("" or "/" = the site folder).
recursivebooleannoRequired to delete a folder that is not empty. Default: False.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_delete",
    "arguments": {
      "site_id": 123,
      "path": "hello.txt"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_list

List a folder · read-only · permission files:read · REST equivalent GET /sites/{site_id}/files

Folders first, then files; up to 5,000 entries. Symbolic links are listed (type "link") but never followed. Available under the same rule as the File Manager: the site is installed, the plan is active and the site is not suspended. Needs the files:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringnoFolder path relative to the site folder (default: the site folder itself).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_list",
    "arguments": {
      "site_id": 123,
      "path": "wp-content"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_mkdir

Create a folder · write · permission files:write · REST equivalent POST /sites/{site_id}/files/folders

Creates a folder (and any missing parent folders). Needs the files:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesThe new folder path.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_mkdir",
    "arguments": {
      "site_id": 123,
      "path": "wp-content/uploads/reports"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_move

Rename or move · write · permission files:write · REST equivalent POST /sites/{site_id}/files/move

Renames or moves a file or folder inside the site folder. Needs the files:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesWhat to move.
tostringyesThe new path.
overwritebooleannoReplace an existing file at the destination. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_move",
    "arguments": {
      "site_id": 123,
      "path": "hello.txt",
      "to": "old/hello.txt"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_read

Read (download) a file · read-only · permission files:read · REST equivalent GET /sites/{site_id}/files/content

Returns a file of up to 5 MB (the account's limits give the exact size). encoding=raw streams the bytes directly. Needs the files:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesPath relative to the site folder, e.g. "wp-content/uploads" ("" or "/" = the site folder).
encodingstring (one of: base64, text, raw)nobase64 (JSON, any file), text (JSON, UTF-8 files) or raw (the bytes themselves, with a Content-Type). Default: base64.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_read",
    "arguments": {
      "site_id": 123,
      "path": "robots.txt",
      "encoding": "text"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_stat

File or folder details · read-only · permission files:read · REST equivalent GET /sites/{site_id}/files/stat

Type, size, modification time and mode of one path. Needs the files:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesPath relative to the site folder, e.g. "wp-content/uploads" ("" or "/" = the site folder).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_stat",
    "arguments": {
      "site_id": 123,
      "path": "index.php"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_write

Upload (write) a file · write · permission files:write · REST equivalent PUT /sites/{site_id}/files/content

Writes a file of up to 25 MB atomically (a temporary file renamed into place), owned by the site's web server user. Refuses to write through symbolic links and into folders the platform manages. Needs the files:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesWhere to write it, relative to the site folder.
contentstringnoText content (UTF-8). Or use content_base64.
content_base64stringnoThe file, base64-encoded. Or send the raw bytes as the request body (Content-Type application/octet-stream) or a multipart form with a "file" field.
overwritebooleannoReplace an existing file. Default: False.
mkdirsbooleannoCreate missing folders. Default: True.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_write",
    "arguments": {
      "site_id": 123,
      "path": "hello.txt",
      "overwrite": "true",
      "content": "Hello world\n"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Files. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Logs

Error log and access log of a site.

logs_access

Access log · read-only · permission logs:read · REST equivalent GET /sites/{site_id}/logs/access

Requests that reached the web server for this site's hostnames, newest last. The client IP is the visitor as the CDN reported it. 30 fetches per 10 minutes per account. Needs the logs:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
hoursintegernoHow far back to look. Default: 1.
linesintegernoAt most this many (the newest) lines. Default: 200.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "logs_access",
    "arguments": {
      "site_id": 123,
      "hours": 1,
      "lines": 100
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Logs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

logs_errors

Error log · read-only · permission logs:read · REST equivalent GET /sites/{site_id}/logs/errors

Recent PHP and web server errors of THIS site (the Error log tab): last 7 days, grouped, sanitised (paths shown relative to the site folder, secrets hidden). php_hint=true when the errors look like code written for an older PHP version. Cached 60 s; 20 fetches per 10 minutes per account. Needs the logs:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "logs_errors",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Logs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Support tickets

Open support tickets and reply to them.

tickets_create

Open a ticket · write · permission tickets:write · REST equivalent POST /tickets

Opens a ticket (support is e-mailed as for a panel ticket). The ticket limits apply: at most 2 open tickets at a time (409 ticket_limit). Needs the tickets:write permission.

ArgumentTypeRequiredDescription
titlestringyesShort summary.
messagestringyesWhat happened, what you expected.
queuestringnoCategory slug, one of the ticket queues. Default: general-support-request.
prioritystring (one of: low, normal, high)noPriority. Default: normal.
site_idintegernoThe site it is about (its domain is added to the ticket).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tickets_create",
    "arguments": {
      "title": "Question about my site",
      "message": "How do I add a subdomain?",
      "queue": "general-support-request",
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Support tickets. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

tickets_get

Read a ticket · read-only · permission tickets:read · REST equivalent GET /tickets/{ticket_id}

A ticket with every public message (yours and support's). can_reply says if you may add a message now (ticket limits: one message before support answers). Needs the tickets:read permission.

ArgumentTypeRequiredDescription
ticket_idintegeryesThe ticket id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tickets_get",
    "arguments": {
      "ticket_id": 4412
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Support tickets. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

tickets_list

List tickets · read-only · permission tickets:read · REST equivalent GET /tickets

Your tickets, newest first. Needs the tickets:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
statusstring (one of: open, closed)noOnly open or only closed tickets.
limitintegernoItems per page (1-200). Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tickets_list",
    "arguments": {
      "status": "open"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Support tickets. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

tickets_queues

Ticket categories · read-only · permission tickets:read · REST equivalent GET /tickets/queues

The categories (queues) a ticket can be opened in. Needs the tickets:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tickets_queues",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Support tickets. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

tickets_reply

Reply to a ticket · write · permission tickets:write · REST equivalent POST /tickets/{ticket_id}/messages

Adds your message to the ticket (support is notified). One message until support answers. Needs the tickets:write permission.

ArgumentTypeRequiredDescription
ticket_idintegeryesThe ticket id.
messagestringyesYour message.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tickets_reply",
    "arguments": {
      "ticket_id": 4412,
      "message": "Thanks, that worked."
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Support tickets. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Knowledge base

Search the knowledge base.

kb_article

Read an article · read-only · permission kb:read · REST equivalent GET /kb/articles/{slug}

One article as plain text and as sanitised HTML, with related articles. Needs the kb:read permission.

ArgumentTypeRequiredDescription
slugstringyesArticle slug from a search result.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "kb_article",
    "arguments": {
      "slug": "change-nameservers"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Knowledge base. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Search the knowledge base · read-only · permission kb:read · REST equivalent GET /kb/search

The dashboard's knowledge-base search (keyword + meaning). Every key may use it. Needs the kb:read permission.

ArgumentTypeRequiredDescription
qstringyesWhat you are looking for, in plain words.
limitintegernoAt most this many. Default: 8.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "kb_search",
    "arguments": {
      "q": "change nameservers"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Knowledge base. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_kb_suggestions

Help articles for this site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/help

Knowledge-base articles that fit what is going on with this site right now (why it is paused, nameservers not pointed, offline...), with app and public links. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_kb_suggestions",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Knowledge base. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Jobs

Progress of the long-running actions the API started.

jobs_get

Job status · read-only · permission account:read · REST equivalent GET /jobs/{job_id}

The live status of a job: running, succeeded or failed, with a message. Each read counts against the rate limit like any call. Needs the account:read permission.

ArgumentTypeRequiredDescription
job_idstringyesThe id returned as job.id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "jobs_get",
    "arguments": {
      "job_id": "job_4f1c0a9e2b7d6c5a3e10"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

jobs_list

List jobs · read-only · permission account:read · REST equivalent GET /jobs

Jobs the API started for this account, newest first. Needs the account:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
statusstring (one of: running, succeeded, failed)noOnly jobs in this state.
site_idintegernoOnly jobs of this site.
limitintegernoItems per page (1-200). Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "jobs_list",
    "arguments": {
      "status": "running"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

jobs_wait

Wait for a job to finish · read-only · permission account:read · REST equivalent GET /jobs/{job_id}, polled until it finishes

Waits for a job (site create, backup, restore, delete, reinstall, DNS publish) and returns it once it has succeeded or failed, or when the wait runs out. Needs the account:read permission.

ArgumentTypeRequiredDescription
job_idstringyesThe job id returned by the tool that started it (job_...).
timeout_secondsintegernoHow long to wait before giving up and returning the job as it is. Default: 120.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "jobs_wait",
    "arguments": {
      "job_id": "job_4f1c0a9e2b7d6c5a3e10",
      "timeout_seconds": 120
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Content and publishing

Posts, pages, pictures and the AI auto-posting campaigns, on every site type.

autopost_article_action

An article's buttons · write · permission content:write · REST equivalent POST /autopost/articles/{article_id}/{action}

The same buttons as an article's page. Needs the content:write permission.

ArgumentTypeRequiredDescription
article_idintegeryesThe article (a post id from the content endpoints).
actionstring (one of: approve, publish_now, cancel, retry, unpublish, delete)yesapprove (a campaign that asks for review), publish_now, cancel, retry (a failed one), unpublish (take it off the site), delete (forget a finished one here - it stays on the site).
confirmbooleannoNeeded for unpublish: must be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_article_action",
    "arguments": {
      "article_id": "article_id",
      "action": "scan"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_campaign_create

Create a campaign · write · permission content:write · REST equivalent POST /campaigns

Creates an auto-posting campaign exactly as the New campaign page does (same fields, same checks). It writes with one of your AI keys, so add a key on the AI keys page first. Needs the content:write permission.

ArgumentTypeRequiredDescription
campaignobjectyesThe campaign fields, e.g. {"name": "...", "site_ids": [123], "text_connection": 12, "text_model": 3, "schedule": "daily", "times": "09:00"}.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_campaign_create",
    "arguments": {
      "campaign": "<campaign>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_campaign_delete

Delete a campaign · destructive · permission content:write · REST equivalent DELETE /campaigns/{campaign_id}

Deletes the campaign. Articles not written yet are cancelled; articles already published stay on your sites. Needs the content:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
campaign_idintegeryesThe campaign.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_campaign_delete",
    "arguments": {
      "campaign_id": 44,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_campaign_form

The fields of a campaign · read-only · permission content:read · REST equivalent GET /autopost/campaign-fields

Every field a campaign takes when it is created or changed, from the page's own form: label, whether it is required, the allowed values and the help text. site_ids are your site ids, text_connection / image_connection are AI key ids and text_model / image_model are model ids. Needs the content:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_campaign_form",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_campaign_update

Change a campaign · write · permission content:write · REST equivalent PATCH /campaigns/{campaign_id}

Changes only the fields you send (the rest stay as they are), with the Edit campaign page's checks. Sending site_ids replaces the campaign's sites. Needs the content:write permission.

ArgumentTypeRequiredDescription
campaign_idintegeryesThe campaign.
campaignobjectyesThe campaign fields, e.g. {"name": "...", "site_ids": [123], "text_connection": 12, "text_model": 3, "schedule": "daily", "times": "09:00"}.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_campaign_update",
    "arguments": {
      "campaign_id": 44,
      "campaign": "<campaign>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_key_delete

Remove an AI key · destructive · permission content:write · REST equivalent DELETE /autopost/keys/{key_id}

Removes the key from your account (nothing changes at the provider). Campaigns using it are paused until you choose another key. Needs the content:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
key_idintegeryesThe AI key.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_key_delete",
    "arguments": {
      "key_id": "key_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_key_test

Test an AI key · write · permission content:write · REST equivalent POST /autopost/keys/{key_id}/test

Asks the provider whether the key works (the page's Test button). A key that works again resumes the campaigns that were paused because of it. Needs the content:write permission.

ArgumentTypeRequiredDescription
key_idintegeryesThe AI key.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_key_test",
    "arguments": {
      "key_id": "key_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_keys

Your AI keys · read-only · permission content:read · REST equivalent GET /autopost/keys

The keys to your own AI accounts that campaigns write with: provider, whether the last test worked and how many campaigns use each. The key itself is never returned, and a key is only ever added on the AI keys page (https://app.pbn.ltd/autopost/keys/). Needs the content:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_keys",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_models

AI models a campaign can use · read-only · permission content:read · REST equivalent GET /autopost/models

The text and picture models on offer. A campaign's model must belong to the provider of the key it writes with. Needs the content:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_models",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

autopost_overview

AI auto posting: overview · read-only · permission content:read · REST equivalent GET /autopost

Whether auto posting is available on the account (and why not), how many campaigns and AI keys it has and how many articles are in each state. Needs the content:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "autopost_overview",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

campaigns_get

Read one campaign · read-only · permission content:read · REST equivalent GET /campaigns/{campaign_id}

One campaign with its last ten runs. Needs the content:read permission.

ArgumentTypeRequiredDescription
campaign_idintegeryesThe campaign.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "campaigns_get",
    "arguments": {
      "campaign_id": 44
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

campaigns_list

List auto-posting campaigns · read-only · permission content:read · REST equivalent GET /campaigns

The AI auto-posting campaigns on the account: what they write, when they run next and how many articles they have made. Needs the content:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoHow many to return. Default: 20.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
statusstring (one of: active, paused, problem, finished)no
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "campaigns_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

campaigns_status

Pause or resume · write · permission content:write · REST equivalent PUT /campaigns/{campaign_id}/status

Pauses a campaign or starts it again. A campaign paused by our staff or by a problem with an AI key cannot be resumed from here - fix the cause first. Needs the content:write permission.

ArgumentTypeRequiredDescription
campaign_idintegeryes
statusstring (one of: active, paused)yes"paused" stops it writing; "active" starts it again.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "campaigns_status",
    "arguments": {
      "campaign_id": 44,
      "status": "paused"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

campaigns_write_now

Write one now · write · permission content:write · REST equivalent POST /campaigns/{campaign_id}/write-now

Asks a campaign to write and publish now, the same as the "Write now" button. Returns the run. Needs the content:write permission.

ArgumentTypeRequiredDescription
campaign_idintegeryes
site_idsarraynoOnly these sites of the campaign (default: all of them).
countintegernoArticles per site. Default: 1.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "campaigns_write_now",
    "arguments": {
      "campaign_id": 44,
      "count": 1
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_create

Publish a post or page · write · permission content:write · REST equivalent POST /sites/{site_id}/content

Writes the post and puts it on the site. Works for every site type: WordPress, Joomla, Drupal, PrestaShop, OpenCart, Grav and MediaWiki get a native post/article/page, and Static HTML and PHP hosting sites get a page built in the look of their own pages, with a blog index and sitemap.xml kept up to date. The answer carries a job; the finished post has its address. Needs the content:write permission. Starts a job that finishes later: the answer carries job.id, and the job reads succeeded or failed when it is done.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
titlestringyesThe title of the post.
body_htmlstringnoThe text as HTML. Or send body_markdown.
body_markdownstringnoThe text as Markdown (headings, lists, links, bold, code, quotes).
statusstring (one of: publish, draft)no"draft" only on site types that have drafts. Default: publish.
categorystringnoCategory id or name, on site types that have them.
authorstringnoAuthor id, on site types that have authors.
tagsarraynoTags for the post.
slugstringnoThe address of the post; one is made from the title when you leave it out.
publish_atstringnoISO date and time to publish it (default: now).
featured_image_base64stringnoThe main picture, base64. It leads the post and becomes the featured image on site types that have one.
images_base64arraynoMore pictures, base64; they are placed in the text.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_create",
    "arguments": {
      "site_id": 123,
      "title": "Five ways to speed up your shop",
      "body_markdown": "## Why speed matters\n\nA faster shop sells more.",
      "status": "publish",
      "tags": [
        "speed",
        "shop"
      ]
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_get

Read one post · read-only · permission content:read · REST equivalent GET /sites/{site_id}/content/{post_id}

One post in full, with its text and the history of what happened to it. Needs the content:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
post_idintegeryesThe post id this API gave you when it was created.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_get",
    "arguments": {
      "site_id": 123,
      "post_id": 90210
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_list

Posts on this site · read-only · permission content:read · REST equivalent GET /sites/{site_id}/content

The latest posts the site itself reports, and every post this account has written for it through PBN.LTD (including ones still being written or waiting to go out). Needs the content:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
limitintegernoHow many to return. Default: 20.
statestring (one of: queued, writing, images, review, ready, publishing, done, failed, cancelled)noOnly posts in this state.
on_sitebooleannoAlso ask the site itself for its latest posts (slower). Default: True.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_list",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_media

Upload a picture or file · write · permission content:write · REST equivalent POST /sites/{site_id}/content/media

Puts a picture or file on the site and gives back the address to use in a post. On WordPress it goes into the media library; on every other site type it goes into the site's own files. Needs the content:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
namestringyesThe file name, e.g. "hero.jpg".
content_base64stringyesThe file itself, base64.
altstringnoAlt text (WordPress media library).
folderstringnoWhere to put it on site types with no media library. Default: assets.
overwritebooleannoReplace a file of the same name. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_media",
    "arguments": {
      "site_id": 123,
      "name": "hero.jpg",
      "content_base64": "iVBORw0KGgo=",
      "alt": "The shop front"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_options

What a post on this site can have · read-only · permission content:read · REST equivalent GET /sites/{site_id}/content/options

Before writing anything, ask this: it says how a post appears on this site type, which fields it supports (featured picture, categories, tags, author, drafts) and the real categories and authors the site has. Site types with no drafts publish straight away - the answer says so. Needs the content:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_options",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_queue

Everything being written or published · read-only · permission content:read · REST equivalent GET /content/queue

Every post on the account that is queued, being written, waiting for approval, scheduled, publishing, published, failed or cancelled - newest first, across all sites. Needs the content:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoHow many to return. Default: 20.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
statestring (one of: queued, writing, images, review, ready, publishing, done, failed, cancelled)noOnly posts in this state.
site_idintegernoOnly this site.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_queue",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_remove

Take a post off the site · destructive · permission content:write · REST equivalent DELETE /sites/{site_id}/content/{post_id}

Removes a published post from the site, or cancels one that has not gone out yet. There is no undo. Needs the content:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
post_idintegeryesThe post id this API gave you when it was created.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_remove",
    "arguments": {
      "site_id": 123,
      "post_id": 90210
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

content_update

Change a post · write · permission content:write · REST equivalent PATCH /sites/{site_id}/content/{post_id}

Changes a post that has not gone out yet. A post that is already on the site cannot be edited from here - remove it and write a new one. Needs the content:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
post_idintegeryesThe post id this API gave you when it was created.
titlestringnoA new title.
body_htmlstringnoNew text as HTML.
body_markdownstringnoNew text as Markdown.
tagsarraynoReplace the tags.
statusstring (one of: publish, draft)no
publish_atstringnoMove when it goes out.
approvebooleannoApprove a post that is waiting for approval.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "content_update",
    "arguments": {
      "site_id": 123,
      "post_id": 90210,
      "title": "Five ways to speed up your shop (updated)"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

runs_get

How a run is going · read-only · permission content:read · REST equivalent GET /runs/{run_id}

One run of a campaign and every article in it. Needs the content:read permission.

ArgumentTypeRequiredDescription
run_idintegeryesThe run.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "runs_get",
    "arguments": {
      "run_id": 7782
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Content and publishing. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Building, plugins and themes

Upload a built site, set the home page, install and test plugins and themes, and the sites you publish to other hosts.

code_check

Check PHP code for errors · read-only · permission sites:read · REST equivalent POST /sites/{site_id}/code-check

Runs PHP's own syntax check over a file or every .php file in a folder, in the exact PHP version the site runs. Do this before switching a plugin or theme on - a syntax error there takes the whole site down. Needs the sites:read permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringyesA file or folder in the site, e.g. "wp-content/plugins/my-plugin".
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "code_check",
    "arguments": {
      "site_id": 123,
      "path": "wp-content/plugins/my-plugin"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extdeploy_connection_remove

Disconnect a hosting account · destructive · permission extdeploy:write · REST equivalent DELETE /external-connections/{connection_id}

Forgets the account's credentials here. Nothing is changed at the provider. Refused while sites still publish through it. Needs the extdeploy:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extdeploy_connection_remove",
    "arguments": {
      "connection_id": "connection_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extdeploy_connection_test

Test a connected account · write · permission extdeploy:write · REST equivalent POST /external-connections/{connection_id}/test

Asks the provider whether the stored credentials still work (the page's Test button). Needs the extdeploy:write permission.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extdeploy_connection_test",
    "arguments": {
      "connection_id": "connection_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extdeploy_connections

Your connected hosting accounts · read-only · permission extdeploy:read · REST equivalent GET /external-connections

The accounts at GitHub, GitLab, Cloudflare, Netlify, Vercel, Render, AWS or Azure you have connected, and whether each still works. The credentials are never returned; connecting an account is done on the connections page (https://app.pbn.ltd/extdeploy/connections). Needs the extdeploy:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extdeploy_connections",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_deploy

Deploy again or roll back · destructive · permission sites:write · REST equivalent POST /external-sites/{ext_site_id}/deploy

Publishes the site to its provider again, or rolls it back to a deploy that is already there. This replaces what is live at that provider. No files travel through this call: it publishes the files the PBN.LTD site already has. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
ext_site_idintegeryes
kindstring (one of: redeploy, rollback)noBuild and publish again, or go back to an earlier deploy. Default: redeploy.
rollback_tostringnoThe id of an earlier deploy of this site. Needed for a rollback.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_deploy",
    "arguments": {
      "ext_site_id": 9,
      "kind": "redeploy"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_domain_add

Attach a custom domain · write · permission extdeploy:write · REST equivalent POST /external-sites/{ext_site_id}/domains

Attaches the domain at the provider and returns the DNS records to publish wherever that domain's DNS is answered. Needs the extdeploy:write permission.

ArgumentTypeRequiredDescription
ext_site_idintegeryesThe external site id.
hostnamestringyese.g. landing.example.com
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_domain_add",
    "arguments": {
      "ext_site_id": 9,
      "hostname": "<hostname>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_domain_refresh

Check a custom domain again · write · permission extdeploy:write · REST equivalent POST /external-sites/{ext_site_id}/domains/{domain_id}/refresh

Asks the provider again whether the domain's DNS and certificate are in place. Needs the extdeploy:write permission.

ArgumentTypeRequiredDescription
ext_site_idintegeryesThe external site id.
domain_idintegeryesThe domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_domain_refresh",
    "arguments": {
      "ext_site_id": 9,
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_domain_remove

Detach a custom domain · destructive · permission extdeploy:write · REST equivalent DELETE /external-sites/{ext_site_id}/domains/{domain_id}

Detaches the domain at the provider (its DNS records are yours to remove). Needs the extdeploy:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
ext_site_idintegeryesThe external site id.
domain_idintegeryesThe domain id.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_domain_remove",
    "arguments": {
      "ext_site_id": 9,
      "domain_id": "domain_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_get

One external site · read-only · permission extdeploy:read · REST equivalent GET /external-sites/{ext_site_id}

One site on a third-party host, as its page shows it: state, address, source, build settings, what its provider supports (can), its custom domains with the DNS records each needs, and the recent deploys. Needs the extdeploy:read permission.

ArgumentTypeRequiredDescription
ext_site_idintegeryesThe external site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_get",
    "arguments": {
      "ext_site_id": 9
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_history

Deploys of an external site · read-only · permission sites:read · REST equivalent GET /external-sites/{ext_site_id}/deployments

The recent deploys of one external site, newest first - what to pass to a rollback. Needs the sites:read permission.

ArgumentTypeRequiredDescription
ext_site_idintegeryes
limitintegernoDefault: 25.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_history",
    "arguments": {
      "ext_site_id": 9
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_list

Sites on third-party hosts · read-only · permission sites:read · REST equivalent GET /external-sites

The sites this account publishes to outside PBN.LTD (GitHub Pages, Cloudflare Pages, Netlify, Vercel and the rest), with their address and the state of the last deploy. Connecting a provider and adding a site stay in the panel, because they need your own provider credentials. Needs the sites:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoHow many to return. Default: 20.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
providerstringnoOnly this provider.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_log

The log of one deploy · read-only · permission extdeploy:read · REST equivalent GET /external-sites/deployments/{deployment_id}/log

What happened during one deploy, line by line (the page's "Log"). Needs the extdeploy:read permission.

ArgumentTypeRequiredDescription
deployment_idintegeryesThe deploy id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_log",
    "arguments": {
      "deployment_id": "deployment_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extsites_remove

Remove an external site · destructive · permission extdeploy:write · REST equivalent DELETE /external-sites/{ext_site_id}

Stops managing the site here. With delete_remote the project is deleted at the provider too, and whatever it serves goes offline. Needs the extdeploy:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
ext_site_idintegeryesThe external site id.
delete_remotebooleannotrue = also delete the project at the provider (where the provider allows it). Default: leave it there. Default: False.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extsites_remove",
    "arguments": {
      "ext_site_id": 9,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

files_upload_archive

Upload a built site (zip) · write · permission files:write · REST equivalent POST /sites/{site_id}/files/archive

Unpacks a zip of a built website (or a plugin or theme) into the site. Every file goes through the same path a single upload uses, so the same rules hold for each one: inside the site folder only, symbolic links are never followed and the platform's own folders are refused. Up to 60 files and 25 MB in one call - send a bigger site in parts. Needs the files:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
zip_base64stringyesThe .zip file, base64.
pathstringnoFolder inside the site to unpack into (default: the site root).
strip_top_folderbooleannoDrop the single top folder the zip may have ("mysite/index.html" -> "index.html"). Default: False.
overwritebooleannoReplace files that already exist. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "files_upload_archive",
    "arguments": {
      "site_id": 123,
      "zip_base64": "UEsDBAoAAAAAA...",
      "path": "",
      "strip_top_folder": true,
      "overwrite": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

plugins_delete

Remove a plugin · destructive · permission sites:write · REST equivalent DELETE /sites/{site_id}/plugins/{slug}

Switches a plugin off and deletes its files. There is no undo; the plugin's own data in the database is removed the way the plugin asks for. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
slugstringyesThe plugin folder name.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "plugins_delete",
    "arguments": {
      "site_id": 123,
      "slug": "my-plugin"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

plugins_install

Install a plugin · destructive · permission sites:write · REST equivalent POST /sites/{site_id}/plugins

Installs a plugin on a WordPress site, from wordpress.org or from a zip you send. A plugin that is on our blocked list is refused. Activating a plugin can break a site, so installing and activating are separate steps. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
slugstringnoA wordpress.org plugin slug, e.g. "classic-editor".
zip_base64stringnoOr your own plugin as a .zip file, base64.
activatebooleannotrue switches it on straight away. Default: False.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "plugins_install",
    "arguments": {
      "site_id": 123,
      "slug": "classic-editor",
      "activate": false
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

plugins_list

Plugins on this site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/plugins

Every plugin installed on a WordPress site, whether it is active, its version and whether an update is waiting. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "plugins_list",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

plugins_state

Switch a plugin on or off · destructive · permission sites:write · REST equivalent POST /sites/{site_id}/plugins/{slug}/{action}

Activates or deactivates a plugin. Activating can take a site down; deactivating is how you put it back. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
slugstringyesThe plugin folder name.
actionstring (one of: activate, deactivate)yesWhat to do.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "plugins_state",
    "arguments": {
      "site_id": 123,
      "slug": "my-plugin",
      "action": "activate"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_set_home

Set the home page · destructive · permission sites:write · REST equivalent POST /sites/{site_id}/home-page

Makes a page the front page of the site. On WordPress this sets the site's own "front page" setting; on the other site types the file you name is copied over index.html (or index.php), which replaces what is there now. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pagestringyesWordPress: the page id or its exact title. Other site types: the file to use, e.g. "home.html".
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_set_home",
    "arguments": {
      "site_id": 123,
      "page": "home.html"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

sites_verify

Fetch a page and check it · read-only · permission sites:read · REST equivalent POST /sites/{site_id}/verify

Fetches a page of the site and says exactly what came back: the HTTP status, how long it took, its size, its title and any redirect. The page is always fetched on the site's own server (so it works even before the domain points at us) and, when the address allows it, from the internet as well. The newest PHP errors are read at the same time. This is the honest test after changing anything - a plugin, a theme, a file or a setting. Needs the sites:read permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
pathstringnoThe page to fetch, e.g. "/about". Default: /.
publicbooleannoAlso try the page from the internet. Default: True.
errorsbooleannoAlso read the PHP error log afterwards. Default: True.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "sites_verify",
    "arguments": {
      "site_id": 123,
      "path": "/"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

themes_activate

Use this theme · destructive · permission sites:write · REST equivalent POST /sites/{site_id}/themes/{slug}/activate

Switches the site to another theme. This changes how every page looks at once; switching back undoes it. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
slugstringyesThe theme folder name.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "themes_activate",
    "arguments": {
      "site_id": 123,
      "slug": "twentytwentyfive"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

themes_list

Themes on this site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/themes

Every theme on a WordPress site and which one is in use. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "themes_list",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Building, plugins and themes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

The SEO figures measured for each site, and the backlink tracker with its bulk link editor.

Every link to one domain · read-only · permission sites:read · REST equivalent GET /backlink-tracker/{domain_id}

One backlink domain: each distinct link to it (address + text) with how many times, posts and sites carry it, and which of your sites each address is found on. A link id is what the link editor endpoints take. Needs the sites:read permission.

ArgumentTypeRequiredDescription
domain_idintegeryesThe backlink domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_tracker_get",
    "arguments": {
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO metrics and backlinks. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Change a link everywhere · write · permission content:write · REST equivalent PATCH /backlink-tracker/links/{anchor_id}

The bulk link editor's "Edit": the link is searched and replaced in the posts of every site that carries it (one job per site, in each site's operations log). Needs the content:write permission.

ArgumentTypeRequiredDescription
anchor_idintegeryesThe link id.
urlstringnoThe new address (default: unchanged).
textstringnoThe new link text (default: unchanged).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_tracker_link_change",
    "arguments": {
      "anchor_id": "anchor_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO metrics and backlinks. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Remove a link everywhere · destructive · permission content:write · REST equivalent DELETE /backlink-tracker/links/{anchor_id}

The bulk link editor's "Delete": the whole link, its text too, is removed from the posts of every site that carries it (one job per site). It cannot be undone except from a backup. Needs the content:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
anchor_idintegeryesThe link id.
confirmbooleanyesMust be true: the link (with its text) is removed from every post.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_tracker_link_remove",
    "arguments": {
      "anchor_id": "anchor_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO metrics and backlinks. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Domains your posts link to · read-only · permission sites:read · REST equivalent GET /backlink-tracker

The backlink tracker: every domain the posts on your sites link to, with how many links, posts and sites carry them (your_site_id when the domain is one of your own sites). Needs the sites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_tracker_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO metrics and backlinks. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

seo_metrics_site

SEO metrics history of a site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/seo-metrics

The same figures as the site's SEO metrics charts tab: Trust Flow, Citation Flow, backlinks and referring domains at every reading, with the change since the reading before. latest is null until the first reading. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
limitintegernoHow many readings, newest first. Default: 90.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "seo_metrics_site",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO metrics and backlinks. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Registrar connections

Connect your domain registrar accounts so we set your sites' nameservers for you: connections, automatic updates, per-site status and history.

registrars_automatic

Automatic nameserver updates on or off · write · permission registrars:write · REST equivalent POST /registrars/connections/{connection_id}/automatic

Switches automatic nameserver updates for this connection on or off (the page's toggle, but with an explicit value, so repeating the call is safe). Needs the registrars:write permission.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
enabledbooleanyestrue = we set nameservers for waiting sites on this account's domains.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_automatic",
    "arguments": {
      "connection_id": "connection_id",
      "enabled": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_connect

Connect a registrar account · write · permission registrars:write · REST equivalent POST /registrars/connections

Checks the key with the registrar FIRST and only saves a working account (same as the Registrar connections page). We then read the domain list; sites waiting for nameservers on those domains are updated automatically within a minute or two. Some registrars need our IP addresses on an allow-list first. Needs the registrars:write permission.

ArgumentTypeRequiredDescription
registrarstringyesThe registrar code (e.g. namecheap, godaddy, porkbun, dynadot, namesilo, spaceship, namebright, zinn).
secret_credentialsobjectyesThe fields that registrar needs, by name (its fields in the registrar providers), e.g. {"username": "...", "api_key": "..."}. Checked with the registrar before anything is saved; stored encrypted; never returned and never written to the API call log.
labelstringnoYour own name for this account (optional, 80 characters).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_connect",
    "arguments": {
      "registrar": "<registrar>",
      "secret_credentials": "<secret_credentials>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_disconnect

Disconnect a registrar account · destructive · permission registrars:write · REST equivalent DELETE /registrars/connections/{connection_id}

Deletes the connection and its stored keys (the nameserver update history is kept). Nothing changes at the registrar. Needs "confirm": true. Needs the registrars:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
confirmbooleanyesMust be true: the stored keys are deleted and automatic nameserver updates through this account stop.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_disconnect",
    "arguments": {
      "connection_id": "connection_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_domain_check

Will this domain get its nameservers set for me? · read-only · permission registrars:read · REST equivalent GET /registrars/domain-check

The question the add-a-site form asks while you type: is this domain in one of your connected accounts (or registered with Zinn Digital), so we point it at the site ourselves? Needs the registrars:read permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain (no site needed yet).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_domain_check",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_get

One registrar connection · read-only · permission registrars:read · REST equivalent GET /registrars/connections/{connection_id}

One connection, with the domain names we can see in that registrar account (up to 1,000). Needs the registrars:read permission.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_get",
    "arguments": {
      "connection_id": "connection_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_history

Nameserver update history · read-only · permission registrars:read · REST equivalent GET /registrars/history

Every nameserver change we made (or tried) at your registrars: what the registrar had before (the value to go back to), what we set, the result, and whether the domain registry already shows it. Needs the registrars:read permission.

ArgumentTypeRequiredDescription
site_idintegernoOnly this site.
domainstringnoOnly this domain.
limitintegernoHow many, newest first. Default: 30.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_history",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_list

List registrar connections · read-only · permission registrars:read · REST equivalent GET /registrars/connections

Your connected registrar accounts: status, how many domains we can see in each, and whether automatic nameserver updates are on. The keys are never returned - only a masked hint such as "key …a1b2". Needs the registrars:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_providers

Registrars you can connect · read-only · permission registrars:read · REST equivalent GET /registrars/providers

Every registrar we can set nameservers at, with the steps to create an API key there, the IP addresses to allow (when the registrar needs an allow-list) and the fields to send in secret_credentials when you connect it. Needs the registrars:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_providers",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_refresh

Re-read the domain list · write · permission registrars:write · REST equivalent POST /registrars/connections/{connection_id}/refresh

Reads the domain list of this registrar account again (about a minute). Once every 2 minutes. Needs the registrars:write permission.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_refresh",
    "arguments": {
      "connection_id": "connection_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_site_status

Automatic nameservers for a site · read-only · permission registrars:read · REST equivalent GET /sites/{site_id}/registrar

What the site page says about automatic nameserver updates for this site: whether we set its nameservers for you, through which registrar, what happened last, and the nameservers it needs. Needs the registrars:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_site_status",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_site_update_ns

Set this site's nameservers at the registrar now · write · permission registrars:write · REST equivalent POST /sites/{site_id}/registrar/update-nameservers

The site page's "Update nameservers at my registrar" button: sets the nameservers this site needs at the registrar that holds its domain, now, and returns the history entry. "already" means the registrar already had them - the site goes live as soon as DNS catches up. Needs the registrars:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
connection_idintegernoThe registrar connection to use (optional; by default the one holding the domain).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_site_update_ns",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_test

Test a registrar connection · write · permission registrars:write · REST equivalent POST /registrars/connections/{connection_id}/test

Asks the registrar whether the stored key still works and records the answer on the connection. Needs the registrars:write permission.

ArgumentTypeRequiredDescription
connection_idintegeryesThe connection id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_test",
    "arguments": {
      "connection_id": "connection_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

registrars_update_waiting

Set nameservers for every waiting site now · write · permission registrars:write · REST equivalent POST /registrars/update-waiting

Sets the nameservers now for every site waiting for DNS whose domain is in a connected account (the page's "update all" button). Paced to stay inside the registrars' limits, so large accounts take a few minutes; each change is recorded in the registrar history. Once every 15 minutes. Needs the registrars:write permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "registrars_update_waiting",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Registrar connections. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Site security

For sites on Cloudflare: "I'm Under Attack" mode, the site's own firewall rules and blocking AI crawlers.

security_bots

Change bot protection · write · permission security:write · REST equivalent PUT /sites/{site_id}/security/bots

The same as the two bot switches on the Security tab. The change is saved at once and applied at Cloudflare within a few minutes (status reads "applying", then "active"). Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
settingstring (one of: ai, fight)yes"ai" = block the AI crawlers; "fight" = Cloudflare bot fight mode.
onbooleanyestrue = on, false = off.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_bots",
    "arguments": {
      "site_id": 123,
      "setting": "<setting>",
      "on": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_email_protection

Email address protection on or off · write · permission security:write · REST equivalent PUT /sites/{site_id}/security/email-protection

The CDN hides e-mail addresses on the site's pages from spam bots (on by default): each address becomes a /cdn-cgi/l/email-protection link plus a small script, which SEO crawlers can report as broken links. Switch it off (or on) for this site - the same switch as the Security tab. The choice is kept if the site's DNS zone is re-created or the site moves CDN and back. choice is null while the site uses the default. Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
onbooleanyestrue = on, false = off.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_email_protection",
    "arguments": {
      "site_id": 123,
      "on": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_get

Security settings of a site · read-only · permission security:read · REST equivalent GET /sites/{site_id}/security

The same as the site's Security tab: whether "I'm Under Attack" is on (and when it switches itself off), the site's firewall rules and rate-limiting rules with the Cloudflare plan's limits, bot protection (AI crawlers blocked, bot fight mode), and the fields, operators and actions a new rule may use. 409 for a site that is not on Cloudflare. Needs the security:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_rule_add

Add a firewall rule · write · permission security:write · REST equivalent POST /sites/{site_id}/security/rules

Adds a firewall rule (or a rate-limiting rule) to the site at Cloudflare, within the plan's limit. Returns every rule of the site. Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
ruleobjectyesThe rule, exactly as the tab builds it: {"phase": "http_request_firewall_custom" (default) or "http_ratelimit", "name": "...", "action": one of actions[phase], "enabled": true, and EITHER "builder": {"match": "all""any", "conditions": [{"field": one of fields, "op": one of that field's ops, "value": "..." }]} OR "mode": "advanced" with "expression": a Cloudflare rule expression; a rate-limiting rule also takes "requests_per_period" (per 10 seconds per visitor)}. The same checks as the tab apply.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_rule_add",
    "arguments": {
      "site_id": 123,
      "rule": "<rule>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_rule_delete

Delete a firewall rule · destructive · permission security:write · REST equivalent DELETE /sites/{site_id}/security/rules/{rule_id}

Removes one rule from the site at Cloudflare. Needs the security:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
rule_idstringyesThe rule id (see GET .../security).
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_rule_delete",
    "arguments": {
      "site_id": 123,
      "rule_id": "rule_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_rule_state

Switch a rule on or off, or move it · write · permission security:write · REST equivalent POST /sites/{site_id}/security/rules/{rule_id}/{action}

Rules run in order: the first that matches decides. Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
rule_idstringyesThe rule id (see GET .../security).
actionstring (one of: enable, disable, up, down)yesenable / disable the rule, or move it up / down the order.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_rule_state",
    "arguments": {
      "site_id": 123,
      "rule_id": "rule_id",
      "action": "scan"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_rule_update

Change a firewall rule · write · permission security:write · REST equivalent PUT /sites/{site_id}/security/rules/{rule_id}

Replaces one rule (same shape as when adding it). Only rules made on this dashboard can be changed here. Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
rule_idstringyesThe rule id (see GET .../security).
ruleobjectyesThe rule, exactly as the tab builds it: {"phase": "http_request_firewall_custom" (default) or "http_ratelimit", "name": "...", "action": one of actions[phase], "enabled": true, and EITHER "builder": {"match": "all""any", "conditions": [{"field": one of fields, "op": one of that field's ops, "value": "..." }]} OR "mode": "advanced" with "expression": a Cloudflare rule expression; a rate-limiting rule also takes "requests_per_period" (per 10 seconds per visitor)}. The same checks as the tab apply.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_rule_update",
    "arguments": {
      "site_id": 123,
      "rule_id": "rule_id",
      "rule": "<rule>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

security_under_attack

"I'm Under Attack" on or off · write · permission security:write · REST equivalent PUT /sites/{site_id}/security/under-attack

Every visitor gets a short browser check before the site loads while it is on - use it while the site is being hammered, then switch it off. Needs the security:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
onbooleanyestrue = on, false = off.
auto_offstring (one of: 1h, 6h, 24h, never)noWhen switching on: switch it off again by itself after this long. Default: never.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "security_under_attack",
    "arguments": {
      "site_id": 123,
      "on": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site security. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Wayback restore

Rebuild a website from the public web archive: look a domain up, pick a day, see what would be rebuilt and order it with a restore credit.

wayback_archive

Days the archive holds · read-only · permission wayback:read · REST equivalent GET /wayback/archive/{domain}

The days the public web archive has a copy of the domain's home page on, as the calendar shows. The first look-up of a domain reads the archive in the background: state is "pending" - ask again in a minute until it reads "ready" (or "error", with the reason). Needs the wayback:read permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain, e.g. old-site.com.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "wayback_archive",
    "arguments": {
      "domain": "domain"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Wayback restore. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

wayback_get

One restore · read-only · permission wayback:read · REST equivalent GET /wayback/restores/{restore_id}

One restore: its progress and, while it is "planned" (ready to order), a sample of the pages that would be rebuilt and your existing sites it could be restored into. Needs the wayback:read permission.

ArgumentTypeRequiredDescription
restore_idintegeryesThe restore id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "wayback_get",
    "arguments": {
      "restore_id": "restore_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Wayback restore. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

wayback_order

Order a restore with a restore credit · write · permission wayback:write · REST equivalent POST /wayback/restores/{restore_id}/order

Uses ONE restore credit and starts the rebuild (restore credits are bought in packs on the Wayback page; paying one restore by card through FastSpring, PayPal or crypto is done there too). Restoring into an existing site replaces what it serves. Needs the wayback:write permission.

ArgumentTypeRequiredDescription
restore_idintegeryesThe restore id.
outputstring (one of: static, wordpress)yesStatic HTML or converted to WordPress.
targetstring (one of: new, existing)yes"new" makes a new site (needs a free site slot); "existing" restores into one of your sites of that type (it is overwritten).
new_domainstringnoFor a new site: its domain (default: the old domain).
site_idintegernoFor an existing site: its id.
accept_termsbooleanyesMust be true: you agree to the Terms and Conditions (https://pbn.ltd/terms/), recorded exactly like the box on the order page.
ack_rightsbooleanyesMust be true: you confirm you have the right to republish this content (the trademark / copyright acknowledgement on the order page).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "wayback_order",
    "arguments": {
      "restore_id": "restore_id",
      "output": "<output>",
      "target": "<target>",
      "accept_terms": true,
      "ack_rights": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Wayback restore. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

wayback_start

Start a restore (free) · write · permission wayback:write · REST equivalent POST /wayback/restores

Reads that day's copy from the archive and works out what would be rebuilt. Nothing is charged: the restore waits at "planned" until you order it. Needs the wayback:write permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain to rebuild.
daystringyesA day the archive has a copy of the domain (YYYY-MM-DD).
outputstring (one of: static, wordpress)noStatic HTML, or converted to WordPress (changeable when ordering). Default: static.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "wayback_start",
    "arguments": {
      "domain": "<domain>",
      "day": "<day>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Wayback restore. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

wayback_status

Wayback restore: credits, prices and restores · read-only · permission wayback:read · REST equivalent GET /wayback

Your restore credits, the price of a restore of each kind (what the page would charge, with your VAT), how many new sites your plan still has room for, and your restores, newest first. Needs the wayback:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "wayback_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Wayback restore. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Hourly backups

The hourly backups add-on of a site: its restore points, a backup now, rolling the site back to an hour, and downloading one.

hourly_backups_download_prepare

Prepare a download of a restore point · write · permission backups:read · REST equivalent POST /sites/{site_id}/hourly-backups/{backup_id}/download

Builds a .tar.gz of that restore point (files and database), as the tab's Download button. The site's hourly backups show the download as "ready" when it can be fetched. Kept for 24 hours. Needs the backups:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe restore point id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "hourly_backups_download_prepare",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Hourly backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

hourly_backups_get

Hourly backups of a site · read-only · permission backups:read · REST equivalent GET /sites/{site_id}/hourly-backups

The same as the hourly part of the site's Backups tab: whether hourly backups are on for this site (and paid until when), when the next one runs, every restore point kept, any roll-back in progress and the downloads being prepared. Switching the add-on on is a purchase made in the Backups tab (manage_url); it is never bought over the API. Needs the backups:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "hourly_backups_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Hourly backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

hourly_backups_now

Take an hourly backup now · write · permission backups:write · REST equivalent POST /sites/{site_id}/hourly-backups/now

Takes a restore point now, as the "Back up now" button (once per site every 10 minutes). It appears among the site's hourly backups within a minute or two. Needs the backups:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "hourly_backups_now",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Hourly backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

hourly_backups_restore

Roll the site back to a restore point · destructive · permission backups:write · REST equivalent POST /sites/{site_id}/hourly-backups/{backup_id}/restore

Rolls the site back to exactly how it was at that restore point, as the tab's "Restore this backup" dialog. A backup of how the site looks now is taken first. One roll-back per site at a time; you get an e-mail when it is done. Needs the backups:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
backup_idintegeryesThe restore point id.
whatstring (one of: both, files, db)noFiles and database (default), files only, or database only. Default: both.
confirmbooleanyesMust be true: the site is rolled back to that hour.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "hourly_backups_restore",
    "arguments": {
      "site_id": 123,
      "backup_id": 88001,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Hourly backups. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Mailboxes

Mailboxes on your sites' domains, aliases, forwarders, the catch-all and out-of-office replies. Passwords are never returned.

mail_alias_delete

Remove an alias, forwarder or the catch-all · destructive · permission mail:write · REST equivalent DELETE /sites/{site_id}/mail/aliases

Removes one alias, forwarder or the catch-all. No mailbox or mail is touched. Needs the mail:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
kindstring (one of: alias, forwarder, catchall)yesalias = another address for one of your mailboxes; forwarder = mail passed on to another address; catchall = every address that does not exist.
localstringnoThe name before the @ (not for catchall).
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_alias_delete",
    "arguments": {
      "site_id": 123,
      "kind": "<kind>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_alias_save

Add or change an alias, forwarder or the catch-all · write · permission mail:write · REST equivalent PUT /sites/{site_id}/mail/aliases

Saves one alias, forwarder or the catch-all (the same checks as the Mail tab). Needs the mail:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
kindstring (one of: alias, forwarder, catchall)yesalias = another address for one of your mailboxes; forwarder = mail passed on to another address; catchall = every address that does not exist.
localstringnoThe name before the @ (not for catchall).
destinationsarrayyesWhere the mail goes: one or more addresses.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_alias_save",
    "arguments": {
      "site_id": 123,
      "kind": "<kind>",
      "destinations": "<destinations>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_get

Mail of a site · read-only · permission mail:read · REST equivalent GET /sites/{site_id}/mail

The same as the site's Mail tab: whether PBN.LTD Mail is set up (where = "external" when the domain's mail is at an outside provider), whether its records are published, how many mailboxes the site may have and has, each mailbox with its size and use and out-of-office reply, the aliases, forwarders and catch-all. No password is ever included. Needs the mail:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_mailbox_create

Create a mailbox · write · permission mail:write · REST equivalent POST /sites/{site_id}/mail/mailboxes

Creates a mailbox within what the site may have (402 when an extra mailbox has to be bought first - in the Mail tab). Returns the mail state; the password is never in it. Needs the mail:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
localstringyesThe name before the @, e.g. "info".
passwordstringnoA password of your own (at least 12 characters and strong enough for the mail server). Write-only: never returned.
generatebooleannotrue = we make a strong password; the customer reads it with Show in the Mail tab. It is never returned here. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_mailbox_create",
    "arguments": {
      "site_id": 123,
      "local": "<local>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_mailbox_delete

Delete a mailbox · destructive · permission mail:write · REST equivalent DELETE /sites/{site_id}/mail/mailboxes/{local}

Deletes the mailbox with everything in it. The site's first (included) mailbox can only go once it is the last one. Needs the mail:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
localstringyesThe mailbox name before the @, e.g. "info".
confirmbooleanyesMust be true: the mailbox and every message in it are deleted.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_mailbox_delete",
    "arguments": {
      "site_id": 123,
      "local": "local",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_mailbox_password

Set a new mailbox password · write · permission mail:write · REST equivalent PUT /sites/{site_id}/mail/mailboxes/{local}/password

Sets a new password (yours, or a generated one read with Show in the Mail tab). Every phone and mail program using the mailbox must then be given the new one. The password is never returned. Needs the mail:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
localstringyesThe mailbox name before the @, e.g. "info".
passwordstringnoA password of your own (at least 12 characters and strong enough for the mail server). Write-only: never returned.
generatebooleannotrue = we make a strong password; the customer reads it with Show in the Mail tab. It is never returned here. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_mailbox_password",
    "arguments": {
      "site_id": 123,
      "local": "local"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_out_of_office

Out-of-office reply on or off · write · permission mail:write · REST equivalent PUT /sites/{site_id}/mail/mailboxes/{local}/out-of-office

The same as the out-of-office form on the Mail tab. Needs the mail:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
localstringyesThe mailbox name before the @, e.g. "info".
enabledbooleanyesOn or off.
subjectstringnoThe reply's subject.
bodystringnoThe reply's text.
starts_atstringnoOptional start (YYYY-MM-DD or an ISO date-time).
ends_atstringnoOptional end (YYYY-MM-DD or an ISO date-time).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_out_of_office",
    "arguments": {
      "site_id": 123,
      "local": "local",
      "enabled": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mail_setup

Set mail up for a site · write · permission mail:write · REST equivalent POST /sites/{site_id}/mail/set-up

The Mail tab's "Set up mail": makes the site's mail account and its signing keys and publishes its records where we answer DNS for the domain. Needs the mail:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mail_setup",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Mailboxes. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Rank tracking

Where do your keywords rank in Google? Track any domain - hosted with us or not - in any country, language and device, with the full position history.

rank_domain

One tracked domain with its keywords · read-only · permission rank:read · REST equivalent GET /rank/domains/{domain_id}

The domain, each Google version it is tracked in (country, language, device), and every keyword in each with its current position (null = not in the first 100 results). Needs the rank:read permission.

ArgumentTypeRequiredDescription
domain_idintegeryesThe tracked domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_domain",
    "arguments": {
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_domain_add

Track a domain · write · permission rank:write · REST equivalent POST /rank/domains

Starts tracking a domain (hosted with us or anywhere else). Then add a Google version and keywords. Adding a domain you track already returns it. Needs the rank:write permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain, e.g. example.com (a URL or www. is accepted).
labelstringnoAn optional label of your own.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_domain_add",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_domain_remove

Stop tracking a domain · destructive · permission rank:write · REST equivalent DELETE /rank/domains/{domain_id}

Stops tracking the domain and all its keywords. The history is kept, but re-adding the domain does not restart its keywords - they have to be added again. Needs "confirm": true. Needs the rank:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
domain_idintegeryesThe tracked domain id.
confirmbooleanyesMust be true: this cannot be undone from the API.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_domain_remove",
    "arguments": {
      "domain_id": "domain_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_domains

List tracked domains · read-only · permission rank:read · REST equivalent GET /rank/domains

Every domain you track, with its keyword count, average position and how many keywords are in the top 10 and top 3. Needs the rank:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_domains",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_group_add

Add a Google version to a domain · write · permission rank:write · REST equivalent POST /rank/domains/{domain_id}/groups

Which Google to check the keywords in: country or city, language and device. Your plan sets how many per domain. Adding one that exists returns it. Needs the rank:write permission.

ArgumentTypeRequiredDescription
domain_idintegeryesThe tracked domain id.
location_codeintegeryesA rank-tracking location code (2826 = United Kingdom, 2840 = United States).
language_codestringyesA rank-tracking language code.
devicestring (one of: desktop, mobile)yesDesktop or mobile results.
namestringnoAn optional name of your own.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_group_add",
    "arguments": {
      "domain_id": "domain_id",
      "location_code": 1,
      "language_code": "<language_code>",
      "device": "<device>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_keyword

One keyword and its position history · read-only · permission rank:read · REST equivalent GET /rank/keywords/{keyword_id}

The keyword and every completed check in the period: the position (null = not in the first 100 results) and the page of yours that ranked. Needs the rank:read permission.

ArgumentTypeRequiredDescription
keyword_idintegeryesThe keyword id.
daysintegernoHow many days of history (1-400). Default: 90.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_keyword",
    "arguments": {
      "keyword_id": "keyword_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_keyword_check

Check a keyword now · write · permission rank:write · REST equivalent POST /rank/keywords/{keyword_id}/check

Asks for an extra check of this keyword now (results usually within the hour). The same bounds as the button: once per keyword in 24 hours, a daily number per account, the month's check budget (past it the check goes in the standard queue; once the month's extra checks are used up it is refused until the 1st), and not while checks are paused. Scheduled checks carry on regardless. Needs the rank:write permission.

ArgumentTypeRequiredDescription
keyword_idintegeryesThe keyword id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_keyword_check",
    "arguments": {
      "keyword_id": "keyword_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_keyword_remove

Remove a keyword · destructive · permission rank:write · REST equivalent DELETE /rank/keywords/{keyword_id}

Removes the keyword AND its position history (the same as the Remove button). Needs "confirm": true. Needs the rank:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
keyword_idintegeryesThe keyword id.
confirmbooleanyesMust be true: this cannot be undone from the API.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_keyword_remove",
    "arguments": {
      "keyword_id": "keyword_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_keywords_add

Add keywords · write · permission rank:write · REST equivalent POST /rank/groups/{group_id}/keywords

Adds keywords to a Google version with the panel's own rule: what fits inside your plan is added, the rest is listed in not_added (add a keyword pack or move up a plan). The first check runs within the hour. Keywords you track already are skipped. Needs the rank:write permission.

ArgumentTypeRequiredDescription
group_idintegeryesThe Google version (keyword group) id of the domain.
keywordsarrayyesThe keywords (or one string, one per line or comma separated).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_keywords_add",
    "arguments": {
      "group_id": "group_id",
      "keywords": "<keywords>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_languages

Search languages · read-only · permission rank:read · REST equivalent GET /rank/languages

The language codes to use for a Google version. Needs the rank:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_languages",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_locations

Find a Google location · read-only · permission rank:read · REST equivalent GET /rank/locations

The location codes to use for a Google version. Up to 40 matches. Needs the rank:read permission.

ArgumentTypeRequiredDescription
qstringnoPart of a country, region or city name. Empty = the countries.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_locations",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_plans

Rank tracking plans and prices · read-only · permission rank:read · REST equivalent GET /rank/plans

The plans (keywords, Google versions per domain, cadence), the extra-keyword pack and the extra Google versions pack with their live prices (US dollars a month, before VAT). Buying happens on plans_url in the browser - the payment needs your own approval at the payment provider and the Terms tick, so the API never charges. Needs the rank:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_plans",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

rank_status

Rank tracking: plan and usage · read-only · permission rank:read · REST equivalent GET /rank

Whether rank tracking is on this account, the plan, how many keywords it covers and how many are tracked, how often they are checked (weekly or daily), the Google versions allowed per domain, the number of tracked domains and where the month's check budget stands (ok: daily plans checked daily and fast extra checks; budget: checked weekly and extra checks in the standard queue; limit: "Check now" paused until resets_on, weekly checks carry on). When it is not on the account, plans_url is the page to buy it. Needs the rank:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "rank_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Rank tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

AI visibility

Do AI assistants (ChatGPT, Google AI answers and others) name your brand when people ask the questions you care about? Track prompts, answers and competitors.

aivis_brand

One brand: prompts, latest answers, competitors, trend · read-only · permission aivis:read · REST equivalent GET /ai-visibility/brands/{brand_id}

The brand, every prompt with the latest answer from each AI engine, the domains cited instead of you, the daily visibility trend and starter prompts you could add. Needs the aivis:read permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
daysintegernoDays of daily visibility trend (1-400). Default: 90.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_brand",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_brand_add

Track a brand · write · permission aivis:write · REST equivalent POST /ai-visibility/brands

Starts tracking a brand (any domain, hosted with us or not). Then add prompts. Adding one you track already returns it. Needs the aivis:write permission.

ArgumentTypeRequiredDescription
domainstringyesThe brand's domain, e.g. example.com.
brand_namestringnoThe name people use for it (optional).
location_codeintegernoCountry the answers should be for (a rank-tracking location code; default United States).
language_codestringnoLanguage of the answers (default English).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_brand_add",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_brand_remove

Stop tracking a brand · destructive · permission aivis:write · REST equivalent DELETE /ai-visibility/brands/{brand_id}

Stops tracking the brand and all its prompts. The history is kept, but re-adding the brand does not restart its prompts. Needs "confirm": true. Needs the aivis:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
confirmbooleanyesMust be true: this cannot be undone from the API.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_brand_remove",
    "arguments": {
      "brand_id": "brand_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_brand_update

Change a brand's name or market · write · permission aivis:write · REST equivalent PATCH /ai-visibility/brands/{brand_id}

The next round of answers uses the new settings. Needs the aivis:write permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
brand_namestringnoThe name people use for it.
location_codeintegernoCountry of the answers.
language_codestringnoLanguage of the answers.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_brand_update",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_brands

List tracked brands · read-only · permission aivis:read · REST equivalent GET /ai-visibility/brands

Every brand (domain) you track, with its visibility numbers. Needs the aivis:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_brands",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_plans

AI visibility plans and engines · read-only · permission aivis:read · REST equivalent GET /ai-visibility/plans

The plans and the extra-prompt pack with their live prices (US dollars a month, before VAT), and the AI engines a prompt can be asked of (their keys are what engines takes). Buying happens on plans_url in the browser - the API never charges. Needs the aivis:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_plans",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_prompt

One prompt and the AI engines' answers · read-only · permission aivis:read · REST equivalent GET /ai-visibility/prompts/{prompt_id}

What each AI engine answered last time (the full answer text, as on the prompt page) and the last 30 results. Needs the aivis:read permission.

ArgumentTypeRequiredDescription
prompt_idintegeryesThe prompt id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_prompt",
    "arguments": {
      "prompt_id": "prompt_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_prompt_check

Ask the AI engines again · write · permission aivis:write · REST equivalent POST /ai-visibility/prompts/{prompt_id}/check

Asks the prompt's AI engines again now (answers usually within the hour). The same bounds as the button: once per prompt in 24 hours and a daily number per account, and not while checks are paused. Needs the aivis:write permission.

ArgumentTypeRequiredDescription
prompt_idintegeryesThe prompt id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_prompt_check",
    "arguments": {
      "prompt_id": "prompt_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_prompt_engines

Choose the AI engines for a prompt · write · permission aivis:write · REST equivalent PATCH /ai-visibility/prompts/{prompt_id}

Sets which AI engines the next round asks for this prompt. Needs the aivis:write permission.

ArgumentTypeRequiredDescription
prompt_idintegeryesThe prompt id.
enginesarrayyesAI engine keys, as the AI visibility plans list them. Keys not on sale are ignored; none left means the default set.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_prompt_engines",
    "arguments": {
      "prompt_id": "prompt_id",
      "engines": "<engines>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_prompt_remove

Remove a prompt · destructive · permission aivis:write · REST equivalent DELETE /ai-visibility/prompts/{prompt_id}

Removes the prompt AND its answers history (the same as the Remove button). Needs "confirm": true. Needs the aivis:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
prompt_idintegeryesThe prompt id.
confirmbooleanyesMust be true: this cannot be undone from the API.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_prompt_remove",
    "arguments": {
      "prompt_id": "prompt_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_prompts_add

Add prompts · write · permission aivis:write · REST equivalent POST /ai-visibility/brands/{brand_id}/prompts

Adds prompts with the panel's own rule: what fits inside your plan is added, the rest is listed in not_added (add a prompt pack or move up a plan). The first answers usually arrive within the hour. Needs the aivis:write permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
promptsarrayyesWhole questions, the way somebody would ask them (or one string, one per line). 6-400 characters each.
enginesarraynoAI engine keys, as the AI visibility plans list them; absent means the default set. Keys that are not on sale are ignored.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_prompts_add",
    "arguments": {
      "brand_id": "brand_id",
      "prompts": "<prompts>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

aivis_status

AI visibility: plan and usage · read-only · permission aivis:read · REST equivalent GET /ai-visibility

Whether AI visibility is on this account, the plan, how many prompts it covers and how many are tracked, how often they are asked, the number of tracked brands and your average visibility (% of answers that named you). When it is not on the account, plans_url is the page to buy it. Needs the aivis:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "aivis_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in AI visibility. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Index checker

Is each page in Google? Track any URL - on your sites or any other - and read its history.

index_add

Track pages · write · permission index:write · REST equivalent POST /index-checker/urls

Adds pages with the panel's own rules: a page that would pass the plan's URL limit or its checks a month is not added (see not_added). The first check runs within a few minutes. Needs the index:write permission.

ArgumentTypeRequiredDescription
urlsarrayyesPage addresses (up to 5,000). Any site, hosted with us or not.
frequencystring (one of: daily, weekly, monthly)noHow often the page is checked. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_add",
    "arguments": {
      "urls": "<urls>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_check

Check a page now · write · permission index:write · REST equivalent POST /index-checker/urls/{url_id}/check

Checks the page immediately (usually 1-2 seconds). Uses one check of the monthly allowance; at most once an hour per page and a daily number per account. Needs the index:write permission.

ArgumentTypeRequiredDescription
url_idintegeryesThe tracked page id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_check",
    "arguments": {
      "url_id": "url_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_delete

Stop tracking a page · destructive · permission index:write · REST equivalent DELETE /index-checker/urls/{url_id}

Stops tracking. Its history is kept and comes back if you add the page again. Needs the index:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
url_idintegeryesThe tracked page id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_delete",
    "arguments": {
      "url_id": "url_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_get

One tracked page and its history · read-only · permission index:read · REST equivalent GET /index-checker/urls/{url_id}

The page and up to 100 of its most recent checks. Needs the index:read permission.

ArgumentTypeRequiredDescription
url_idintegeryesThe tracked page id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_get",
    "arguments": {
      "url_id": "url_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_list

List tracked pages · read-only · permission index:read · REST equivalent GET /index-checker/urls

Every page you track, newest first, with its current status. Needs the index:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
statusstring (one of: indexed, not_indexed, pending)noOnly pages in this state.
hoststringnoOnly pages on this domain (www. ignored).
searchstringnoPart of the address.
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_status

Index checker: plan and usage · read-only · permission index:read · REST equivalent GET /index-checker

The plan, how many pages may be tracked, checks a month included and used, the checks your chosen frequencies plan for, and how many tracked pages are indexed. Needs the index:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

index_update

Change how often a page is checked · write · permission index:write · REST equivalent PATCH /index-checker/urls/{url_id}

Refused when the new frequency would pass the plan's checks a month. Needs the index:write permission.

ArgumentTypeRequiredDescription
url_idintegeryesThe tracked page id.
frequencystring (one of: daily, weekly, monthly)noHow often the page is checked. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "index_update",
    "arguments": {
      "url_id": "url_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Index checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Redis

The Redis object cache add-on: whether it is on, and switching it on or off per site.

redis_site

Redis on one site · read-only · permission redis:read · REST equivalent GET /sites/{site_id}/redis

Whether Redis is on for this site: "queued" while a switch is being applied (up to a minute), then "on" or "off"; "error" with the reason in detail. Needs the redis:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "redis_site",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Redis. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

redis_status

Redis: the add-on and your sites · read-only · permission redis:read · REST equivalent GET /redis

Whether Redis is on for the account (plan, memory per server, paid until) and its state on each of your sites. Buying, renewing and cancelling are done on the Redis page (page_url). Needs the redis:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "redis_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Redis. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

redis_switch

Switch Redis on or off for a site · write · permission redis:write · REST equivalent PUT /sites/{site_id}/redis

The same as the site's Redis switch. WordPress sites get the object cache installed and configured for them (and removed again when switched off, the site works exactly as before); other site types get the connection settings on the Redis page. Needs Redis on the account (402 otherwise - it is bought on the Redis page). Needs the redis:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
onbooleanyestrue = on, false = off.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "redis_switch",
    "arguments": {
      "site_id": 123,
      "on": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Redis. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Website firewall

The firewall in front of every site: whether it is on, and what it recently blocked.

firewall_get

Website firewall of a site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/firewall

The same as the site's "Website firewall" tab: whether the firewall is on for this site, and the requests it recently refused (when, what was asked for, why, and the reference number the visitor was shown). Signing in, editing, uploads, plugin installs, the database tool and the file manager are never blocked. If something ordinary was blocked, open a ticket with its reference number. Switching the firewall off for a site is done by support. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
limitintegernoHow many recent blocks to return (newest first). Default: 25.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "firewall_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website firewall. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

SEO tools

The SEO tools suite: every tool, your subscription, and prices with the bundle and yearly discounts.

seo_quote

Price a selection of SEO tools · read-only · permission seo:read · REST equivalent POST /seo/quote

The exact price the checkout would charge for a NEW order of these tools (before any existing subscription is taken into account), VAT for your account included. Nothing is stored. Needs the seo:read permission.

ArgumentTypeRequiredDescription
toolsarrayyes[{"tool": "rank", "plan": "pro", "packs": 0, "extras": 0}, ...] - SEO tool keys; "extras" = the tool's second pack (its extra_pack).
monthsintegerno1, 3, 6 or 12. Default: 1.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "seo_quote",
    "arguments": {
      "tools": "<tools>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

seo_subscription

Your SEO tools subscription · read-only · permission seo:read · REST equivalent GET /seo/subscription

What your SEO tools order covers today (tools, plans, period, discounts) and the next period if it is already paid. Tools bought on their own (not through the SEO checkout) are not in this order. Needs the seo:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "seo_subscription",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

seo_tools

List the SEO tools · read-only · permission seo:read · REST equivalent GET /seo/tools

Every SEO tool, whether it needs hosting, whether your account has it, its plans and pack (prices per month before VAT, from the live price rows), and the current bundle and yearly discounts. Needs the seo:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "seo_tools",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in SEO tools. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Keyword research + domain overview

Keyword ideas with volume, CPC, competition and difficulty; any domain's ranked keywords, traffic, top pages, competitors and keyword gaps.

research_domain

Domain overview report · write · permission research:run · REST equivalent POST /domain-overview

Ranked keywords (top 100 by traffic), estimated monthly traffic, position spread, top pages and competitors. Uses 1 credit - or none if this account asked in the last 14 days. Needs the research:run permission.

ArgumentTypeRequiredDescription
domainstringyesAny domain, like example.com.
location_codeintegernoA research market country code (2840 = United States). Default: 2840.
language_codestringnoA research market language code (default: the country's main language).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_domain",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_gap

Keyword gap vs competitors · write · permission research:run · REST equivalent POST /domain-overview/gap

Keywords the competitors rank for and your domain does not, most-shared first. One credit per competitor not asked in the last 14 days. Needs the research:run permission.

ArgumentTypeRequiredDescription
domainstringyesYour domain.
competitorsarrayyes1 to 3 competitor domains.
location_codeintegernoA research market country code (2840 = United States). Default: 2840.
language_codestringnoA research market language code (default: the country's main language).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_gap",
    "arguments": {
      "domain": "<domain>",
      "competitors": "<competitors>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_keywords

Research a keyword · write · permission research:run · REST equivalent POST /keyword-research

Up to 100 keywords, by search volume. Uses 1 credit - or none if this account asked the same question in the last 30 days. Needs the research:run permission.

ArgumentTypeRequiredDescription
keywordstringyesThe seed keyword (up to 80 characters), or for kind=site a site or page address (up to 255 characters).
kindstring (one of: matching, related, questions, ideas, site)nomatching = longer terms containing the keyword; related = what people also search; questions = question searches; ideas = broader ideas from the same topic; site = the searches a whole site or one page (its full address) is found for. Default: matching.
location_codeintegernoA research market country code (2840 = United States). Default: 2840.
language_codestringnoA research market language code (default: the country's main language).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_keywords",
    "arguments": {
      "keyword": "<keyword>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_list

One keyword list · read-only · permission research:read · REST equivalent GET /keyword-research/lists/{list_id}

The keywords in one of your lists, with their saved metrics. Needs the research:read permission.

ArgumentTypeRequiredDescription
list_idintegeryesThe list id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_list",
    "arguments": {
      "list_id": "list_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_lists

Saved keyword lists · read-only · permission research:read · REST equivalent GET /keyword-research/lists

Your saved keyword lists. Needs the research:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_lists",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_local

Keyword search volume in a region or city · write · permission research:run · REST equivalent POST /keyword-research/local-volumes

Monthly searches for each keyword in that area. Uses 4 credits (or none if asked before). Needs the research:run permission.

ArgumentTypeRequiredDescription
keywordsarrayyesUp to 1,000 keywords.
location_codeintegeryesA research market country code (2840 = United States).
language_codestringnoA research market language code (default: the country's main language). Default: en.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_local",
    "arguments": {
      "keywords": "<keywords>",
      "location_code": 1
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_markets

Countries and languages covered · read-only · permission research:read · REST equivalent GET /research/markets

The countries (location_code) and languages (language_code) keyword research and domain overview answer for. Free. Needs the research:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_markets",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

research_status

Research: plans and credits used · read-only · permission research:read · REST equivalent GET /research

For keyword research and domain overview: whether it is on the account, the plan, credits a month and credits used this month. Needs the research:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "research_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Keyword research + domain overview. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Domain vetting

Check a domain before you buy it, and get told when a new aged domain matches a search you saved.

alerts_create

Save a domain search · write · permission vetting:write · REST equivalent POST /domain-alerts

Domains matching it today are the starting point, not news: from now on you get an e-mail when a NEW one matches. Needs the vetting:write permission.

ArgumentTypeRequiredDescription
namestringnoWhat to call it (we name it after the filters if empty).
filtersstringnoThe aged-domain list's own filter, as a query string, e.g. "tld=.com&dr_min=30&price_max=300".
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "alerts_create",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

alerts_delete

Delete a saved search · destructive · permission vetting:write · REST equivalent DELETE /domain-alerts/{alert_id}

Deletes the saved search and stops its e-mails. What it already told you about is forgotten with it. Needs the vetting:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
alert_idintegeryesThe saved search id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "alerts_delete",
    "arguments": {
      "alert_id": "alert_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

alerts_list

List your saved domain searches · read-only · permission vetting:read · REST equivalent GET /domain-alerts

Every aged-domain search you saved, what it looks for and how many domains match it now. Needs the vetting:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "alerts_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

alerts_matches

The domains a saved search matches now · read-only · permission vetting:read · REST equivalent GET /domain-alerts/{alert_id}/matches

The aged domains this saved search matches at this moment, with the price you would pay and a link to each listing. Needs the vetting:read permission.

ArgumentTypeRequiredDescription
alert_idintegeryesThe saved search id.
limitintegernoHow many to return. Default: 50.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "alerts_matches",
    "arguments": {
      "alert_id": "alert_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

vetting_get

One vetting report · read-only · permission vetting:read · REST equivalent GET /domain-vetting/reports/{report_id}

The whole report: the verdict, every reason, the key numbers, the anchor texts, the link and traffic history and what the site was in the web archive. Needs the vetting:read permission.

ArgumentTypeRequiredDescription
report_idintegeryesThe report id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "vetting_get",
    "arguments": {
      "report_id": "report_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

vetting_list

List your vetting reports · read-only · permission vetting:read · REST equivalent GET /domain-vetting/reports

Every vetting report this account has run, newest first, with its verdict and score. Needs the vetting:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
verdictstring (one of: clean, care, risk)noOnly reports with this verdict.
searchstringnoPart of the domain name.
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "vetting_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

vetting_run

Vet a domain · write · permission vetting:write · REST equivalent POST /domain-vetting/reports

Runs a full report and returns it. Spends one report credit, unless you already vetted this domain recently - then the report you already have comes back and nothing is charged. Needs the vetting:write permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain to vet, e.g. example.com.
location_codeintegernoThe market its search data is read for (2840 = United States). Default: 2840.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "vetting_run",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

vetting_status

Domain vetting: credits and usage · read-only · permission vetting:read · REST equivalent GET /domain-vetting

How many report credits this account holds, how many reports it has run, and the prices. Needs the vetting:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "vetting_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Domain vetting. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Footprint checker

What publicly joins your sites together - shared addresses, nameservers, tracking codes, themes, icons, footers, links, mail records and certificate history - with a fix for each.

footprint_check

Run a check now · write · permission footprint:write · REST equivalent POST /footprint/check

Queues a check. Results are usually ready within a few minutes, in the footprint report it returns. Uses one of your monthly "Check now" runs; the automatic checks never count against that. Needs the footprint:write permission.

ArgumentTypeRequiredDescription
scopestring (one of: site, group, account, custom)noWhat to check: one site, a site group, the whole account, or a selection of domains you own. Default: account.
scope_idintegernoThe site id or site group id, for those scopes.
domainsarraynoFor scope=custom: domains on your account.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_check",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_get

One report and its findings · read-only · permission footprint:read · REST equivalent GET /footprint/reports/{run_id}

The report with every finding: what it is, what it means, which of your sites it affects and how to fix it. A finding marked owner: platform is one we are handling for you - there is nothing for you to do about it. Needs the footprint:read permission.

ArgumentTypeRequiredDescription
run_idintegeryesThe report id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_get",
    "arguments": {
      "run_id": 7782
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_runs

List footprint reports · read-only · permission footprint:read · REST equivalent GET /footprint/reports

Every finished report, newest first. Needs the footprint:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoItems per page. Default: 25.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_runs",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_site_add

Include a site hosted elsewhere · write · permission footprint:write · REST equivalent POST /footprint/external-sites

Adds a site hosted elsewhere. If you have no slots left this answers 422 naming the pack that would cover it - nothing is bought automatically. Needs the footprint:write permission.

ArgumentTypeRequiredDescription
domainstringyese.g. example.com
groupstringnoYour own grouping for it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_site_add",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_site_remove

Stop including a site hosted elsewhere · destructive · permission footprint:write · REST equivalent DELETE /footprint/external-sites/{site_id}

Removes it and frees its slot straight away. Needs the footprint:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe id from /footprint/external-sites.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_site_remove",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_sites

Sites you host elsewhere · read-only · permission footprint:read · REST equivalent GET /footprint/external-sites

The sites hosted elsewhere that are included in your checks. Sites hosted with us are always included and never use a slot. Needs the footprint:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_sites",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

footprint_status

Footprint checker: plan, usage and latest score · read-only · permission footprint:read · REST equivalent GET /footprint

Your plan, how often checks run, how many external sites you may hold and how many you are using, and the score from the most recent check. Needs the footprint:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "footprint_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Footprint checker. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Site audit

Crawl a site you own and find what is holding it back, with a fix for each finding. Richer for sites hosted with us.

audit_get

One audit and its findings · read-only · permission audit:read · REST equivalent GET /site-audit/audits/{audit_id}

The audit with every finding: what it is, what it means, which pages it affects and how to fix it. A finding with source: server comes from your hosting with us rather than from the crawl. Needs the audit:read permission.

ArgumentTypeRequiredDescription
audit_idintegeryesThe audit id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_get",
    "arguments": {
      "audit_id": "audit_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_list

List audits · read-only · permission audit:read · REST equivalent GET /site-audit/audits

Your finished audits, newest first. Needs the audit:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
hoststringnoOnly audits of this site.
limitintegernoDefault: 25.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_pages

The pages an audit fetched · read-only · permission audit:read · REST equivalent GET /site-audit/audits/{audit_id}/pages

Every page the crawl fetched, with what was measured on it. Needs the audit:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
audit_idintegeryesThe audit id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_pages",
    "arguments": {
      "audit_id": "audit_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_start

Audit a site · write · permission audit:write · REST equivalent POST /site-audit/audits

Queues an audit; results are usually ready within a few minutes, in the audit it returns. A site whose ownership you have not proved is crawled shallowly (see pages in the response); verifying it unlocks a full crawl. Needs the audit:write permission.

ArgumentTypeRequiredDescription
urlstringyesThe site to audit, e.g. https://example.com/
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_start",
    "arguments": {
      "url": "<url>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_status

Site audit: plan and usage · read-only · permission audit:read · REST equivalent GET /site-audit

Your plan, audits a month included and used, the page cap per audit, and your most recent audit. Needs the audit:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_verification

How to prove a site is yours · read-only · permission audit:read · REST equivalent GET /site-audit/verification

The three ways to prove a site is yours. Any one of them is enough, and a site hosted with us needs none. Needs the audit:read permission.

ArgumentTypeRequiredDescription
hoststringyese.g. example.com
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_verification",
    "arguments": {
      "host": "<host>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

audit_verify

Check the proof now · write · permission audit:write · REST equivalent POST /site-audit/verification

Looks for the DNS record, the meta tag and the file, in that order. Needs the audit:write permission.

ArgumentTypeRequiredDescription
hoststringyese.g. example.com
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "audit_verify",
    "arguments": {
      "host": "<host>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Site audit. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Are the links you built still there? Watch individual links and whole backlink profiles.

Watch a backlink profile · write · permission backlinks:write · REST equivalent POST /backlinks/domains

Refused when it would pass the plan's domain limit, or when the chosen cadence would plan more refreshes a month than the plan includes. Needs the backlinks:write permission.

ArgumentTypeRequiredDescription
domainstringyesAny domain.
cadencestring (one of: weekly, monthly, manual)noHow often the backlink profile is refreshed. A weekly domain uses about 4.3 refreshes a month, monthly 1; "manual" only when you ask. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_add_domain",
    "arguments": {
      "domain": "<domain>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Watch links · write · permission backlinks:write · REST equivalent POST /backlinks/links

Adds links with the panel's own rules: anything past the plan's link limit is not added (see not_added). Checking a link costs nothing - we fetch the page ourselves. Needs the backlinks:write permission.

ArgumentTypeRequiredDescription
linksarrayyesUp to 2,000 objects: {"source_url": "...", "target_url": "...", "anchor": "optional expected anchor text"}.
frequencystring (one of: daily, weekly, monthly)noHow often the link is checked. Checking links is included in every plan. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_add_links",
    "arguments": {
      "links": "<links>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Check a link now · write · permission backlinks:write · REST equivalent POST /backlinks/links/{link_id}/check

Fetches the page immediately and re-reads the link. Costs nothing and uses no allowance; at most once every 10 minutes per link. Needs the backlinks:write permission.

ArgumentTypeRequiredDescription
link_idintegeryesThe watched link id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_check_link",
    "arguments": {
      "link_id": "link_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Stop watching a backlink profile · destructive · permission backlinks:write · REST equivalent DELETE /backlinks/domains/{domain_id}

Stops watching the profile: no more scheduled refreshes, and it no longer counts towards your plan. Nothing is charged. Needs the backlinks:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
domain_idintegeryesThe watched domain id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_delete_domain",
    "arguments": {
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Stop watching a link · destructive · permission backlinks:write · REST equivalent DELETE /backlinks/links/{link_id}

Stops watching. Its history is kept and comes back if you add the link again. Needs the backlinks:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
link_idintegeryesThe watched link id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_delete_link",
    "arguments": {
      "link_id": "link_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

One backlink profile · read-only · permission backlinks:read · REST equivalent GET /backlinks/domains/{domain_id}

The profile with its top referring domains, anchors, linked pages and monthly history. Reads what is stored - it never spends a refresh. Needs the backlinks:read permission.

ArgumentTypeRequiredDescription
domain_idintegeryesThe watched domain id.
showstring (one of: live, new, lost)noWhich referring domains to return. Default: live.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_domain",
    "arguments": {
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

List watched backlink profiles · read-only · permission backlinks:read · REST equivalent GET /backlinks/domains

Every domain whose backlink profile you watch, most recently added first, with its latest totals (backlinks, referring domains, referring domains won and lost in the last 30 days) and when it was last refreshed. Reads what is stored - it never spends a refresh. Needs the backlinks:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_domains",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

One watched link and its history · read-only · permission backlinks:read · REST equivalent GET /backlinks/links/{link_id}

The link and up to 100 of its most recent checks. Needs the backlinks:read permission.

ArgumentTypeRequiredDescription
link_idintegeryesThe watched link id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_link",
    "arguments": {
      "link_id": "link_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

List watched links · read-only · permission backlinks:read · REST equivalent GET /backlinks/links

Every link you watch, problems first. Needs the backlinks:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
statusstring (one of: live, lost, changed, pending, error, problem)noOnly links in this state. "problem" means gone or changed.
hoststringnoOnly links from or to this domain (www. ignored).
searchstringnoPart of an address or an anchor.
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_links",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Refresh a backlink profile now · write · permission backlinks:write · REST equivalent POST /backlinks/domains/{domain_id}/refresh

Uses one profile refresh of the monthly allowance, unless a recent shared snapshot of that domain can be reused, in which case it costs nothing. At most once a day per domain. Needs the backlinks:write permission.

ArgumentTypeRequiredDescription
domain_idintegeryesThe watched domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_refresh_domain",
    "arguments": {
      "domain_id": "domain_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Backlink monitor: plan and usage · read-only · permission backlinks:read · REST equivalent GET /backlinks

The plan, how many links and profiles may be watched, profile refreshes a month included and used, the refreshes your chosen cadences plan for, and how many watched links are live, gone or changed. Needs the backlinks:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Change how often a link is checked · write · permission backlinks:write · REST equivalent PATCH /backlinks/links/{link_id}

Sets how often this one link is re-checked (daily, weekly or monthly) and schedules its next check to match. The answer is the link with its new frequency. Needs the backlinks:write permission.

ArgumentTypeRequiredDescription
link_idintegeryesThe watched link id.
frequencystring (one of: daily, weekly, monthly)noHow often the link is checked. Checking links is included in every plan. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "backlinks_update_link",
    "arguments": {
      "link_id": "link_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Backlink monitor. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Brand mentions

Where your brand, domain or product is talked about on the web, and whether the tone is positive or negative.

mentions_add

Listen for a brand · write · permission mentions:write · REST equivalent POST /brand-mentions/brands

Refused when it would pass the plan's brand limit, or when the chosen schedule would plan more checks a month than the plan includes. Needs the mentions:write permission.

ArgumentTypeRequiredDescription
phrasestringyesA brand, domain, product or person to listen for.
frequencystring (one of: daily, weekly, monthly)noHow often we listen. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_add",
    "arguments": {
      "phrase": "<phrase>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_brand

One brand and its mentions · read-only · permission mentions:read · REST equivalent GET /brand-mentions/brands/{brand_id}

Reads what is stored - it never spends a check. Needs the mentions:read permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
tonestring (one of: positive, neutral, negative)noOnly mentions with this tone.
limitintegernoHow many mentions to return. Default: 100.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_brand",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_brands

List brands tracked for mentions · read-only · permission mentions:read · REST equivalent GET /brand-mentions/brands

Every brand phrase you track, most recently added first, with its mention counts by sentiment, visibility and when it was last checked. Reads what is stored - it never runs a check. Needs the mentions:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_brands",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_check

Check a brand now · write · permission mentions:write · REST equivalent POST /brand-mentions/brands/{brand_id}/check

Uses one check of the monthly allowance, unless a recent shared snapshot of that phrase can be reused, in which case it costs nothing. At most once a day per brand. Needs the mentions:write permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_check",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_delete

Stop listening for a brand · destructive · permission mentions:write · REST equivalent DELETE /brand-mentions/brands/{brand_id}

Stops listening. Everything already found is kept. Needs the mentions:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_delete",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_list

Every mention across all your brands · read-only · permission mentions:read · REST equivalent GET /brand-mentions/mentions

Newest first. Needs the mentions:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
tonestring (one of: positive, neutral, negative)noOnly mentions with this tone.
brand_idintegernoOnly mentions of this brand.
searchstringnoPart of a title, domain or snippet.
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_status

Brand mentions: plan and usage · read-only · permission mentions:read · REST equivalent GET /brand-mentions

The plan, how many phrases may be tracked, checks a month included and used, the checks your chosen schedules plan for, and the overall sentiment split. Needs the mentions:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mentions_update

Change how often we listen · write · permission mentions:write · REST equivalent PATCH /brand-mentions/brands/{brand_id}

Sets how often we search for new mentions of this phrase. Refused with validation_failed when the new pace would plan more checks a month than your plan includes. The next check is scheduled from now at the new pace. Needs the mentions:write permission.

ArgumentTypeRequiredDescription
brand_idintegeryesThe tracked brand id.
frequencystring (one of: daily, weekly, monthly)noHow often we listen. Daily uses ~30 checks a month, weekly ~4.3, monthly 1. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mentions_update",
    "arguments": {
      "brand_id": "brand_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Brand mentions. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Local rankings

Where a business sits in Google's map results and local results, town by town.

local_add_keywords

Track more local keywords · write · permission local:write · REST equivalent POST /local-rankings/keywords

Adds keywords to one of your towns. Refused before anything is spent if the month would not fit inside your plan. Needs the local:write permission.

ArgumentTypeRequiredDescription
town_idintegeryesThe id of one of your towns.
keywordsarrayyesThe keywords to track there.
frequencystring (one of: daily, weekly, monthly)noHow often to check them. Lowered silently if your plan checks less often. Default: weekly.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_add_keywords",
    "arguments": {
      "town_id": 1,
      "keywords": "<keywords>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_business

One business · read-only · permission local:read · REST equivalent GET /local-rankings/businesses/{business_id}

One business: its profile facts, the towns it is searched from, and every change we have seen to its listing. Needs the local:read permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe business id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_business",
    "arguments": {
      "business_id": "business_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_businesses

List your businesses · read-only · permission local:read · REST equivalent GET /local-rankings/businesses

Every business you track, with the facts of its Google business profile as we last read them and how it is doing in the map results. Needs the local:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_businesses",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_check_now

Check keywords now · write · permission local:write · REST equivalent POST /local-rankings/check

Puts those keywords at the front of the queue. They are checked within a few minutes and each one uses a check from this month's allowance. Needs the local:write permission.

ArgumentTypeRequiredDescription
keyword_idsarrayyesThe keyword ids to check (up to 100).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_check_now",
    "arguments": {
      "keyword_ids": "<keyword_ids>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_history

The history of one keyword · read-only · permission local:read · REST equivalent GET /local-rankings/keywords/{keyword_id}/history

Every check we have made of that keyword, so you can chart it yourself. Needs the local:read permission.

ArgumentTypeRequiredDescription
keyword_idintegeryesThe keyword id.
limitintegernoHow many checks to return, newest first. Default: 90.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_history",
    "arguments": {
      "keyword_id": "keyword_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_keywords

List your local keywords · read-only · permission local:read · REST equivalent GET /local-rankings/keywords

Every keyword you track, where it sits in the map results and in the ordinary results, and how it moved since the check before. Needs the local:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
business_idintegernoOnly keywords of this business.
statestring (one of: pack, map, nomap)nopack = in the top 3 of the map, map = anywhere in the map results, nomap = not in them at all.
searchstringnoPart of the keyword, business or town.
limitintegernoItems per page. Default: 50.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_keywords",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

local_status

Local rankings: plan and usage · read-only · permission local:read · REST equivalent GET /local-rankings

Your plan, what it covers, how much of this month's checks you have used, and how your businesses are doing on the map overall. Needs the local:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "local_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Local rankings. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Client reports

White-label reports for an agency's clients, built from the SEO tools the account already has.

reports_clients

List your clients · read-only · permission reports:read · REST equivalent GET /client-reports/clients

Every client you report on, what of theirs a report covers and when the next one is due. Needs the reports:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_clients",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reports_get

One report · read-only · permission reports:read · REST equivalent GET /client-reports/reports/{report_id}

The whole report: every section as it was frozen when it was made, the plain "what changed" summary, and the share link while it is live. Needs the reports:read permission.

ArgumentTypeRequiredDescription
report_idintegeryesThe report id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_get",
    "arguments": {
      "report_id": "report_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reports_list

List the reports you have made · read-only · permission reports:read · REST equivalent GET /client-reports/reports

Every report made on this account, newest first. The share link itself is only returned by the single-report endpoint. Needs the reports:read permission. Paginated: the answer's next_cursor is the cursor of the next page.

ArgumentTypeRequiredDescription
client_idintegernoOnly reports for this client.
limitintegernoItems per page. Default: 25.
cursorstringnoThe next_cursor value of the previous page; absent for the first page.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reports_make

Make a report now · write · permission reports:write · REST equivalent POST /client-reports/reports

Builds the report from what the account has already collected - it never spends any of your search credits - and returns it with its share link. Needs the reports:write permission.

ArgumentTypeRequiredDescription
client_idintegeryesThe client.
sendbooleannoAlso e-mail it to that client's addresses. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_make",
    "arguments": {
      "client_id": 1
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reports_revoke

Turn a share link off · destructive · permission reports:write · REST equivalent POST /client-reports/reports/{report_id}/revoke

The link stops working at once for everybody who has it. The report itself is kept and you can turn the link back on from the panel. Needs the reports:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
report_idintegeryesThe report id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_revoke",
    "arguments": {
      "report_id": "report_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reports_status

Client reports: plan and usage · read-only · permission reports:read · REST equivalent GET /client-reports

Your plan, how many clients and reports it covers and how many you have used this month. Needs the reports:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reports_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Client reports. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Held plugin updates

Plugin updates that stopped a site working were put back automatically; list them and ask for one to be tried again.

updates_holds

List held plugin updates · read-only · permission updates:read · REST equivalent GET /plugin-updates/held

Every plugin update we held back across your sites because it stopped the site working (the same list as the "Held plugin updates" page). "holding" = tried again on the next update run; "blocked" = it broke the site twice, so it waits for a newer version or for you to ask us to try again. Needs the updates:read permission.

ArgumentTypeRequiredDescription
site_idintegernoOnly this site.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "updates_holds",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Held plugin updates. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

updates_site_holds

Held plugin updates of one site · read-only · permission updates:read · REST equivalent GET /sites/{site_id}/plugin-updates/held

The held plugin updates of one site (the site page's "Plugin updates" section). Needs the updates:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "updates_site_holds",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Held plugin updates. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

updates_try_again

Try a held plugin update again · write · permission updates:write · REST equivalent POST /plugin-updates/held/{hold_id}/try-again

The "Try again" button. Nothing is installed now: the site's next update run tries this version again, loading the site before and after. If it stops the site working again we put it straight back, as before. Needs the updates:write permission.

ArgumentTypeRequiredDescription
hold_idintegeryesThe held update id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "updates_try_again",
    "arguments": {
      "hold_id": "hold_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Held plugin updates. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Extra databases

More databases for one site (any site type with a database), each with its own daily backup you can restore.

extradb_cancel

Cancel (or keep) an extra database at the end of its paid months · destructive · permission extradb:write · REST equivalent POST /sites/{site_id}/extra-databases/{db_id}/cancel

Cancelling stops the renewal reminders and removes the database (full copy first) when its paid months end; nothing more is charged. "cancel": false keeps it. Needs "confirm": true. Needs the extradb:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
db_idintegeryesThe extra database id.
cancelbooleannotrue = remove it when its paid months end (a full copy is taken first); false = keep it (withdraw the cancellation). Default: True.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_cancel",
    "arguments": {
      "site_id": 123,
      "db_id": "db_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_create

Add an extra database · write · permission extradb:write · REST equivalent POST /sites/{site_id}/extra-databases

Adds an extra database where your account gets them free of charge (created in a minute or two). Every other account buys one in the browser: this answers 402 payment_required with details.checkout_url and the price, and never starts a payment. Needs the extradb:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
labelstringyesThe name suffix: 1 to 16 lowercase letters and digits. The database is called site{site_id}_{label}.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_create",
    "arguments": {
      "site_id": 123,
      "label": "<label>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_delete

Remove an extra database now · destructive · permission extradb:write · REST equivalent DELETE /sites/{site_id}/extra-databases/{db_id}

Removes the database now. A full copy is taken first and kept for the days in removed_copy_kept_days (ask support to put it back). Needs "confirm": true and the database name typed exactly in "name". Paid months are not refunded. Needs the extradb:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
db_idintegeryesThe extra database id.
namestringyesThe database name, typed exactly (e.g. site12345_shop) - the same check as the page.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_delete",
    "arguments": {
      "site_id": 123,
      "db_id": "db_id",
      "name": "<name>",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_get

One extra database · read-only · permission extradb:read · REST equivalent GET /sites/{site_id}/extra-databases/{db_id}

One extra database, with its restore points (its own daily backups, newest first; each id is a point the database can be restored to). Needs the extradb:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
db_idintegeryesThe extra database id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_get",
    "arguments": {
      "site_id": 123,
      "db_id": "db_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_list

List extra databases · read-only · permission extradb:read · REST equivalent GET /extra-databases

Every extra database in your account (all sites), with its state, size, paid period and last backup. Credentials are shown on the site's Extra databases page, never here. Needs the extradb:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_restore

Restore an extra database from a backup · destructive · permission extradb:write · REST equivalent POST /sites/{site_id}/extra-databases/{db_id}/restore

Puts the database back as it was at the chosen daily backup: everything written since is replaced. A copy of the database as it is now is taken first. Usually done within a few minutes (you get an e-mail). Needs "confirm": true and the database name typed exactly in "name". Needs the extradb:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
db_idintegeryesThe extra database id.
backupstringyesA restore point id of this database (restore_points[].id).
namestringyesThe database name, typed exactly (e.g. site12345_shop) - the same check as the page.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_restore",
    "arguments": {
      "site_id": 123,
      "db_id": "db_id",
      "backup": "<backup>",
      "name": "<name>",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

extradb_site

Extra databases of a site, price and allowance · read-only · permission extradb:read · REST equivalent GET /sites/{site_id}/extra-databases

Whether this site can have extra databases (every site type with a database), the price per database per month (before VAT, from the live price row), how many a site may have, the site's database allowance shared by its main and extra databases, and its extra databases. Buying or renewing is done on checkout_url in the browser: the API never starts a payment. Needs the extradb:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "extradb_site",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Extra databases. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Staging

Staging sites: a private copy of a live WordPress or Static HTML site to try changes on, then copy to the live site (or refresh from it).

staging_access

The share login of a staging site · write · permission staging:write · REST equivalent POST /staging/sites/{staging_id}/access

The username and password that protect the staging site, to share it with someone who has no account (the same "Password to share" the staging page shows the account holder). Account holder only. Needs the staging:write permission.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_access",
    "arguments": {
      "staging_id": "staging_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_cancel

Cancel the staging add-on · destructive · permission staging:write · REST equivalent POST /staging/cancel

Ends the staging add-on now and removes EVERY staging site of the account. Months already paid are not refunded. Your live sites are not affected. Needs "confirm": true. Needs the staging:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_cancel",
    "arguments": {
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_copy_from_live

Refresh staging from the live site · destructive · permission staging:write · REST equivalent POST /staging/sites/{staging_id}/copy-from-live

Copies the live site over the staging copy (files and/or database), replacing any changes made on staging. The live site is not changed. Needs "confirm": true. Needs the staging:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
whatstring (one of: full, db, files)noWhat to copy: full (files and database), db (database only, WordPress) or files (files only). Default: full.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_copy_from_live",
    "arguments": {
      "staging_id": "staging_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_copy_to_live

Copy staging to the live site · destructive · permission staging:write · REST equivalent POST /staging/sites/{staging_id}/copy-to-live

Publishes the staging copy: OVERWRITES the live site's files and/or database with the staging ones. An undo copy of what it replaced is kept for 7 days (support can put it back). Needs "confirm": true. The staging site reads "ready" again when it is done. Needs the staging:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
whatstring (one of: full, db, files)noWhat to copy: full (files and database), db (database only, WordPress) or files (files only). Default: full.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_copy_to_live",
    "arguments": {
      "staging_id": "staging_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_create

Create a staging site · write · permission staging:write · REST equivalent POST /staging/sites

Makes a private staging copy of one of your live sites (files and database). It takes a few minutes for a typical site; the staging site reads "ready" when it is done. Needs the staging add-on and a free slot; the live site is not changed. Needs the staging:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe live site to copy (one of yours that can have a staging copy).
labelstringnoAn optional name for this copy (60 characters).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_create",
    "arguments": {
      "site_id": 1
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_delete

Remove a staging site · destructive · permission staging:write · REST equivalent DELETE /staging/sites/{staging_id}

Removes the staging copy (its files, database and address). The live site is not touched and the slot is free again straight away. Needs "confirm": true. Needs the staging:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
confirmbooleanyesMust be true.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_delete",
    "arguments": {
      "staging_id": "staging_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_eligible

Which sites can be staged · read-only · permission staging:read · REST equivalent GET /staging/eligible

Your live sites and, for each, whether a staging copy can be made of it now and, when not, the reason in plain words (only WordPress and Static HTML sites that are running). Needs the staging:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_eligible",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_get

One staging site · read-only · permission staging:read · REST equivalent GET /staging/sites/{staging_id}

One staging site with its last ten jobs (create, copy to live, copy from live, remove). Needs the staging:read permission.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_get",
    "arguments": {
      "staging_id": "staging_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_list

List staging sites · read-only · permission staging:read · REST equivalent GET /staging/sites

Every staging site in your account that exists now (being created, ready, copying, paused, needs attention or being removed), newest first, with its last copy job. The state goes back to "ready" when a copy is done. Needs the staging:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_sftp

Switch on SFTP / reset its password · write · permission staging:write · REST equivalent POST /staging/sites/{staging_id}/sftp

SFTP for one staging site. The first call switches it on and returns the login WITH a new password; later calls return the login with "password": "" (it is shown only once and never stored). "reset": true sets a new password (the old one stops working). Needs the staging:write permission.

ArgumentTypeRequiredDescription
staging_idintegeryesThe staging site id.
resetbooleannotrue = make a NEW password (the old one stops working). Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_sftp",
    "arguments": {
      "staging_id": "staging_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

staging_status

Staging: add-on, slots and price · read-only · permission staging:read · REST equivalent GET /staging

Whether staging is on for your account, until when it is paid, how many staging sites you have and may have at once, the size limits, and the monthly price (before VAT, from the live price row) with the page where you buy or renew it. Buying happens in the browser: the API never starts a payment. Needs the staging:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "staging_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Staging. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Turnstile bot check

Cloudflare Turnstile on your WordPress forms (login, registration, lost password, comments and the common form plugins): status, switch on or off, choose forms, new keys.

turnstile_disable

Switch Turnstile off · destructive · permission turnstile:write · REST equivalent POST /sites/{site_id}/turnstile/disable

Takes the plugin off the site first (read back), then deletes the widget. Your forms are no longer protected by the bot check. Needs "confirm": true. You can switch it on again at any time. Needs the turnstile:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
confirmbooleanyesMust be true: switching Turnstile off removes the bot check from the site's forms.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "turnstile_disable",
    "arguments": {
      "site_id": 123,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Turnstile bot check. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

turnstile_enable

Switch Turnstile on (or change its settings) · write · permission turnstile:write · REST equivalent POST /sites/{site_id}/turnstile

Switches the bot check on for this site, or saves new settings when it is already on. We create the Turnstile widget, install our small WordPress plugin with the keys and read it back from the site. If there is no room yet the status is "waiting" and it finishes by itself. Turnstile that our team switched off ("revoked") cannot be switched back on here - contact support. Needs the turnstile:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
modestring (one of: managed, non-interactive, invisible)noHow visitors are checked. managed (recommended) shows a checkbox only when needed; non-interactive never asks; invisible shows nothing. Default: managed.
formsarraynoWhich forms to protect: login, register, lostpassword, comments, cf7 (Contact Form 7), wpforms, spectra, ninja (Ninja Forms), kadence (Kadence Blocks form block), elementor (Elementor Pro), everest (Everest Forms), mc4wp (Mailchimp for WP), metform, otter, forminator, happyforms, fluent (Fluent Forms), formidable. Default: all of them.
extra_hostsarraynoUp to 4 more hostnames the check must accept - domains of your OTHER sites with us (e.g. a subdomain site).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "turnstile_enable",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Turnstile bot check. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

turnstile_get

Turnstile status of a site · read-only · permission turnstile:read · REST equivalent GET /sites/{site_id}/turnstile

What the site's Turnstile tab shows: whether the bot check can be used here (WordPress sites), whether it is on, the mode, which forms it protects, the extra hostnames it accepts, when it was last read back from the site and when the keys were last replaced. The secret key is never returned. Needs the turnstile:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "turnstile_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Turnstile bot check. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

turnstile_rotate

Replace the Turnstile secret key · write · permission turnstile:write · REST equivalent POST /sites/{site_id}/turnstile/rotate

Issues a new secret key for the site's widget and installs it on the site straight away. The new key is never shown - it only lives on your site. For a key that may have leaked. Needs the turnstile:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "turnstile_rotate",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Turnstile bot check. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Cron jobs

Scheduled tasks for a site: WordPress scheduled tasks, a PHP script, a web address or a command, every 5 minutes at most, stopped after 15 minutes, as the site's own user. Free on every plan; 5 per site, 25 per account. Times are UTC.

cron_account

List every cron job on the account · read-only · permission cron:read · REST equivalent GET /cron-jobs

All cron jobs on every site of the account (at most 25), each with its site id and domain. Needs the cron:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_account",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_create

Add a cron job · write · permission cron:write · REST equivalent POST /sites/{site_id}/cron-jobs

Adds a job and puts it on the site's server within about a minute. It runs as the site's own user, in the site folder, with the site's PHP version, and is stopped after 15 minutes. Refused with limit_reached at 5 jobs on the site or 25 on the account, and with validation_failed for a schedule more often than every 5 minutes, a multi-line command, or a script path outside the site folder. Needs the cron:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
namestringnoA name you recognise (up to 80 characters).
kindstring (one of: wpcron, php, url, command)noWhat runs. wpcron: WordPress scheduled tasks (wp cron event run --due-now, WordPress sites only); php: a PHP script, target = path inside the site folder ending in .php (not for Static HTML); url: open a web address, target = http(s) address; command: a shell command, target = the command (one line, up to 1,000 characters). Required when creating.
targetstringnoThe script path, web address or command (see kind). Not used for wpcron.
schedule_modestring (one of: minutes, hourly, daily, weekly, advanced)noHow the schedule is given. minutes: every N minutes (every); hourly: once an hour at minute; daily: at hour:minute UTC; weekly: on weekday at hour:minute UTC; advanced: a 5-field cron expression. Required when creating.
everyinteger (one of: 5, 10, 15, 20, 30)nominutes mode: run every 5, 10, 15, 20 or 30 minutes. We pick a fixed start offset inside each window (e.g. :07, :22, :37, :52), so sites do not all start at the same second.
minuteintegernohourly / daily / weekly: the minute (0-59). Default: a fixed minute picked for the job.
hourintegernodaily / weekly: the hour, UTC.
weekdayintegernoweekly: 0 = Sunday, 1 = Monday ... 6 = Saturday.
expressionstringnoadvanced: five fields "minute hour day-of-month month day-of-week", UTC, e.g. "*/15 * * * *" or "30 2 * * 1-5". It may never run more often than every 5 minutes (checked across the whole hour, including from :55 to :00). A "*/N" minute field is moved to a fixed offset.
enabledbooleannoSwitch the job on (default) or off.
wp_pseudo_cron_offbooleannowpcron only: also stop WordPress running its scheduled tasks on page visits (sets DISABLE_WP_CRON in wp-config.php, only if it is not set already; taken out again when the job is deleted or switched off). Default true for wpcron.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_create",
    "arguments": {
      "site_id": 123,
      "name": "WordPress scheduled tasks",
      "kind": "wpcron",
      "schedule_mode": "minutes",
      "every": 15,
      "wp_pseudo_cron_off": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_delete

Delete a cron job · destructive · permission cron:write · REST equivalent DELETE /sites/{site_id}/cron-jobs/{cron_id}

Deletes the job and its run history, and takes it off the server within about a minute. A run already going finishes. Needs the cron:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
cron_idintegeryesThe cron job id (see the list).
confirmbooleanyesMust be true: the job and its run history are deleted.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_delete",
    "arguments": {
      "site_id": 123,
      "cron_id": 42,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_get

One cron job with its last runs · read-only · permission cron:read · REST equivalent GET /sites/{site_id}/cron-jobs/{cron_id}

The job and its last 10 runs: when, how long, the exit code, and the output (the first 1,000 and last 7,000 bytes of long output are kept). Needs the cron:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
cron_idintegeryesThe cron job id (see the list).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_get",
    "arguments": {
      "site_id": 123,
      "cron_id": 42
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_list

List a site's cron jobs · read-only · permission cron:read · REST equivalent GET /sites/{site_id}/cron-jobs

Every cron job of the site with its schedule (as written and in words, UTC), what it runs, whether it is on, why it is paused if it is (the site is frozen or suspended, it timed out 3 times in a row, or our team paused it), its next 3 run times and its last result. kinds lists what this site type may run. limits shows the per-site and per-account counts. Needs the cron:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_list",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_run

Run a cron job now · write · permission cron:write · REST equivalent POST /sites/{site_id}/cron-jobs/{cron_id}/run

Starts the job on its server at once (once a minute per job, 10 times in 10 minutes per account). The run is recorded like a scheduled one, with trigger "manual", a few seconds later. Refused while the site is frozen or suspended. Needs the cron:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
cron_idintegeryesThe cron job id (see the list).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_run",
    "arguments": {
      "site_id": 123,
      "cron_id": 42
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_runs

The last runs of a cron job · read-only · permission cron:read · REST equivalent GET /sites/{site_id}/cron-jobs/{cron_id}/runs

Newest first. status: ok, failed (non-zero exit code), timeout (stopped at 15 minutes), skipped (the previous run was still going, or the server was paused) or error (could not start). trigger: schedule or manual (the Run now button). Needs the cron:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
cron_idintegeryesThe cron job id (see the list).
limitintegernoHow many (newest first, at most 20 are kept). Default: 20.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_runs",
    "arguments": {
      "site_id": 123,
      "cron_id": 42
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

cron_update

Change a cron job · write · permission cron:write · REST equivalent PATCH /sites/{site_id}/cron-jobs/{cron_id}

Change any of the fields; the others stay as they are. To change the schedule give schedule_mode with its fields. Switching a job on again (enabled: true) also clears a pause after repeated timeouts. On the server within about a minute. Needs the cron:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
cron_idintegeryesThe cron job id (see the list).
namestringnoA name you recognise (up to 80 characters).
kindstring (one of: wpcron, php, url, command)noWhat runs. wpcron: WordPress scheduled tasks (wp cron event run --due-now, WordPress sites only); php: a PHP script, target = path inside the site folder ending in .php (not for Static HTML); url: open a web address, target = http(s) address; command: a shell command, target = the command (one line, up to 1,000 characters). Required when creating.
targetstringnoThe script path, web address or command (see kind). Not used for wpcron.
schedule_modestring (one of: minutes, hourly, daily, weekly, advanced)noHow the schedule is given. minutes: every N minutes (every); hourly: once an hour at minute; daily: at hour:minute UTC; weekly: on weekday at hour:minute UTC; advanced: a 5-field cron expression. Required when creating.
everyinteger (one of: 5, 10, 15, 20, 30)nominutes mode: run every 5, 10, 15, 20 or 30 minutes. We pick a fixed start offset inside each window (e.g. :07, :22, :37, :52), so sites do not all start at the same second.
minuteintegernohourly / daily / weekly: the minute (0-59). Default: a fixed minute picked for the job.
hourintegernodaily / weekly: the hour, UTC.
weekdayintegernoweekly: 0 = Sunday, 1 = Monday ... 6 = Saturday.
expressionstringnoadvanced: five fields "minute hour day-of-month month day-of-week", UTC, e.g. "*/15 * * * *" or "30 2 * * 1-5". It may never run more often than every 5 minutes (checked across the whole hour, including from :55 to :00). A "*/N" minute field is moved to a fixed offset.
enabledbooleannoSwitch the job on (default) or off.
wp_pseudo_cron_offbooleannowpcron only: also stop WordPress running its scheduled tasks on page visits (sets DISABLE_WP_CRON in wp-config.php, only if it is not set already; taken out again when the job is deleted or switched off). Default true for wpcron.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cron_update",
    "arguments": {
      "site_id": 123,
      "cron_id": 42,
      "kind": "php",
      "target": "scripts/nightly.php",
      "schedule_mode": "daily",
      "hour": 3,
      "minute": 20
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Cron jobs. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Reputation monitoring

Star rating, review count and the latest reviews on Google, Trustpilot and Tripadvisor for the businesses you watch (poor unanswered reviews first), plus brand page one.

reputation_add

Watch a business · write · permission reputation:write · REST equivalent POST /reputation/businesses

Adds a business and searches Google, Trustpilot and Tripadvisor for its profiles. The results arrive as candidates within a minute or two, for the owner to confirm which one is theirs. Refused if your plan has no room. Needs the reputation:write permission.

ArgumentTypeRequiredDescription
namestringyesThe business name as customers know it.
countryintegeryesThe country it is in: a reputation location_code (2826 = United Kingdom, 2840 = United States).
websitestringnoIts own website, optional (e.g. testcafe.com).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_add",
    "arguments": {
      "name": "<name>",
      "country": 1
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_confirm

Confirm which profile is yours · write · permission reputation:write · REST equivalent POST /reputation/businesses/{business_id}/profiles

Only a profile you confirm is ever read. Its first reading starts at once. Needs the reputation:write permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
platformstring (one of: google, trustpilot, tripadvisor)yesThe platform.
candidatestringyesThe id of the business candidate that is yours, or "none" when none of them is.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_confirm",
    "arguments": {
      "business_id": "business_id",
      "platform": "<platform>",
      "candidate": "<candidate>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_countries

Countries a business can be in · read-only · permission reputation:read · REST equivalent GET /reputation/countries

The countries you can choose when adding a business (pass location_code as country). Needs the reputation:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_countries",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_delete

Stop watching a business · destructive · permission reputation:write · REST equivalent DELETE /reputation/businesses/{business_id}

Removes the business with its profiles, reviews, history and brand terms. Needs the reputation:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_delete",
    "arguments": {
      "business_id": "business_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_get

One watched business · read-only · permission reputation:read · REST equivalent GET /reputation/businesses/{business_id}

One business: per platform its confirmed profile (or the candidates found, waiting for you to confirm which is yours), the latest reviews (poor unanswered first), the rating history, and each brand term with its latest page one and what dropped off it. Needs the reputation:read permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_get",
    "arguments": {
      "business_id": "business_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_list

List your watched businesses · read-only · permission reputation:read · REST equivalent GET /reputation/businesses

Every business you watch with its confirmed review profiles and their latest reading (null = not read yet, never zero). covered is false for a business your plan no longer pays to read. Needs the reputation:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_profile_remove

Stop watching one profile · destructive · permission reputation:write · REST equivalent DELETE /reputation/businesses/{business_id}/profiles/{platform}

Forgets the confirmed profile on one platform (search again to pick another). Needs the reputation:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
platformstring (one of: google, trustpilot, tripadvisor)yesThe platform.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_profile_remove",
    "arguments": {
      "business_id": "business_id",
      "platform": "platform"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_refresh

Read a business now · write · permission reputation:write · REST equivalent POST /reputation/businesses/{business_id}/refresh

Asks for a fresh reading of every confirmed profile and brand term of this business within the next few minutes. The same bound as the "Read now" button: once per business in the interval the page states (24 hours today). Weekly readings carry on regardless. Needs the reputation:write permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_refresh",
    "arguments": {
      "business_id": "business_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Search for its profiles again · write · permission reputation:write · REST equivalent POST /reputation/businesses/{business_id}/search

Searches the three platforms again for this business's profiles (the same daily limit per business as the button). New candidates replace the old ones. Needs the reputation:write permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_search",
    "arguments": {
      "business_id": "business_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_status

Reputation monitoring: plan and usage · read-only · permission reputation:read · REST equivalent GET /reputation

Your plan, how many businesses and brand terms it covers and how many you watch. Needs the reputation:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_term_add

Watch a brand term · write · permission reputation:write · REST equivalent POST /reputation/businesses/{business_id}/terms

Adds a brand term whose Google page one is read every week (within your plan's brand terms, up to 10 per business). Needs the reputation:write permission.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
termstringyesThe search term, e.g. the brand name.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_term_add",
    "arguments": {
      "business_id": "business_id",
      "term": "<term>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

reputation_term_delete

Stop watching a brand term · destructive · permission reputation:write · REST equivalent DELETE /reputation/businesses/{business_id}/terms/{term_id}

Removes a brand term and its page-one history. Needs the reputation:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
business_idintegeryesThe watched business id.
term_idintegeryesThe brand term id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reputation_term_delete",
    "arguments": {
      "business_id": "business_id",
      "term_id": "term_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Reputation monitoring. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Product price tracking

Your products on Google Shopping and Amazon: on the shelf or not, position, the cheapest comparable listing and how far above it you are.

products_add

Track a product · write · permission products:write · REST equivalent POST /product-tracking/products

Adds a product and reads both shelves at once. Refused before anything is spent if your plan has no room. Needs the products:write permission.

ArgumentTypeRequiredDescription
titlestringyesThe product the way shoppers search for it, e.g. "Sony WH-1000XM5".
countrystring (one of: GB, US, DE, FR, ES, IT, CA, AU)yesThe country you sell it in (the list is kept by us and may grow).
asinstringnoYour Amazon ASIN for it, to recognise your listing.
skustringnoYour SKU or GTIN (for your own reference).
competitorbooleannoTrue for a competitor's product (watched, never "yours"). Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "products_add",
    "arguments": {
      "title": "<title>",
      "country": "<country>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Product price tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

products_delete

Stop tracking a product · destructive · permission products:write · REST equivalent DELETE /product-tracking/products/{product_id}

Removes the product and its history. Needs the products:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
product_idintegeryesThe product id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "products_delete",
    "arguments": {
      "product_id": "product_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Product price tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

products_get

One product · read-only · permission products:read · REST equivalent GET /product-tracking/products/{product_id}

One product with every listing we read on each shelf ("counted" = comparable to your product; "yours" = recognised by your seller name or ASIN). Needs the products:read permission.

ArgumentTypeRequiredDescription
product_idintegeryesThe product id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "products_get",
    "arguments": {
      "product_id": "product_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Product price tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

products_list

List your tracked products · read-only · permission products:read · REST equivalent GET /product-tracking/products

Every product you track, with the latest reading of each shelf. Needs the products:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "products_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Product price tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

products_status

Product price tracking: plan and usage · read-only · permission products:read · REST equivalent GET /product-tracking

Your plan, how many products it covers and how your products are doing on the shelves. Needs the products:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "products_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Product price tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Competitor tracking

Competitor domains read every week: organic keywords, traffic estimate, top pages, domain rank and referring domains, with the history.

competitors_add

Watch a competitor domain · write · permission competitors:write · REST equivalent POST /competitors/domains

Adds a domain to your watch-list; its first reading arrives within minutes. Refused before anything is spent if your packs have no room. Needs the competitors:write permission.

ArgumentTypeRequiredDescription
domainstringyesThe domain, e.g. competitor.com.
countrystring (one of: US, GB, DE, FR, ES, IT, CA, AU)yesThe country to read it in (the list is kept by us and may grow).
notestringnoYour own note (up to 120 characters).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "competitors_add",
    "arguments": {
      "domain": "<domain>",
      "country": "<country>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Competitor tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

competitors_delete

Stop watching a domain · destructive · permission competitors:write · REST equivalent DELETE /competitors/domains/{watch_id}

Removes the domain from your watch-list. Needs the competitors:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
watch_idintegeryesThe watched domain id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "competitors_delete",
    "arguments": {
      "watch_id": "watch_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Competitor tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

competitors_get

One watched domain · read-only · permission competitors:read · REST equivalent GET /competitors/domains/{watch_id}

One domain with its top pages and the history of its weekly readings. Needs the competitors:read permission.

ArgumentTypeRequiredDescription
watch_idintegeryesThe watched domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "competitors_get",
    "arguments": {
      "watch_id": "watch_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Competitor tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

competitors_list

List your watched domains · read-only · permission competitors:read · REST equivalent GET /competitors/domains

Every domain you watch, with its latest weekly reading (null = not measured, never zero). Needs the competitors:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "competitors_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Competitor tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

competitors_status

Competitor tracking: packs and usage · read-only · permission competitors:read · REST equivalent GET /competitors

Your packs, how many domains they cover (plus any free domain) and how many you watch. Needs the competitors:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "competitors_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Competitor tracking. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Agency SEO data

Authority and link data for up to 200 domains hosted anywhere, read every week: domain rank, referring domains, backlinks, spam score and the organic traffic estimate.

agency_add

Track domains · write · permission agency:write · REST equivalent POST /agency-seo-data/domains

Adds domains to your list; their first reading arrives within minutes. Adds as many as your plan has room for and says why each other one was skipped. Nothing is spent on a refusal. Needs the agency:write permission.

ArgumentTypeRequiredDescription
domainsarrayyesThe domains, e.g. ["client-site.com", "other-client.co.uk"] (up to 500 per call).
countrystring (one of: US, GB, DE, FR, ES, IT, CA, AU)yesThe country for the organic traffic estimate (the list is kept by us and may grow).
labelstringnoA client label for all of them (up to 60 characters).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_add",
    "arguments": {
      "domains": "<domains>",
      "country": "<country>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

agency_delete

Stop tracking a domain in Agency SEO data · destructive · permission agency:write · REST equivalent DELETE /agency-seo-data/domains/{item_id}

Removes the domain from your list. Needs the agency:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
item_idintegeryesThe tracked domain id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_delete",
    "arguments": {
      "item_id": "item_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

agency_get

One tracked domain · read-only · permission agency:read · REST equivalent GET /agency-seo-data/domains/{item_id}

One domain with the history of its weekly readings (newest first, up to two years). Needs the agency:read permission.

ArgumentTypeRequiredDescription
item_idintegeryesThe tracked domain id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_get",
    "arguments": {
      "item_id": "item_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

agency_list

List your tracked domains · read-only · permission agency:read · REST equivalent GET /agency-seo-data/domains

Every domain you track, with its latest weekly reading (null = not measured, never zero). Needs the agency:read permission.

ArgumentTypeRequiredDescription
labelstringnoOnly the domains with this client label.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

agency_status

Agency SEO data: plan and usage · read-only · permission agency:read · REST equivalent GET /agency-seo-data

Your plan, how many domains it covers and how many you track. Needs the agency:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

agency_update

Label or switch a tracked domain · write · permission agency:write · REST equivalent PATCH /agency-seo-data/domains/{item_id}

Changes the client label or note, or switches the domain off / on. Needs the agency:write permission.

ArgumentTypeRequiredDescription
item_idintegeryesThe tracked domain id.
labelstringnoThe client label (up to 60 characters).
notestringnoYour note (up to 120 characters).
switched_onbooleannofalse = keep it with its history but stop reading and counting it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "agency_update",
    "arguments": {
      "item_id": "item_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Agency SEO data. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Website e-mail sending

Send a website's e-mail through your own provider (Resend, SendGrid, Brevo, Mailgun, Amazon SES, Postmark or any SMTP server) instead of our mail servers, and test it.

mailroute_get

Where a site's e-mail goes out · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/mail-sending

"route": "ours" = our mail servers (the default); "own" = the customer's own provider, with its state ("pending" while being set up on the server, "active", "error" + state_note). The key is never returned, only key_hint. Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mailroute_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website e-mail sending. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mailroute_off

Send through our mail servers again · destructive · permission sites:write · REST equivalent DELETE /sites/{site_id}/mail-sending

Switches the site back to our mail servers within a minute. The settings are kept unless forget=true. Needs the sites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
forgetbooleannoAlso delete the stored key and settings. Default: False.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mailroute_off",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website e-mail sending. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mailroute_providers

Providers you can send through · read-only · permission sites:read · REST equivalent GET /mail-sending/providers

The providers a site can send through and what each needs: a key only (Resend, SendGrid, Postmark), a login and key (Brevo, Mailgun, Amazon SES, which also need a region), or a server, port, user name and password (provider "smtp"). Needs the sites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mailroute_providers",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website e-mail sending. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mailroute_set

Send through my own provider · write · permission sites:write · REST equivalent PUT /sites/{site_id}/mail-sending

Stores the settings (the key encrypted) and switches the site's e-mail to that provider within a minute. The answer's "state" says whether it is sending; a test message confirms it. Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
providerstring (one of: resend, sendgrid, brevo, mailgun, ses, postmark, smtp)yesThe provider key, one of the mail-sending providers.
secretstringnoThe API key / SMTP key / SMTP password. Required the first time and when the provider or server changes; leave out to keep the stored one.
usernamestringnoThe SMTP login (Brevo, Mailgun, Amazon SES, smtp).
regionstringnoAmazon SES: e.g. eu-west-1. Mailgun: us or eu.
hoststringnoprovider "smtp" only: the SMTP server name.
portinteger (one of: 465, 587)no465 (TLS) or 587 (STARTTLS).
from_addressstringnoThe address the website sends as (default noreply@ the site domain). Must be verified at the provider.
force_frombooleannotrue sends every message as from_address (recommended: providers refuse unverified senders). Default: True.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mailroute_set",
    "arguments": {
      "site_id": 123,
      "provider": "<provider>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website e-mail sending. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

mailroute_test

Send a test e-mail · write · permission sites:write · REST equivalent POST /sites/{site_id}/mail-sending/test

Sends one real e-mail the way the website does (from inside the site, through the provider) and returns the provider's answer in plain words. At most 5 tests per site per 10 minutes. Needs the sites:write permission. This can take up to a minute.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
tostringyesWhere to send the test e-mail.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mailroute_test",
    "arguments": {
      "site_id": 123,
      "to": "<to>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Website e-mail sending. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Country lock

Limit a site to the countries you choose; everyone else gets a "not available in your country" page.

country_lock_get

Country lock of a site · read-only · permission sites:read · REST equivalent GET /sites/{site_id}/country-lock

Whether the site is locked to certain countries, which ones, whether search-engine crawlers are let in, the addresses that are always let in, and whether the change is live yet (status: pending = being applied, applied = live, waiting = the site is not live on its server yet, off). Needs the sites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "country_lock_get",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Country lock. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

country_lock_set

Set the country lock of a site · write · permission sites:write · REST equivalent PUT /sites/{site_id}/country-lock

Locks the site to the countries given (or everyone except them), or switches the lock off. Live on the site within about a minute - read it back with GET until status is "applied". Needs the sites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe site id.
enabledbooleanyestrue = lock the site; false = open it to every country (the saved countries are kept).
modestring (one of: allow, block)no"allow" = only these countries can open the site; "block" = everyone except these. Default: allow.
countriesarraynoTwo-letter country codes (ISO 3166), e.g. ["GB"]. Required when enabled.
allow_search_enginesbooleannoLet Google, Bing, Apple and DuckDuckGo crawlers in (by their published addresses). false = the site drops out of search results. Default: True.
allow_ipsarraynoAddresses or ranges always let in (at most 50), e.g. ["203.0.113.7"].
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "country_lock_set",
    "arguments": {
      "site_id": 123,
      "enabled": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Country lock. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Performance Boost

More CPU and memory for every site of the account: the level, and the price of each level.

boost_status

Performance Boost: your level and prices · read-only · permission boost:read · REST equivalent GET /performance-boost

Whether Performance Boost is on for the account (level, multiplier, last paid day), how many sites it covers, and what each level costs a month for the sites you have today (before VAT). Buying, upgrading and cancelling are done on the Performance Boost page (page_url). Needs the boost:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "boost_status",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Performance Boost. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Pro plugin discount

Hosting customers get 50% off the first payment of our Pro plugins: eligibility and offers.

prodisc_offers

Pro plugin discount: eligibility and offers · read-only · permission prodisc:read · REST equivalent GET /pro-discount

Whether the account gets 50% off the first payment of our Pro plugins (an active, paid hosting plan), and each plugin in the offer with its state for you: available, active (you have an unused code) or redeemed. The code itself is only shown on the page (page_url), where you also ask for it. Needs the prodisc:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "prodisc_offers",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Pro plugin discount. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

Money sites

Hosting on Zinn Digital's platform: plans, orders, sites, usage, and the free WooCommerce tick on a PBN-line WordPress site.

moneysites_buy

Order a money-site plan · write · permission moneysites:write · REST equivalent POST /money-sites/orders

Place a money-site order (a WordPress plan, optionally with WooCommerce, or an application plan). Zinn Digital LTD bills it, so the answer carries a one-time pay_url on Zinn Digital's own secure page - open it to pay by card, PayPal or crypto. Nothing is charged by this call. If Zinn Digital cannot take that order online (a term it does not price online, or its partner ordering is not open), the order is recorded as a request, a support ticket is opened, our team sends the payment link, and the answer says so plainly instead of pretending. Needs the moneysites:write permission.

ArgumentTypeRequiredDescription
planstringyesA plan code from /money-sites/plans.
monthsinteger (one of: 1, 3, 6, 12)noHow many months to pay for. Default: 1.
domainstringnoThe domain for the site; absent starts it on a temporary address.
woocommercebooleannoWordPress plans only: deploy with WooCommerce installed and set up, ready to sell (shop, cart, checkout and account pages, store open). Ignored for application plans. Default: False.
applicationstringnoWeb and developer plans: what to build, one of the plan's stacks keys (web: php = an empty PHP account, the default, or static; developer: node, python or ruby). A WordPress plan installs WordPress and an application or LMS plan installs its own application, so it is not needed there.
notesstringnoAnything our team should know.
addonsarraynoOptional add-on codes for this plan, from addons_offered on /money-sites/plans. They go on the same order and the same payment; each is priced by the server and checked to the cent before the pay_url is returned.
accept_termsbooleannoMust be true: it records that this account accepts the Terms and Conditions for this purchase, exactly as the tick box on the website does. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_buy",
    "arguments": {
      "plan": "<plan>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_get

One money site · read-only · permission moneysites:read · REST equivalent GET /money-sites/{money_site_id}

One money site in full: state, plan, hostnames, PHP version, region, usage against the plan's allowances, recent jobs and errors, and the links for the few jobs that are finished in the Zinn Digital panel. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_get",
    "arguments": {
      "money_site_id": "money_site_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_list

My money sites · read-only · permission moneysites:read · REST equivalent GET /money-sites

Every money site on this account, with its state, plan, application and last known usage. Needs the moneysites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_list",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_more

More hosting from Zinn Digital · read-only · permission moneysites:read · REST equivalent GET /money-sites/zinn-digital

The other hosting lines of our sister company Zinn Digital - agency, reseller, enterprise, cloud, AI, developer, LMS and mail hosting - each with its live "from" price (USD a month, read from Zinn Digital's catalogue) and its sign-up page. These are links only: the account, billing and support for them are at Zinn Digital. Needs the moneysites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_more",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_move

One move · read-only · permission moneysites:read · REST equivalent GET /money-site-moves/{move_id}

One move: the step it is on, what it is doing now, and its log (what was checked and when). Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
move_idintegeryesThe move id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_move",
    "arguments": {
      "move_id": "move_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_move_cancel

Cancel a move · write · permission moneysites:write · REST equivalent POST /money-site-moves/{move_id}/cancel

Cancels a move before the domain is switched. The site stays exactly as it is on PBN hosting. Refused once the domain switch has started. Needs the moneysites:write permission.

ArgumentTypeRequiredDescription
move_idintegeryesThe move id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_move_cancel",
    "arguments": {
      "move_id": "move_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_move_check

Can this PBN site move to money-site hosting? · read-only · permission moneysites:read · REST equivalent GET /sites/{site_id}/money-site-move

Whether the site can be moved now, into which money-site plan and slot, and what happens. When it cannot, reason_code says why (no_plan, no_free_slot, type_unsupported, site_busy, already_moving, dns_unsupported, ...) and buy_url points at the plan to buy. current_move is the move in progress, if any. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe PBN site id (the same id the /sites endpoints use).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_move_check",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_move_start

Move a PBN site to money-site hosting · write · permission moneysites:write · REST equivalent POST /sites/{site_id}/money-site-move

Starts the one-click move. Needs the sites:delete scope too, because the PBN copy is deleted at the end. The domain keeps its nameservers and DNS account: only its web records are pointed at the new hosting, after the copy has been checked; email and other records are not touched. Nothing is charged. The move it returns shows each step. Needs the moneysites:write permission.

ArgumentTypeRequiredDescription
site_idintegeryesThe PBN site id (the same id the /sites endpoints use).
confirmbooleanyesMust be true: you accept that once the site is live on money-site hosting its PBN copy and its PBN backups are deleted automatically (the PBN slot is freed).
subscription_idstringnoOptional: which money-site plan to move into, when you have more than one (target.subscription_id from the GET).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_move_start",
    "arguments": {
      "site_id": 123,
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_moves

Moves to money-site hosting · read-only · permission moneysites:read · REST equivalent GET /money-site-moves

Every move of a PBN site to money-site hosting on this account, newest first, with its steps and state. Needs the moneysites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_moves",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_order

One money-site order · read-only · permission moneysites:read · REST equivalent GET /money-sites/orders/{order_id}

One order, re-read from Zinn Digital if it is still open. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
order_idintegeryesThe order id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_order",
    "arguments": {
      "order_id": "order_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_order_cancel

Cancel an unpaid money-site order · destructive · permission moneysites:write · REST equivalent POST /money-sites/orders/{order_id}/cancel

Cancel an order that has not been paid. Nothing was charged, so nothing is refunded. Needs the moneysites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
order_idintegeryesThe order id.
confirmbooleanyesMust be true: this deletes or overwrites something, and the call is refused without it.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_order_cancel",
    "arguments": {
      "order_id": "order_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_orders

My money-site orders · read-only · permission moneysites:read · REST equivalent GET /money-sites/orders

Every money-site order on this account, newest first, with its state and what it cost. Needs the moneysites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_orders",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_plans

Money-site plans and prices · read-only · permission moneysites:read · REST equivalent GET /money-sites/plans

Every money-site hosting plan on sale - Managed WordPress hosting (Start to Enterprise; any of them can be ordered with WooCommerce installed and set up, ready to sell), application hosting (each application's Business and/or Pro tier), PHP web hosting, developer hosting and LMS hosting - with the price for 1, 3, 6 and 12 months, what the plan includes, and which terms Zinn Digital takes online (online_terms; any other term is set up by our team, who send the payment link). Money sites run on Zinn Digital's platform - separate infrastructure from the PBN network - and Zinn Digital LTD bills them: pay by card, PayPal or crypto. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
linestring (one of: wordpress, applications, web, developer, lms, all)nowordpress = Managed WordPress hosting (Start to Enterprise, with the "Install WooCommerce" option); applications = application hosting (every application's Business and/or Pro tier); web = PHP web hosting (an empty PHP account or a static site); developer = Node.js / Python / Ruby apps from Git; lms = LMS hosting (WordPress LMS or Moodle); all = every line. Default: all.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_plans",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_refresh

Re-read everything from Zinn Digital · read-only · permission moneysites:read · REST equivalent POST /money-sites/refresh

Asks Zinn Digital for this account's sites and orders again: after paying, or when a site set up by our team is not listed yet. Needs the moneysites:read permission.

Takes no arguments.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_refresh",
    "arguments": {}
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_site_addon_pay

A fresh pay link for an add-on order · write · permission moneysites:write · REST equivalent POST /money-sites/{money_site_id}/addons/{addon_order_id}/pay

For an add-on order that is awaiting payment: the same order's pay link again (never a second order). Refused when there is nothing to pay. Needs the moneysites:write permission.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
addon_order_idintegeryesThe add-on order id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_site_addon_pay",
    "arguments": {
      "money_site_id": "money_site_id",
      "addon_order_id": "addon_order_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_site_addons

Add-ons for one money site · read-only · permission moneysites:read · REST equivalent GET /money-sites/{money_site_id}/addons

What the site's plan already includes, the add-ons that can be added to THIS site (valid for its plan, priced by the server), and the add-on orders already made for it with their status. online says whether an add-on can be placed and paid online right now (answered with a pay link) or is taken as a request that our team places and sends the payment link for - nothing is charged either way until you pay on Zinn Digital LTD's own page. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_site_addons",
    "arguments": {
      "money_site_id": "money_site_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_site_addons_request

Add add-ons to a money site · write · permission moneysites:write · REST equivalent POST /money-sites/{money_site_id}/addons

Asks for add-ons on this site. The server checks every code against the site's plan and prices it. When add-ons can be placed online, the answer carries Zinn Digital LTD's one-time pay_url (open it to pay); otherwise it is recorded as a request, our team places it and sends you the payment link (requested: true, pay_url null). Nothing is charged by this call. The same set asked twice while the first is still open returns the first. Needs the moneysites:write permission.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
addonsarrayyesAdd-on codes from the site's offered add-ons (at most 20).
accept_termsbooleannoMust be true (once per Terms version): records that this account accepts the Terms and Conditions, exactly as the tick box on the website does. Default: False.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_site_addons_request",
    "arguments": {
      "money_site_id": "money_site_id",
      "addons": "<addons>"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_site_plan

The plan that pays for a money site · read-only · permission moneysites:read · REST equivalent GET /money-sites/{money_site_id}/plan

The Zinn Digital subscription that pays for this money site, read live: its plan, price, whether it renews and on which date, or the date it ends when it will not renew, and whether it can be cancelled here (can_cancel). Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_site_plan",
    "arguments": {
      "money_site_id": "money_site_id"
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_site_plan_cancel

Cancel the plan for a money site (at period end, no refund) · destructive · permission moneysites:write · REST equivalent POST /money-sites/{money_site_id}/plan/cancel

Cancels the plan that pays for this money site AT THE END OF THE PAID PERIOD: renewal is switched off, the site stays live until ends_on, then the plan ends and nothing more is charged. No refund is made. Safe to repeat: a plan that is already cancelled answers its current state. A plan paid through a PayPal subscription is cancelled in PayPal instead (the error says how). Needs the moneysites:write permission. DESTRUCTIVE: this cannot be undone, and the call is refused without "confirm": true.

ArgumentTypeRequiredDescription
money_site_idintegeryesThe money site id.
confirmbooleanyesMust be true: you understand the site stays live until the period end, then the plan ends, and that no refund is made.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_site_plan_cancel",
    "arguments": {
      "money_site_id": "money_site_id",
      "confirm": true
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_woocommerce

WooCommerce on a PBN-line site · read-only · permission moneysites:read · REST equivalent GET /sites/{site_id}/woocommerce

Whether WooCommerce is installed on one of your PBN-line WordPress sites, which version, and the health checks: plugin active, shop/cart/checkout pages, a currency, pretty permalinks, HTTPS, and cart and checkout kept out of any page cache. Needs the moneysites:read permission.

ArgumentTypeRequiredDescription
site_idintegeryesA PBN-line site id (the same id the /sites endpoints use).
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_woocommerce",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.

moneysites_woocommerce_set

Install or remove WooCommerce on a WordPress site · write · permission moneysites:write · REST equivalent POST /sites/{site_id}/woocommerce

Adds WooCommerce to a PBN-line WordPress site, free of charge, or switches it off again. The install runs in the background and usually takes a minute or two; the site's WooCommerce state shows the result. WooCommerce is a WordPress plugin, so a site of another type is refused with the reason - a WordPress money-site plan with the WooCommerce option is the answer there. A NEW site can have it installed as it is built (install_woocommerce: true when creating the site). Needs the moneysites:write permission. Starts a job that finishes later: the answer carries job.id, and the job reads succeeded or failed when it is done.

ArgumentTypeRequiredDescription
site_idintegeryesA PBN-line site id (the same id the /sites endpoints use).
onbooleannotrue installs and activates WooCommerce; false deactivates it (products and orders stay in the database). Default: True.
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "moneysites_woocommerce_set",
    "arguments": {
      "site_id": 123
    }
  }
}

The answer carries the same data as the REST call, as structuredContent, with an example of every field in Money sites. The exact JSON Schema the answer is validated against is the tool's own outputSchema in tools/list.