Cross-site SEO snapshot: for every post/page, returns rank_math_title, description, focus_keyword presence, robots, canonical, OG image, word_count, and a per-item `issues` array (missing_title, missing_description, missing_focus_keyword, missing_og_image, thin_content, noindex). Plus an aggregate summary count. Paginated — use per_page+page. Set missing_only=true to only return items with at least one issue. Free tier.
post_typeper_pagepagestatusmissing_only
List Elementor-enabled posts. Default returns only pages (excludes kits/templates). type='all' = pages + templates, type='template' = Elementor library only, type='any' = every post_type with Elementor builder enabled (WooCommerce products, portfolios, LearnDash courses, custom CPTs).
type
Get full Elementor JSON data for a page. Returns the elements array (containers/widgets) plus page metadata. Use fields= / max_length= to keep large pages out of your context (or prefer get_elementor_outline + get_elementor_element).
page_idfieldsmax_length
List available Elementor component templates (hero, heading, text, image, button, video_bg, products_grid, icon_list, category_cards, cta_banner, spacer) with their parameters.
List registered Elementor widgets. Three modes: 'names' (default — array of widget slugs only, fast and never fatals), 'meta' ({name, title, icon, categories} per widget), 'full' (meta + per-widget controls — heavy, opt-in only because init_controls() on every widget can exhaust memory on sites with Elementor Pro + add-ons).
mode
Return a lightweight tree of an Elementor page (id, elType, widgetType, label, children) WITHOUT the full settings/data. Use this to discover the page structure before fetching specific elements. Saves 100x context vs get_elementor_page. Pass max_depth to limit recursion on large pages (useful for 100+ element pages).
page_idmax_depth
Get a single Elementor element (widget or container) by its ID. Use this to fetch ONLY the element you need to inspect, instead of downloading the entire page. Find element IDs via get_elementor_outline.
page_idelement_idfieldsmax_lengthunwrap
Search Elementor trees for elements matching conditions — across given page_ids (max 50) or all Elementor pages (first 50). Filter by widget_type / el_type and a `where` map of dotted paths → condition: null (missing or empty), scalar (equals), {"contains": "txt"}, {"matches": "<regex, case-insensitive>"}, {"exists": true|false}, {"not": cond}, {"in": [..]}. Example: find videos without an overlay image → widget_type='video', where={"settings.show_image_overlay": null}; find Poppins → where={"settings.typography_font_family": "Poppins"}. Returns [{page_id, element_id, elType, widgetType, path, matched}]. Free tier (read-only).
page_idspost_typewidget_typeel_typewherelimit
Compact control schema for one widget/element type — what to put in `settings`. Classic widgets: {control: {t: type, opts: allowed option keys, def: default, rv: responsive, if: condition, arr/fields: repeater, units}} grouped by section; filter with tab ('content'|'style'|'advanced'), section, control_names, or params_only=true (hides advanced/motion/hover/responsive noise). Atomic (e-*) elements: props schema with $$type keys, union members and shapes. ~10× smaller than list_elementor_widgets(mode=full). Free tier.
widget_typetabsectioncontrol_namesparams_onlyexample
Elementor 4 Global Classes (reusable style classes stored in the Kit): id, label, variant count, style props used. full=true returns the native items with variants. Free tier; needs the e_atomic_elements experiment.
full
Elementor 4 Variables (design tokens: color / font / size) from the active Kit, with the current watermark. Free tier; needs the e_variables experiment.
One context-cheap read of a page: sections post, structure (counts by type, depth, 2-level outline), tokens (global refs, fonts, literal colors, class refs), responsive (per-device overrides), content (headings, word count, images without alt, links, buttons, forms), warnings (no_h1, multiple_h1, deep nesting, empty containers). Cached 15 min per page version; fresh=true bypasses. Free tier.
page_idsectionsfresh
Unified catalog of everything you can insert: containers (section/column/container + atomic e-flexbox/e-div-block…) and widgets with title, categories, source (elementor / elementor-pro / plugin slug), atomic flag, in_panel/insertable and allowed parents, plus the placement rules. Cached 6 h per Elementor version (fresh=true bypasses). Filter by category. Free tier. Then get_widget_schema(type, example=true) for one type.
categoryinclude_hiddenfresh
The site's design system in one read: kit color + typography tokens, base typography/layout kit keys (body_*, h1_*…, container_width…), global classes, variables, Astra custom-css blocks, and usage across Elementor pages (which tokens/classes are referenced, which literal hex colors bypass the palette, with page/element ids). Free tier. Use before styling work; convert literals with set_global_reference.
usagelimit_pages
Post fields (title, slug, status, parent, menu_order, excerpt, template, featured image) + Elementor page settings (_elementor_page_settings) + allowed templates for a page. Free tier.
page_id
Global colors and typography of the active Elementor Kit (system + custom) in a flat form. Free tier.
Dynamic tags registered on the site (Elementor Pro / add-ons) with their controls, plus the shortcode format. Free tier.
Find where a text appears across the site: titles, slugs, post_content, Elementor element settings (returns element_id + widget_type + setting path) and chosen meta keys. Snippets with context. Free tier. Use before elementor_replace / bulk edits.
querypost_typespost_idsinmeta_keyslimitlimit_postscase_sensitive
Gutenberg block outline of a post with index paths ('0', '2.1'), attrs and text preview; full=true returns the raw parsed blocks. Free tier.
post_idfull
Redirect rules from the installed provider (Rank Math or Redirection). 501 no_redirect_provider when none is active. Free tier.
limit
Scan post_content + Elementor data of recent posts (or post_ids) for http(s) URLs and check them from the server (HEAD, GET fallback; private hosts skipped; ≤100 URLs, ≤50 posts). Returns broken[] with status + posts. Free tier.
post_idspost_typelimit_postslimit_urlstimeoutinternal_only
Find pages by slug, title, parent, or status. Returns lightweight list (id, title, slug, link, parent, is_elementor) without fetching content. Use this BEFORE get_elementor_page when you don't already know the page ID.
slugtitleparentstatusper_page
Find WooCommerce products by search term, SKU, category ID, brand, or product attribute. Returns id, name, sku, prices, stock, categories. Pagination supported.
searchskucategory_idbrandattributeattribute_termper_pagepage
Fetch a public page URL (anonymous, no credentials sent, 30 s timeout, 5 MB cap, private/internal hosts refused) and return a structural snapshot — http_status, title, size, stylesheet count, inline <style> blocks, optional outerHTML of a selector-matched element. Use to verify what a visitor actually receives after a save, without loading a browser.
urlselectoroffsetmax_bytesraw
Check whether a CSS selector string appears anywhere in astra-settings.custom-css. Run before patch_css to catch selector typos, verify a block was applied, or assert no conflicting rule exists. Returns {selector, exists, count, css_total_bytes, first_rule}.
selector