approve_competitor_suggestion
ChatGPTApproves a competitor suggestion, turning it into a tracked competitor. Without competitorId, matches an existing competitor by name/alias/domain or creates a bare one from the suggested name. Approving reattributes the company's past mentions to it immediately rather than starting a clean count. Also reachable from the Rejected list, so approving is how a founder reverses an earlier rejection.
approve_monthly_report
ChatGPT[Superadmin] Approves a pending_review monthly report, which publishes it on the brand's Reports page. Does not email the client; sending stays in the admin portal.
cancel_shopify_blog_schedule
ChatGPTCancels a Shopify post's scheduled publish; the post stays on Shopify, hidden.
cancel_webflow_blog_schedule
ChatGPTCancels a future scheduled Webflow publish for a Goblinkly Webflow blog row.
create_aeo_prompt
ChatGPTCreates a new AEO citation-tracking prompt for a brand — a buyer-intent question that gets sampled across AI assistants to check who gets cited. Optionally assign it to an existing topic via topicId; omitted, it starts uncategorized. Prompts have no update tool — to change the wording, delete_aeo_prompt this one and create_aeo_prompt a replacement instead. Requires citation-tracking write access on the brand.
create_aeo_topic
ChatGPTCreates a new AEO citation-tracking topic for a brand, to group related prompts under.
create_brand_note
ChatGPTAdds an entry to a brand's timeline. body is required; entryType defaults to note and occurredAt to now, so a recap of an older call should pass the day it happened. Pinning this entry unpins whatever was pinned before — a brand holds one pinned entry. Only its author may edit or delete it afterwards. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
create_brand_task
ChatGPTOpens a task on a brand. Only title is required; status defaults to todo and priority to medium. assigneeUserId must be a superadmin or a member of this brand — list_brand_tasks and get_brand_task both report assignees, so an id can be taken from either. timelineEntryId links the task to the note it came out of, and must belong to the same brand. sourcePageIds are cited pages from Sources the task is work on; every id must be a page this brand has actually been cited on, which list_source_pages returns as pageId. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
create_competitor
ChatGPTAdds a competitor to a brand. name is required; websiteUrl is optional (leave it out for marketplace-only sellers with no site). The name, and the URL when given, must each be unique within that brand's list. logoUrl is fetched from websiteUrl when omitted. Pass aliases for the other names the same company is answered by (for example "Bilt" and "Bilt Rewards"), so its mentions resolve to this competitor instead of counting as an unknown brand. Set excludeFromBlogs to keep generated blogs from mentioning it. Requires owner, admin or analyst on the brand. IMPORTANT: name and aliases are the names this competitor is matched against in AI answers. Setting or changing either re-checks every answer already recorded, so mentions can move to this competitor or away from it, and past share of voice and rankings shift with them. Confirm with the user before renaming a competitor or editing its aliases; websiteUrl, logoUrl, hashtags, socials and excludeFromBlogs are safe to write without asking.
create_custom_blog
ChatGPTCreates a custom-website blog row in Goblinkly and immediately starts the existing background generation pipeline for it.
create_monthly_report_upload_link
ChatGPT[Superadmin] Returns a one-report upload link valid for 30 minutes, plus a ready curl command. POST the PDF to it as multipart field "file" (PDF only, max 25 MB). The upload attaches the PDF to the report: an awaiting_upload, pending_review or rejected report moves to pending_review, and an approved or sent report is replaced and stays approved. Use this both for new reports and for replacing an existing PDF.
create_shopify_blog
ChatGPTCreates a Shopify blog row in Goblinkly and starts the generation pipeline for it. The brand must be in Shopify mode with a connected site and a chosen Shopify blog. Nothing is sent to Shopify until the post is saved, published or scheduled.
create_webflow_blog
ChatGPTCreates a Webflow blog row in Goblinkly and starts the existing generation pipeline for that row.
delete_aeo_prompt
ChatGPTPermanently removes an AEO citation-tracking prompt from a brand — it stops being sampled going forward, though its past run history is kept. Confirm with the user before calling this. Requires citation-tracking write access on the brand.
delete_aeo_topic
ChatGPTPermanently removes an AEO citation-tracking topic from a brand, including every prompt filed under it — those prompts stop being sampled too, not just the topic, though their past run history is kept. Confirm with the user before calling this. Requires citation-tracking write access on the brand.
delete_brand_task
ChatGPTSoft-deletes a task, recording who did it. A brand member can only delete a task they opened themselves; Goblinkly staff can delete any. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
delete_competitor
ChatGPTPermanently removes a competitor from a brand, along with its social profiles. The record that it was named in past answers survives, but it stops counting as a tracked competitor: it disappears from share of voice, and stays in the topic rankings only as the raw name the answer used. Prefer excludeFromBlogs through update_competitor when the intent is only to stop mentioning it in content. Confirm with the user before calling this. Requires owner, admin or analyst on the brand.
dismiss_design_suggestions
ChatGPTKeeps the user value for each suggested token named: the suggestion stops showing until the next extraction. To take the AI value instead, use reset_design_tokens. Owners and admins only.
get_aeo_analytics
ChatGPTReturns total AEO sessions and AEO source breakdown data for a brand over a date range.
get_aeo_citation_gaps
ChatGPTReturns paginated AEO citation gaps where the brand is not cited but competitors are.
get_aeo_citation_trend
ChatGPTReturns the AEO citation trend for a brand over time, bucketed weekly.
get_aeo_dashboard_kpis
ChatGPTReturns AEO citation dashboard KPI cards such as share of voice, average position, and prompts tracked for a brand.
get_aeo_data_range
ChatGPTReturns the earliest and latest successful AEO citation data dates currently available for a brand.
get_aeo_prompt_runs
ChatGPTReturns run history for a single AEO prompt, including optional date, engines, and cited-only filters.
get_aeo_rankings_by_topic
ChatGPTReturns AEO topic rankings, including the top brands per topic and the brand status for each topic.
get_aeo_share_of_voice
ChatGPTReturns AEO share-of-voice vs competitors for a brand: { bars, others, expandedBars, expandedOthers, ourBrand, brandPinnedSeparately, totalTrackedCompetitors, mentionsToNextRank }.
get_aeo_topics_strategy
ChatGPTReturns defend-versus-invest topic strategy buckets for AEO citation performance.
get_aeo_tracking_config
ChatGPTReturns the current AEO citation tracking configuration for a brand.
get_audience_profile
ChatGPTReturns a brand's full audience profile, including positioning, targeting, and provenance metadata. languages are codes: en (English) or fr-CA (Quebec French).
get_audience_profile_change_log
ChatGPTReturns the change history of a brand's audience profile: one entry per create/update/delete, including which fields changed, which user made the change, and whether it came through the API or MCP.
get_available_date_range
ChatGPTReturns the earliest and latest analytics dates currently available for a brand.
get_backlink_backfill_status
ChatGPTReturns the backlink backfill status for a brand, including whether an initial backfill exists and the latest synced date.
get_backlink_date_range
ChatGPTReturns the earliest and latest backlink metric dates currently available for a brand.
get_backlink_tiles
ChatGPTReturns backlink summary tiles for a brand, including total backlinks, referring domains, and the new-versus-lost counts in the selected date range.
get_backlink_trends
ChatGPTReturns backlink and referring-domain trend series for a brand over time, including new and lost counts.
get_blog_config
ChatGPTReturns the brand's blog generation settings: brandContext (what every generated blog is written from), brandImageGuidelines (how generated images should look), thumbnailAspectRatio and bodyImageAspectRatio (width:height of generated images) and ctaButton (whether a call-to-action button is appended after each blog, and its colours, border radius, font weight and font size). ctaButtonAvailable is false for brands not on a custom website, where ctaButton and bodyImageAspectRatio are null and cannot be set; there thumbnailAspectRatio applies to every generated image.
get_blog_generation_job
ChatGPTReturns one blog-generation job plus its ordered phase breakdown and latest saved context.
get_brand_integrations
ChatGPTReturns the configured SEO integrations for a brand, including active GA4 and GSC connection metadata already stored in Goblinkly.
get_brand_task
ChatGPTOne task in full, including its comment thread and its field-change history — who reassigned it, who moved it to blocked, and when. The brand is read off the task itself, so no brandId is needed. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
get_competitor
ChatGPTReturns one competitor by id, including its social profiles. Requires the brandId the competitor belongs to.
get_custom_blog
ChatGPTReturns the full custom-website blog record for one Goblinkly blog id.
get_custom_blogs_bulk
ChatGPTReturns full custom-website blog records (same shape as get_custom_blog) for up to 25 blog ids in one call, all from the same brand. Use for fetching a batch of blogs at once instead of one get_custom_blog call per id.
get_dashboard_tiles
ChatGPTReturns aggregated dashboard tile metrics for a brand over the requested date range.
get_design_guideline
ChatGPTReturns the brand design guideline (Brand Settings → Design): the brand's one set of design tokens, which the blog CTA button, newsletter emails and the newsletter signup form use whenever their own style fields are empty. tokens maps each key to its value, its origin (edited = a user override, ai = the latest extraction, cta = carried over from the old blog CTA style, default = neutral built-in) and base (the value a reset returns to). suggestions are edited tokens whose latest AI value differs. Also returns customCss, the extraction status (none, ok, partial, failed) with failureReason, coreMissing (the core tokens no extraction has found; any make a result partial), lastExtractedAt, tokensFound, the brand websiteLink and sourceUrls, and the compiled stylesheet's size and hash.
get_ga4_custom_report
ChatGPTFetches a GA4 Data API report for a brand using a curated dimension allowlist and any standard GA4 metric name, live from Google, capped on dimensions/metrics/date range/rows. For the specific shape of a plain date series with only the sessions/engagedSessions metrics, may return a previously stored daily snapshot instead of a live call — that snapshot's organicSessions/aeoSessions are the organic-search and AI-answer-engine traffic segments only, not total property traffic. Every other dimension/metric combination is always a live call. Optionally narrow server-side with filterDimension/filterValues (in-list match, OR semantics) — filterDimension must also be one of the allowed dimensions, and need not be one of the displayed "dimensions". Filtering on "date" requires filterValues in the same YYYY-MM-DD format as startDate/endDate. A filter forces a live call even for the plain date-series shape. On an error, read "suggestedAction" in the response body — for a bad/disallowed/incompatible dimension, metric, filter, date range, or limit, it tells you exactly what to change; retry with a corrected call rather than giving up or asking the user to rephrase. For rate-limiting or a GA4/system-level failure, it says not to retry — surface that message to the user as-is instead.
get_ga4_key_events
ChatGPTReturns the GA4 key events (conversions) configured on a brand's connected GA4 property.
get_ga4_live_traffic_metrics
ChatGPTFetches live GA4 organic and AEO traffic metrics for a brand through Goblinkly using the brand stored Google OAuth tokens.
get_ga4_sync_health
ChatGPTCompares Goblinkly stored GA4 data against Google Analytics itself for a date range, returning per-day organic and AEO session drift beyond normal noise. Use this to check whether a reported dashboard discrepancy is actually a sync problem.
get_gsc_custom_report
ChatGPTFetches a Search Console searchanalytics report for a brand using any combination of GSC's dimensions (date, page, query, country, device, searchAppearance — no cap on how many you combine, this is the whole vocabulary), live from Google, capped on date range/rows. For dimensions=["date"] or ["date","query"], may return previously stored data instead of a live call when the range is fully synced ("date" alone gives clicks/impressions/position only, no ctr; "date"+"query" gives all 4 metrics same as get_gsc_queries) — every other dimension combination (page/country/device breakdowns, which are never stored locally) is always a live call. Rows are sorted by clicks descending, or by date ascending if "date" is one of the dimensions (Google has no other sort control). A response capped at "limit" rows may be hiding more — check "hasMore": if true, issue another call with "startRow" set to the returned "nextStartRow" to fetch the next page, and repeat until "hasMore" is false, so no data silently goes missing; each page is one independent call against GSC's generous 1,200-queries-per-minute quota. Optionally narrow server-side with filterDimension/filterOperator/filterValue — GSC only supports a single value per filter (no OR-of-many-values like the GA4 custom tool); filterOperator defaults to "equals" and also accepts contains/notContains/notEquals/includingRegex/excludingRegex. Combining "page" and "query" together is Google's most expensive query shape (a separate load quota from the request-rate limit), so that combination gets a shorter maximum date range. On an error, read "suggestedAction" in the response body — for a bad/disallowed dimension, filter, date range, or limit, it tells you exactly what to change; retry with a corrected call rather than giving up or asking the user to rephrase. For rate-limiting or a GSC/system-level failure, it says not to retry — surface that message to the user as-is instead.
get_gsc_queries
ChatGPTReturns paginated Google Search Console query rows from Goblinkly synced data for a brand.
get_gsc_sync_health
ChatGPTCompares Goblinkly stored Search Console data against Search Console itself for a date range, returning both sides of the keyword count, clicks and impressions plus the drift between them. Use this to check whether a reported dashboard discrepancy is actually a sync problem.
get_keyword_distribution
ChatGPTReturns the keyword position distribution for a brand across the selected date range. Each keyword is bucketed by its impressions-weighted average position, matching how Search Console reports position.
get_keyword_trends
ChatGPTReturns keyword count trend data for a brand over time.
get_monthly_report
ChatGPTReturns one Goblinkly monthly report by id, including its brand, period, status, pdfUrl and the upload/approval/send audit stamps. A superadmin can read any report at any status. Any other user must also pass brandId and can only read a report that is approved or sent.
get_shopify_blog
ChatGPTReturns the full Shopify blog row for one Goblinkly Shopify blog id, including publishState and syncStatus.
get_shopify_blogs_bulk
ChatGPTReturns full Shopify blog records for up to 25 ids in one call. Pass blogIds for posts Goblinkly created. Pass brandId + shopifyArticleIds instead for posts written directly in Shopify (no Goblinkly row) — those come back read straight from Shopify, including their search-engine title and description.
get_shopify_page
ChatGPTReturns one Shopify page with its full body HTML, for a fix inside the page's text (a broken link, a stray H1). Take pageId from list_shopify_pages.
get_site_audit_blog_issue_map
ChatGPTEvery currently-failing check fixed inside blog posts (title tags, meta descriptions, h1s, duplicate tags, broken links, mixed content, image alt text, heading structure, question headings, vague or identical link text, broken images, near-duplicate text, pages competing for the same searches, thin/crawled-not-indexed posts, duplicate-canonical pages), grouped by the Goblinkly blog it lands on instead of by checkKey, with each page's own finding in detail where the audit has one. One call in place of resolving each affected URL to a blog individually via list_custom_blogs. Also returns any affected URL that couldn't be matched to exactly one blog (a non-blog page, a Webflow or Shopify post that couldn't be matched, or a same-slug data anomaly) under unresolved.
get_site_audit_brand_overview
ChatGPT[Superadmin] Returns the merged brand-level site-audit row: TLS, robots.txt, sitemap, security headers, and Core Web Vitals.
get_site_audit_category_summary
ChatGPTReturns the severity/category rollup for a brand's latest site-audit run, plus the delta versus the previous run.
get_site_audit_check_detail
ChatGPTReturns full expanded detail for one site-audit check: why/how-to-fix copy plus its affected URLs, link pairs, or sliders.
get_site_audit_checklist
ChatGPTReturns the whole-audit checklist from a brand's latest completed site-audit run (list view only, no per-check detail).
get_site_audit_fix_playbook
ChatGPTSTART HERE whenever the user asks to fix, resolve or clean up site-audit or SEO issues for a brand. Returns the step-by-step playbook for that brand as markdown: only the checks failing on its latest audit, each routed to how it gets fixed (inside blog posts, in the website code, in Webflow or Shopify settings, as notes for a developer, or the owner's own action), plus the rules, stages and exact Goblinkly tools to use. Follow it step by step; if a fix-site-audit-issues skill is already driving the sweep, follow that instead of mixing the two (that skill hands Shopify brands to this playbook). Before calling: resolve the brand (list_accessible_brands if the user named it or gave none), and choose mode — if you can edit files, ask the user once whether the open codebase is this brand's live website. Call again with mode 'repo' if they open the site's code later.
get_site_audit_progress
ChatGPTReturns the estimated progress percentage and status of a brand's most recent site-audit run.
get_site_audit_run_logs
ChatGPT[Superadmin] Raw site-audit run log listing for a brand.
get_site_audit_sync_status
ChatGPTReturns the last site-audit sync info, manual re-checks used today, and the next scheduled sync for a brand.
get_site_audit_url_detail
ChatGPT[Superadmin] Returns one URL's full site-audit row plus its complete derived issue list.
get_source_summary
ChatGPTReturns the headline Sources numbers for a brand: how many of the cited pages in its category it appears on out of the pages we can answer for, how many unread pages are left, how many third-party domains those pages sit on, its own site's citations with the share of citations that are third-party, and the top gap — the workable domain with the most missed citation weight, never a competitor-owned one. Note that citedDomains, presence and formatCounts count the whole category, competitor-owned domains included, so citedDomains is not the length of what list_source_domains returns. Also returns the per-format page counts and the competitor roster whose ids the other two tools report presence against. Takes no format filter: the headline is the finding, and a filter narrows what you work rather than what is true. These are source-level gaps — the pages and domains AI answers cite in this brand's category, and whether the brand appears on them. They are not get_aeo_citation_gaps, which returns prompt-level gaps (prompts where the brand is not cited but competitors are). Windows: dateFrom/dateTo are inclusive YYYY-MM-DD; omitting both gives the last 28 days ending at the brand's last synced day rather than today, and any window is clamped to 90 days. Every response reports the window it was actually answered over.
get_traffic_trends
ChatGPTReturns organic traffic, impressions, and clicks trend data for a brand over time.
get_webflow_blog
ChatGPTReturns the full Webflow blog row for one Goblinkly webflow blog id.
get_webflow_blogs_bulk
ChatGPTReturns full Webflow blog records for up to 25 ids in one call. Pass blogIds for blogs Goblinkly created. Pass brandId + webflowItemIds instead for posts that are live on Webflow but were never created through Goblinkly (no matching row) — those come back read directly from Webflow, not from Goblinkly's database.
list_accessible_brands
ChatGPTReturns the brands this Goblinkly user can read through MCP. Superadmins receive all brands; normal users receive only assigned brands.
list_aeo_prompts
ChatGPTLists AEO prompts with citation stats, filters, sorting, and pagination for a brand.
list_aeo_topics
ChatGPTLists AEO citation-tracking topics for a brand, each with its prompt count and average citation rate over the given window, ordered by citation rate descending. Always includes a synthetic "Uncategorized" bucket (id -1) for prompts with no topic.
list_audience_profiles
ChatGPTLists a brand's audience profile (the target audience, positioning and messaging GoBlinkly writes for): id and audience label only. Each brand has exactly one.
list_backlinks
ChatGPTReturns individual backlinks pointing at a brand, with source domain, anchor text, target URL, domain rank, dofollow flag and first-seen date. Supports paging, sorting and filtering by status or follow type.
list_blog_generation_jobs
ChatGPTLists recent blog-generation jobs for a brand, including queued, running, paused, completed, and failed work.
list_brand_images
ChatGPTLists the images in the brand's image library (Image Library on the Blogs page), newest first. Each image has an id, imageUrl, fileName, width and height, altText (placed on the image in blogs), caption (the description AI matches blog topics against), usageCount and lastUsedAt. unusedOnly keeps only images no blog has used yet. Any brand member can read it.
list_brand_note_tasks
ChatGPTThe tasks that came out of one timeline note — the expansion behind its rollup. The brand is read off the note itself, so no brandId is needed. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
list_brand_notes
ChatGPTA brand's timeline: call recaps, decisions and working notes, pinned entry first then newest. Each entry carries its body, its type (note, decision, call_recap), when it happened, its author, and a rollup of the tasks hanging off it. hasOpenTasks narrows to the entries with work still outstanding. Returns { data, meta } with meta holding the pagination totals. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
list_brand_tasks
ChatGPTLists a brand's tasks — the board under Growth. Each row carries the title, status (todo, in_progress, blocked, done, cancelled), priority, assignee, due date, the note it came out of, and the cited Sources pages it is work on. Filter by status for one column, or statusGroup for open (todo/in_progress/blocked) or closed (done/cancelled). sourcePageId narrows to the work on one cited page, which is what the Sources drawer lists. overdue returns work past its due date that is not already finished. Returns { data, meta } with meta holding the pagination totals. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
list_competitor_suggestions
ChatGPTLists companies AI answers keep naming as options for the brand's buyers that are not on the watchlist yet — the same queue as the app's Suggested Competitors screen. Each row carries nameVerbatim (exact text as answered, case-sensitive), namedInAnswerCount and samplePromptIds (up to 10) over the current 28-day evidence window, firstSeenAt, status and, once decided, decidedAt/decidedBy. Only names past an evidence floor surface as pending, so this is not every unrecognised name ever seen, just the ones worth a decision. status defaults to pending; pass declined to see rejected names, which stay excluded from suggestions until someone re-approves them. Returns { data, meta } with meta holding the pagination totals. Read-only — approving or rejecting one happens in the app, not through this tool.
list_competitors
ChatGPTLists a brand's tracked competitors. This is the single competitor set the rest of Goblinkly reads from: AEO share of voice and rankings, Demand Intelligence mention attribution, and the competitor names blog generation is allowed to mention. Each row carries name, websiteUrl, logoUrl, aliases (other names the same company is answered by), hashtags, social profiles, source (manual or automatic, the latter meaning it came from an accepted Demand Intelligence suggestion) and excludeFromBlogs. Supports a name search, a social-platform filter and pagination. Returns { data, meta } with meta holding the pagination totals.
list_custom_blogs
ChatGPTLists custom-website blogs for a brand, including draft, scheduled, and published rows depending on the requested filter. Pass uriSlug for an exact match — the reliable way to resolve a known URL/slug to its blog, since title is a fuzzy search and isn't guaranteed unique.
list_milestone_logs
ChatGPT[Superadmin] Lists the milestones fired for a brand by the weekly milestone digest, most recent first — each row carries its milestoneType, weekOf, payload, whether it was the digest's featured milestone, and firedAt. Returns { data, meta } with meta holding the pagination totals.
list_monthly_reports
ChatGPTLists Goblinkly monthly reports — the PDF deliverable written off-platform, uploaded, reviewed and emailed to a brand once a month. A superadmin sees the whole review queue across every brand and status (awaiting_upload, pending_review, rejected, approved, sent) and may filter by brandId, periodMonth and status. Any other user must pass brandId and only ever sees that brand's approved and sent reports — the earlier statuses are the review queue and are not visible to them. Each row carries its own pdfUrl; that link is how the report is read or downloaded, the file itself is not stored in Goblinkly. Returns { data, meta } with meta holding the pagination totals. A rejected row carries the reviewer's rejectionReason.
list_shopify_blogs
ChatGPTLists the brand's Shopify blog rows for the currently connected Shopify site, with optional filtering by publishState (DRAFT, SCHEDULED, PUBLISHED). Posts made for a different Shopify site stay stored but are not listed.
list_shopify_pages
ChatGPTLists a Shopify site's own pages (About, Contact …, served under /pages/<handle>) — not blog posts, products or collections. Returns each page's id, handle, path, whether it is visible, and its current search-engine title and description, so a page-level finding from a site audit can be matched to the page that owns it.
list_site_audit_urls
ChatGPT[Superadmin] Paginated list of every URL in the sitemap for a brand, with a lightweight issue summary per URL.
list_source_domains
ChatGPTLists the cited domains in a brand's category, ranked most-missed first — the outreach queue. Each row carries the domain's citation and cited-page counts, the page formats found on it, its ownership rung (you / competitor / other_vendor / independent / unknown, or null where nothing has placed it yet), how many of its cited pages the brand is present on out of the ones we can answer for, the same fraction per competitor column, and missedWeight — the score the ranking uses, citations x (known - present) / known — so effort can be allocated proportionally rather than by rank alone. By default this is the worklist, so competitor-owned domains are NOT in it: they are evidence of who is winning a source rather than work, because no amount of outreach gets a brand onto a rival's marketing site. Pass ownership=competitor to read that set instead — it is the second tab the Sources page shows. Any explicit ownership answers for that one rung rather than for the worklist; ownership=you is the one exception and returns nothing, because the brand's own domain is never a row here — read ownDomain for it. The brand's own domain is NOT among the rows — it is not work and is not ranked against the sources that are. It is returned as the ownDomain field instead, which no filter, ranking or page boundary removes, so third-party citation share stays computable from any single response. It carries isOwnDomain true, has no presence or missedWeight (being on your own page is not a finding) and is never narrowed by format. Other filters: platforms for one or more engines, format for one page format, independentOnly to hide every rung shown to be somebody's marketing (domains we could not classify are kept), gapsOnly for the rows worth working (pages we cannot answer for are kept — an unread page is exactly what that surfaces). Returns { data, meta } with meta holding the pagination totals over the filtered list. These are source-level gaps — the pages and domains AI answers cite in this brand's category, and whether the brand appears on them. They are not get_aeo_citation_gaps, which returns prompt-level gaps (prompts where the brand is not cited but competitors are). Windows: dateFrom/dateTo are inclusive YYYY-MM-DD; omitting both gives the last 28 days ending at the brand's last synced day rather than today, and any window is clamped to 90 days. Every response reports the window it was actually answered over.
list_source_pages
ChatGPTLists individual cited pages for a brand, flat across every domain and ranked by citation count — the level one outreach motion is worked at ("every independent listicle I am absent from, regardless of publisher"). Each row carries the page URL and path, its title, its citation count, its format, whether the brand is present on it (absent, present, or unknown where we could not read the page — the reason it is unknown is deliberately not reported, being an operator signal about our own crawl rather than a fact about the brand), the same per competitor id in competitorIds, and the page's domain and that domain's ownership rung. Pass domain to get one domain's cited pages instead — the drilldown behind a queue row. The domain is then named once at the top level rather than on every row, its ownership rung comes from list_source_domains, and scope / independentOnly / gapsOnly are rejected: those are properties of a domain, and a read already scoped to one has no tab to pick. q is rejected with domain too — the drilldown is a different read and takes no search term. Filters without a domain: platforms, format, scope (queue, the default, or competitor for the competitor-owned pages), independentOnly, and gapsOnly (no effect on the competitor tab, which is evidence rather than a worklist). Pass q to search: a case-insensitive literal substring of a page's domain or path, narrowing the rows and both tabTotals alike. Page titles are not searched. tabTotals reports what both tabs hold under the same filters. The brand's own pages are in neither tab — pass domain with the brand's own domain to list those. Returns { data, meta } with meta holding the pagination totals. These are source-level gaps — the pages and domains AI answers cite in this brand's category, and whether the brand appears on them. They are not get_aeo_citation_gaps, which returns prompt-level gaps (prompts where the brand is not cited but competitors are). Windows: dateFrom/dateTo are inclusive YYYY-MM-DD; omitting both gives the last 28 days ending at the brand's last synced day rather than today, and any window is clamped to 90 days. Every response reports the window it was actually answered over.
list_webflow_blogs
ChatGPTLists Webflow blog rows for a brand, with optional filtering by draft, published, or scheduled Webflow state.
list_webflow_pages
ChatGPTLists a Webflow site's static pages — the site's own pages (home, /about-us, /featured-works/*), not CMS blog posts. Returns each page's id, slug, publishedPath, draft/archived flags and current SEO title and meta description, so a page-level title or meta problem from a site audit can be matched to the page that owns it. Pages whose collectionId is set are CMS template pages; edit those posts through update_webflow_blog instead. Requires the Webflow connection to have been authorized with the pages:read scope — a connection made before that scope was requested returns a missing_scopes error and has to be reconnected.
publish_custom_blog
ChatGPTMarks a completed custom-website blog as published in Goblinkly, with optional immediate or future publish dates.
publish_shopify_blog
ChatGPTSends a completed Goblinkly Shopify post to Shopify and makes it visible now (also replaces a scheduled date).
publish_webflow_blog
ChatGPTQueues an immediate Webflow publish for a Goblinkly Webflow blog row.
reject_competitor_suggestion
ChatGPTRejects a competitor suggestion. The name is never suggested again on its own — it moves to the rejected list, and only approving it from there brings it back.
reject_monthly_report
ChatGPT[Superadmin] Rejects a pending_review monthly report, optionally with a reason describing what must change. The report stays hidden from the client until a new PDF is uploaded and approved.
reset_design_tokens
ChatGPTDrops the user override on each token named, so it returns to its AI, From CTA or default value (the base in get_design_guideline). Also how to accept an AI suggestion. Owners and admins only.
resume_blog_generation_job
ChatGPTResumes a paused or failed blog-generation job into a fresh queued job, with optional phase controls.
retry_blog_generation_job
ChatGPTRetries a failed blog-generation job, optionally restarting from a specific phase.
schedule_shopify_blog_publish
ChatGPTSchedules a completed, not-yet-visible Shopify post. The date is set on Shopify itself, so it also shows in the client's Shopify admin and Shopify publishes it at that time.
schedule_webflow_blog_publish
ChatGPTSchedules a future Webflow publish time for a completed Webflow blog draft.
seed_monthly_reports
ChatGPT[Superadmin] Makes sure every client brand (not prospects) has a monthly report row for a period, creating awaiting_upload rows only where none exist. periodMonth is YYYY-MM and defaults to the month that just ended. Safe to repeat. Returns created and skipped counts.
unpublish_custom_blog
ChatGPTMoves a custom-website blog back to draft in Goblinkly so it no longer counts as published content.
unpublish_shopify_blog
ChatGPTHides a published Shopify post on the site. The post stays on Shopify as hidden and in Goblinkly.
unpublish_webflow_blog
ChatGPTQueues an unpublish action for a Webflow blog that is already live in Webflow.
update_aeo_topic
ChatGPTRenames an existing AEO citation-tracking topic.
update_audience_profile
ChatGPTUpdates fields on a brand's audience profile. Requires access to the brand. IMPORTANT: legalName is one of the names AI answers are matched against to decide a mention is yours. Setting or changing it re-checks every answer already recorded, so past citations, share of voice and rankings can all shift, and the numbers the user has been reading will move. Confirm with the user before calling this with legalName; the other fields are safe to write without asking. The brand name, website and aliases are not brain fields and cannot be set here.
update_blog_config
ChatGPTUpdates the brand's blog generation settings. Only the fields passed are written. brandContext and brandImageGuidelines replace the stored text in full, so read it with get_blog_config first and send the merged version rather than only the new part. The cta fields configure the CTA button (a call-to-action button appended after the conclusion of every generated blog): ctaEnabled turns the CTA button on or off, and the ctaButton fields set its colours, border radius, font weight and font size. The style fields write the brand design guideline's button tokens (Brand Settings → Design), so they also restyle the newsletter and signup form buttons that follow the guideline. Like the Design tab, they need the owner or admin role, and they can only be set for brands whose blogs are on a custom website. The CTA button styling takes effect only while ctaEnabled is true. thumbnailAspectRatio and bodyImageAspectRatio set the width:height of generated images (1:1, 16:9, 4:3, 3:2 or 9:16). bodyImageAspectRatio is custom-website brands only; on other brands thumbnailAspectRatio is used for every image. Changes apply to blogs generated from now on, not to existing ones.
update_brand_image
ChatGPTEdits a library image's description or alt text. caption is what the image shows, and AI matches blog topics against it. altText goes on the image in blogs (up to 255 characters). Pass only the fields to change. Get imageId from list_brand_images. Content writers, owners and admins only.
update_brand_task
ChatGPTEdits a task. Only the fields passed are written, so a partial call cannot overwrite someone else's change to a field it does not name. The brand is read off the task, so a task cannot be moved between brands. Setting status to done stamps its completion time; sourcePageIds replaces the linked pages whole rather than adding to them. Every change is recorded in the task history get_brand_task returns. Requires owner, admin or content editor on the brand; an analyst is refused, the same way the Tasks and Notes pages refuse one.
update_competitor
ChatGPTUpdates a competitor. Only the fields passed are changed, except that aliases, hashtags and socials each replace the stored list wholesale, so send the full intended array (read it back with get_competitor first). logoUrl is refetched when websiteUrl changes and no new logoUrl is given; pass websiteUrl: null to clear it (the logo is cleared too). Requires owner, admin or analyst on the brand. IMPORTANT: name and aliases are the names this competitor is matched against in AI answers. Setting or changing either re-checks every answer already recorded, so mentions can move to this competitor or away from it, and past share of voice and rankings shift with them. Confirm with the user before renaming a competitor or editing its aliases; websiteUrl, logoUrl, hashtags, socials and excludeFromBlogs are safe to write without asking.
update_custom_blog
ChatGPTEdits a custom-website blog's content in Goblinkly — title, meta title, slug, meta description, h1, body, or images. Changing title without h1 also sets h1 to the same text. Does not change publish state; use publish_custom_blog/unpublish_custom_blog for that.
update_design_guideline
ChatGPTChanges the brand design guideline's tokens and custom CSS. tokens sets only the keys passed, as user overrides (origin edited); every other token keeps its value. An invalid value rejects the whole call and nothing is saved. customCss, when passed, replaces the stored custom CSS in full (read it with get_design_guideline first); it is scoped under .gb-page: every rule applies only inside the page, & is the page itself (& {…}, &::before), nested rules are flattened, and a selector reaching outside the page (body + footer) is dropped. Prefer the page variables over fixed values: --gb-text, --gb-muted, --gb-heading, --gb-bg, --gb-surface, --gb-border, --gb-primary, --gb-on-primary, --gb-link, --gb-link-hover, --gb-accent, --gb-font-body, --gb-font-heading, --gb-font-mono, --gb-space, --gb-r-sm, --gb-r-lg. @import, off-site url(), style tags, expression() and at-rules other than @media, @supports, @container, @layer, @starting-style, @font-face and @keyframes are removed, listed in warnings. Owners and admins only. Takes effect at once for blog CTAs generated from now on and for newsletters and signup forms that follow the guideline. Tokens: - text: hex colour, "#rrggbb" — body text colour - muted: hex colour, "#rrggbb" — secondary text (captions, meta) - heading: hex colour, "#rrggbb" — heading colour - bg: hex colour, "#rrggbb" — page background - surface: hex colour, "#rrggbb" — card, callout and table-head background - border: hex colour, "#rrggbb" — hairline border colour - primary: hex colour, "#rrggbb" — main brand colour - onPrimary: hex colour, "#rrggbb" — text on the primary colour - link: hex colour, "#rrggbb" — link colour - linkHover: hex colour, "#rrggbb" — link hover colour - accent: hex colour, "#rrggbb" — secondary brand colour, list markers - bodyFont: font family name only, e.g. "Inter" (no fallbacks or quotes); "System UI" for the platform font, "System mono" for the platform monospace — body font - headingFont: font family name only, e.g. "Inter" (no fallbacks or quotes); "System UI" for the platform font, "System mono" for the platform monospace — heading font - monoFont: font family name only, e.g. "Inter" (no fallbacks or quotes); "System UI" for the platform font, "System mono" for the platform monospace — code font - fontSource: one of "google", "inherit", "system" — google when the fonts load from fonts.googleapis.com, inherit when the site self-hosts them, system when it uses platform fonts - baseSize: number of px, 10–32 — body font size - lineHeight: number, 1–2.4 — body line height, unitless - h1Size: number of px, 10–120 - h1Weight: one of "400", "500", "600", "700", "800" - h2Size: number of px, 10–120 - h2Weight: one of "400", "500", "600", "700", "800" - h3Size: number of px, 10–120 - h3Weight: one of "400", "500", "600", "700", "800" - h4Size: number of px, 10–120 - h4Weight: one of "400", "500", "600", "700", "800" - tracking: number, -0.08–0.1 — heading letter-spacing in em - width: number of px, 480–960 — max width of the article's text column (typically 640-800), from the blog post or prose container; never the site's page container - space: number of px, 6–16 — the base unit of the vertical rhythm between blocks, typically 8 (a paragraph gap of 16, section gaps of about 48); not a utility framework step such as 4px or 0.25rem - radiusSm: number of px, 0–9999 — small radius (inputs, tables) - radiusLg: number of px, 0–9999 — large radius (cards, callouts) - btnBg: hex colour, "#rrggbb" — primary button background - btnText: hex colour, "#rrggbb" — primary button text - btnPad: one of "compact", "regular", "roomy" — button padding preset: compact = 8px 14px, regular = 11px 20px, roomy = 14px 26px - btnRadius: number of px, 0–9999 — button radius; 999 for a pill - btnWeight: one of "400", "500", "600", "700", "800" - btnSize: number of px, 10–32 - underline: true or false — whether body links are underlined - stripes: true or false — whether tables have striped rows - tableLines: one of "rows", "grid", "outline" — how the table is ruled inside its frame (the frame is always drawn): rows…
update_shopify_blog
ChatGPTEdits a Shopify blog post's content — title (the post heading/H1), metaTitle (search-result title), metaDescription, summary, or body. Every Shopify post has these same fields, so nothing is skipped. Provide blogId for a post Goblinkly created: the change is saved in Goblinkly and, if the post is already on Shopify, sent there (waits briefly: confirmed once Shopify has it, pending if still sending, failed with lastError if sending failed). Provide brandId + shopifyArticleId instead for a post written directly in Shopify — that writes straight to Shopify, never creates a Goblinkly row, and re-reads to report confirmed and any unconfirmedFields. Does not change whether the post is visible.
update_shopify_blog_schedule
ChatGPTChanges the scheduled publish date of a Shopify post that is already scheduled.
update_shopify_page
ChatGPTEdits one Shopify page: its title, its body HTML, and/or its search-engine title (seoTitle) and description (seoDescription). Only the fields you pass change; the response re-reads the page and reports confirmed plus any unconfirmedFields. Send the full new body when changing it (read it first with get_shopify_page).
update_webflow_blog
ChatGPTEdits a Webflow blog's content — title, meta description, h1, body, or individual body sections. Each field is resolved to this brand's actual Webflow schema; a field the schema doesn't expose is skipped and reported in skippedFields rather than guessed. Use body when the collection stores the article in one field. When the article is split across section fields (e.g. content-1, content-2 …), body cannot be placed and is skipped — use bodySections instead: a { fieldSlug: newValue } map that rewrites named sections only, so a surgical fix (a dead link, a stray h1) touches one field and leaves the rest untouched. The skipped-body message lists this collection's writable section slugs, and get_webflow_blogs_bulk returns their current values. A slug that isn't an article body field is refused, not written. body and bodySections are mutually exclusive. Provide blogId for a blog Goblinkly created (waits for the live push to settle before returning). Provide brandId + webflowItemId instead for a post that's live on Webflow but was never created through Goblinkly — that path writes straight to Webflow's API and never creates a Goblinkly row. Does not change publish state, but an already-live item is republished so the edit goes live.
update_webflow_blog_schedule
ChatGPTChanges the scheduled publish time for a Webflow blog that already has a future publish queued.
update_webflow_page_seo
ChatGPTSets the SEO title and/or meta description on one Webflow static page — the fix for a page-level title_tag_issues or meta_description_issues finding on a non-blog page. Take pageId from list_webflow_pages. Only the fields you pass are changed; the response re-reads the page and reports confirmed. This edits page metadata only — it cannot change text inside the page (a broken link, a duplicate h1), because Webflow's static-content API requires a secondary locale and so can't touch a single-locale site's pages at all; those stay a manual Designer fix. Requires the pages:write scope on the Webflow connection.
upload_brand_images
ChatGPTAdds images to the brand's image library. Blogs set to use the image library pick from it. Two ways to give it images, which can be mixed in one call: urls, public http(s) links the server downloads itself (not Google Drive share links, which return a web page), and files, images you already hold as base64 (for example read from the user's Google Drive with a Drive connector: list the folder, download each image, pass its bytes here). Prefer urls when a public link exists, because base64 puts the whole image into the conversation. Only JPG, PNG or WebP up to 10 MB each, 20 images per call and 3 inline files per call (send more in further calls). The type is read from the file itself. Each image is described automatically (altText and caption) so the AI knows which blogs it fits; change either with update_brand_image. The call fails as a whole if any image is rejected, and nothing is added. Content writers, owners and admins only.
cancel_webflow_blog_schedule
Claudecreate_custom_blog
Claudecreate_webflow_blog
Claudeget_aeo_analytics
Claudeget_aeo_citation_gaps
Claudeget_aeo_citation_trend
Claudeget_aeo_dashboard_kpis
Claudeget_aeo_data_range
Claudeget_aeo_prompt_runs
Claudeget_aeo_rankings_by_topic
Claudeget_aeo_share_of_voice
Claudeget_aeo_topics_strategy
Claudeget_aeo_tracking_config
Claudeget_available_date_range
Claudeget_blog_generation_job
Claudeget_brand_integrations
Claudeget_custom_blog
Claudeget_dashboard_tiles
Claudeget_ga4_live_traffic_metrics
Claudeget_gsc_queries
Claudeget_keyword_distribution
Claudeget_keyword_trends
Claudeget_traffic_trends
Claudeget_webflow_blog
Claudelist_accessible_brands
Claudelist_aeo_prompts
Claudelist_blog_generation_jobs
Claudelist_custom_blogs
Claudelist_webflow_blogs
Claudepublish_custom_blog
Claudepublish_webflow_blog
Clauderesume_blog_generation_job
Clauderetry_blog_generation_job
Claudeschedule_webflow_blog_publish
Claudeunpublish_custom_blog
Claudeunpublish_webflow_blog
Claudeupdate_webflow_blog_schedule
Claude