{"name":"convertlyft","api_version":"2026-10-09","origin":"https://convertlyft.com","read_only":false,"writes":{"tools":["cvl_change_preview","cvl_change_apply","cvl_change_undo","cvl_remember","cvl_propose","cvl_operator_run","cvl_run_crawl","cvl_error_fix_shipped","cvl_crawl_start","cvl_seo_track_keywords","cvl_seo_untrack_keywords","cvl_seo_set_competitor_state","cvl_seo_opportunity_track","cvl_seo_set_keyword_money","cvl_seo_map_keyword_page","cvl_seo_add_keywords","cvl_seo_run_flow","cvl_seo_make_brief","cvl_seo_serp","cvl_seo_keyword_ideas","cvl_seo_keyword_metrics","cvl_seo_domain_overview","cvl_seo_competitor_gap","cvl_seo_backlink_profile","cvl_seo_link_gap","cvl_seo_ai_mentions"],"endpoints":[{"path":"/api/memory","method":"POST","scopes":["memory:write"],"what":"Append one row to this workspace’s decision ledger — a finding, a decision, a preference or a question. It records what you concluded; it changes no measurement."},{"path":"/api/operator/run","method":"POST","scopes":["operator:run"],"what":"Start today’s run for this workspace, or attach to the one already going. It queues the work; the worker does it. The workspace comes from the token, and a run only starts if this workspace has a schedule."},{"path":"/api/crawl","method":"POST","scopes":["crawl:run"],"what":"Start a crawl of any public site: {\"url\": \"https://example.com\", \"limit\": 100, \"depth\": 3, \"mode\": \"full\"|\"links\", \"render\": \"auto\"|\"always\"|\"never\", \"webhook\": \"https://…\"}. Answers 202 with crawl_id. Obeys robots.txt, never fetches private addresses, runs no AI on the pages. One running per workspace (an SEO-tab crawl counts), 500 pages per crawl, and failed pages (4xx, 5xx, timeouts) do not count against the 500; past a limit, a 429 names the bucket. Send an Idempotency-Key header to make a retry safe: the same key and body within 24 hours answer the first 202 again and start no second crawl; the same key with a different body is a 422."},{"path":"/api/tools/[name]","method":"POST","scopes":["seo:write"],"what":"The SEO room’s writes that buy nothing (opt-in seo:write), by tool name, arguments as a JSON body: cvl_seo_track_keywords, cvl_seo_untrack_keywords, cvl_seo_set_competitor_state, cvl_seo_opportunity_track, cvl_seo_set_keyword_money, cvl_seo_map_keyword_page, cvl_seo_add_keywords. Also reachable as POST /api/seo/<action>. Nothing on the site changes and nothing is bought."}],"scopes":["changes:write","crawl:run","issues:write","memory:write","operator:run","proposals:write","seo:write"]},"auth":{"scheme":"Bearer","token_prefix":"cvl_pat_","header_only":true,"device_flow":{"rfc":8628,"start":"/api/tokens/device/code","poll":"/api/tokens/device/token"},"demo_token":null,"demo_token_note":"no demo credential is published in this document; there is no anonymous read, and you need a human once, to mint one"},"endpoints":[{"path":"/api/tools/[name]","method":"GET","scopes":[],"window":"none","what":"Any read tool of the catalogue, by its name — the same reading the MCP door serves, as JSON. Arguments ride the query string; ?fields= narrows the payload."},{"path":"/api/reports/kpi","method":"GET","scopes":["sessions:read","reports:read"],"window":"sealed","what":"The headline numbers — sessions, conversion, revenue, LCP."},{"path":"/api/reports/attribution","method":"GET","scopes":["sessions:read","reports:read"],"window":"sealed","what":"Which sources and campaigns the conversions came from."},{"path":"/api/reports/behavior","method":"GET","scopes":["sessions:read"],"window":"sealed","what":"What people did on the page."},{"path":"/api/reports/paths","method":"GET","scopes":["sessions:read"],"window":"sealed","what":"The routes people take through the site."},{"path":"/api/reports/vitals","method":"GET","scopes":["reports:read"],"window":"sealed","what":"Core Web Vitals as your visitors measured them."},{"path":"/api/reports/errors","method":"GET","scopes":["issues:read","sessions:read"],"window":"sealed","what":"Grouped JavaScript errors and the crash-free rate."},{"path":"/api/reports/heatmap","method":"GET","scopes":["replays:read","sessions:read"],"window":"sealed","what":"Click and pointer density for one page."},{"path":"/api/funnels","method":"GET","scopes":["reports:read"],"window":"none","what":"Which funnels this site has — the ids the three funnel reports below require."},{"path":"/api/funnel-report","method":"GET","scopes":["reports:read"],"window":"from-to","what":"Stage-by-stage funnel counts."},{"path":"/api/funnel-report/drilldown","method":"GET","scopes":["sessions:read"],"window":"from-to","what":"The sessions behind one funnel stage."},{"path":"/api/funnel-report/filter-values","method":"GET","scopes":["reports:read"],"window":"none","what":"The source and campaign values available to filter on."},{"path":"/api/sessions-summary","method":"GET","scopes":["sessions:read"],"window":"none","what":"Session counts. All time — this one takes no range at all."},{"path":"/api/sessions/search","method":"GET","scopes":["sessions:read"],"window":"from-to","what":"The sessions that match a question, with the id each one is read by. An argument outside the documented filter set is a 400 that names it."},{"path":"/api/issues","method":"GET","scopes":["issues:read"],"window":"none","what":"The issue queue."},{"path":"/api/board","method":"GET","scopes":["board:read"],"window":"none","what":"The board — what we found and what it is worth."},{"path":"/api/changes","method":"GET","scopes":["changes:read"],"window":"none","what":"Changes shipped on the site, with their markers."},{"path":"/api/digest","method":"GET","scopes":["reports:read"],"window":"none","what":"The digest a person would have been emailed."},{"path":"/api/events/stream","method":"GET","scopes":["sessions:read"],"window":"none","what":"Live events, server-sent. It does not end — read it as a stream, not with curl."},{"path":"/api/memory","method":"GET","scopes":["memory:read"],"window":"none","what":"What this workspace already concluded — prior findings with the receipt behind each, decisions, preferences, and questions nobody answered. Read it before deriving any of it again."},{"path":"/api/r/[receipt_id]","method":"GET","scopes":[],"window":"none","what":"Re-read a past answer by its receipt id. Needs whatever scopes the original call needed."},{"path":"/api/crawl/[id]","method":"GET","scopes":["reports:read"],"window":"none","what":"Where a crawl this workspace started stands, and a page of its rows: url, status, title, words, findings. ?limit= ?offset= page them; ?format=jsonl answers one JSON object per line."},{"path":"/api/crawl/[id]/page","method":"GET","scopes":["reports:read"],"window":"none","what":"One crawled page (?url=): its main content as Markdown, headings and links. ?screenshot=1 answers the page as a browser draws it, image/jpeg."}],"scopes":["workspaces:read","reports:read","sessions:read","replays:read","issues:read","board:read","changes:read","changes:write","proposals:read","proposals:write","operator:run","memory:read","memory:write","issues:write","crawl:run","seo:write"],"quota":{"per_credential":{"minute":120,"day":20000},"per_credential_per_workspace":{"minute":60,"day":5000},"note":"a 429 body names the breached bucket; Retry-After on the day bucket can be most of a day"},"timestamps":{"format":"strict ISO 8601 with a zone","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:?\\d{2})$","absent_from_means":"all time","date_alone_means":"the whole UTC day: from is its first instant, to its last","expected_lag_seconds":60},"mcp":{"endpoint":"https://mcp.convertlyft.com/mcp","spec_revision":"2025-11-25","tools":[{"name":"cvl_whoami","title":"Who am I","scopes":[]},{"name":"cvl_workspaces_list","title":"List workspaces","scopes":["workspaces:read"]},{"name":"cvl_install_verify","title":"Is the Convertlyft tag working on this site?","scopes":["workspaces:read"]},{"name":"cvl_funnels_list","title":"Which funnels does this workspace have?","scopes":["reports:read"]},{"name":"cvl_issue_detail","title":"One error, in full","scopes":["issues:read","sessions:read"]},{"name":"cvl_sessions_search","title":"Which sessions match this?","scopes":["sessions:read"]},{"name":"cvl_behavior_report","title":"Where do people struggle?","scopes":["sessions:read"]},{"name":"cvl_kpi","title":"Key figures for a window","scopes":["sessions:read","reports:read"]},{"name":"cvl_explain","title":"How is this figure defined?","scopes":["sessions:read","reports:read"]},{"name":"cvl_check_claim","title":"Check a claim against its receipts","scopes":[]},{"name":"cvl_change_preview","title":"Preview a change marker","scopes":["changes:write"]},{"name":"cvl_change_apply","title":"Mark a change","scopes":["changes:write"]},{"name":"cvl_change_undo","title":"Undo a change marker","scopes":["changes:write"]},{"name":"cvl_recall","title":"What this workspace already knows","scopes":["memory:read"]},{"name":"cvl_remember","title":"Record what you concluded","scopes":["memory:write"]},{"name":"cvl_board_list","title":"What is waiting on this workspace","scopes":["board:read"]},{"name":"cvl_proposals_list","title":"What is queued for the owner to decide","scopes":["proposals:read"]},{"name":"cvl_propose","title":"Put a fix in front of the owner","scopes":["proposals:write"]},{"name":"cvl_operator_run","title":"Ask for today’s operator run","scopes":["operator:run"]},{"name":"cvl_sessions_summary","title":"Sessions, all time","scopes":["sessions:read"]},{"name":"cvl_issues_list","title":"JavaScript errors, grouped","scopes":["issues:read"]},{"name":"cvl_replays_list","title":"Session recordings held","scopes":["replays:read"]},{"name":"cvl_connections_list","title":"Connected accounts","scopes":["workspaces:read"]},{"name":"cvl_seo_rank","title":"Search rankings","scopes":["reports:read"]},{"name":"cvl_seo_keywords","title":"Keyword research on file","scopes":["reports:read"]},{"name":"cvl_seo_competitors","title":"Search competitors","scopes":["reports:read"]},{"name":"cvl_seo_backlinks","title":"Backlink standing","scopes":["reports:read"]},{"name":"cvl_seo_audit","title":"Site audit","scopes":["reports:read"]},{"name":"cvl_seo_ai","title":"AI-assistant visibility","scopes":["reports:read"]},{"name":"cvl_dead_clicks","title":"Clicks that got no answer","scopes":["sessions:read"]},{"name":"cvl_rage_clicks","title":"Where people click in frustration","scopes":["sessions:read"]},{"name":"cvl_form_friction","title":"Forms people start and do not finish","scopes":["sessions:read"]},{"name":"cvl_page_attention","title":"How far down a page people get","scopes":["sessions:read"]},{"name":"cvl_watch","title":"What tripped since the last look","scopes":["sessions:read"]},{"name":"cvl_live_feed","title":"What the Live page is showing","scopes":["sessions:read"]},{"name":"cvl_recommendations","title":"What established practice says about this site","scopes":["sessions:read"]},{"name":"cvl_page_conversions","title":"Which pages the converted sessions came from","scopes":["sessions:read"]},{"name":"cvl_page_speed","title":"How fast each page is","scopes":["sessions:read"]},{"name":"cvl_run_crawl","title":"Crawl this site","scopes":["operator:run"]},{"name":"cvl_site_pages","title":"The pages on this site","scopes":["reports:read"]},{"name":"cvl_page_content","title":"What one page says","scopes":["reports:read"]},{"name":"cvl_error_brief","title":"The fix brief for one error","scopes":["issues:read"]},{"name":"cvl_error_fix_shipped","title":"Say the fix for one error is live","scopes":["issues:write"]},{"name":"cvl_crawl_start","title":"Crawl any public site","scopes":["crawl:run"]},{"name":"cvl_crawl_status","title":"Where a crawl stands, and its pages","scopes":["reports:read"]},{"name":"cvl_crawl_page","title":"One crawled page, in full","scopes":["reports:read"]},{"name":"cvl_seo_flow","title":"SEO chain status","scopes":["reports:read"]},{"name":"cvl_seo_keyword","title":"One keyword in detail","scopes":["reports:read"]},{"name":"cvl_seo_opportunities","title":"SEO opportunities","scopes":["reports:read"]},{"name":"cvl_seo_brief","title":"Competitor page brief","scopes":["reports:read"]},{"name":"cvl_seo_agency_matrix","title":"Competitors across your sites","scopes":["reports:read"]},{"name":"cvl_seo_track_keywords","title":"Track searches","scopes":["seo:write"]},{"name":"cvl_seo_untrack_keywords","title":"Stop tracking searches","scopes":["seo:write"]},{"name":"cvl_seo_set_competitor_state","title":"Pin or dismiss a competitor","scopes":["seo:write"]},{"name":"cvl_seo_opportunity_track","title":"Track an opportunity","scopes":["seo:write"]},{"name":"cvl_seo_set_keyword_money","title":"Money keyword or not","scopes":["seo:write"]},{"name":"cvl_seo_map_keyword_page","title":"Map a search to a page","scopes":["seo:write"]},{"name":"cvl_seo_add_keywords","title":"Add searches","scopes":["seo:write"]},{"name":"cvl_seo_run_flow","title":"Run the SEO chain","scopes":["seo:write"]},{"name":"cvl_seo_make_brief","title":"Generate a competitor page brief","scopes":["seo:write"]},{"name":"cvl_public_seo_scan","title":"SEO scan of any public site (no account needed)","scopes":[]},{"name":"cvl_public_seo_scan_result","title":"The result of an SEO scan","scopes":[]},{"name":"cvl_public_agent_readiness","title":"Can AI agents use this site?","scopes":[]},{"name":"cvl_docs_search","title":"Search the Convertlyft docs","scopes":[]},{"name":"cvl_replay_moment","title":"One moment of one visit","scopes":["replays:read","sessions:read"]},{"name":"cvl_funnel_report","title":"How many people got through a funnel","scopes":["reports:read"]},{"name":"cvl_paths","title":"How people move between pages","scopes":["reports:read"]},{"name":"cvl_heatmap","title":"Where people click on one page, with a picture","scopes":["sessions:read"]},{"name":"cvl_seo_serp","title":"Google results for a search","scopes":["seo:write"]},{"name":"cvl_seo_keyword_ideas","title":"Keyword ideas","scopes":["seo:write"]},{"name":"cvl_seo_keyword_metrics","title":"Volume and difficulty of searches","scopes":["seo:write"]},{"name":"cvl_seo_domain_overview","title":"A domain at a glance","scopes":["seo:write"]},{"name":"cvl_seo_competitor_gap","title":"Searches a competitor wins and a site does not","scopes":["seo:write"]},{"name":"cvl_seo_backlink_profile","title":"Backlink profile","scopes":["seo:write"]},{"name":"cvl_seo_link_gap","title":"Sites that link to competitors and not to you","scopes":["seo:write"]},{"name":"cvl_seo_ai_mentions","title":"Mentions in AI answers","scopes":["seo:write"]},{"name":"cvl_usage","title":"Usage and budget","scopes":["reports:read"]}]},"docs":{"short":"https://convertlyft.com/llms.txt","full":"https://convertlyft.com/llms-full.txt","openapi":"https://convertlyft.com/openapi.json"},"changelog":[{"version":"2026-10-09","fingerprint":"84cfc21885eee1c6","changes":["Errors are application/problem+json (RFC 9457): type, title, status and detail, and code and error are kept. The OAuth endpoints keep RFC 6749 application/json.","A tool refusal caused by the input (bad_request, invalid_arguments, window_invalid, …) is now a 400; it was a 409. GET /api/tools/<name> checks its arguments against the tool’s inputSchema, like the MCP door.","A date alone (2026-08-01) is accepted wherever from/to are taken, as the whole UTC day. It was a 400.","A 401 from GET or POST /api/tools/<name>, POST /api/crawl, GET /api/crawl/<id>, POST /api/ask and POST /api/memory now carries WWW-Authenticate.","Every charged response carries RateLimit and RateLimit-Policy (draft-ietf-httpapi-ratelimit-headers) and X-RateLimit-Requests-Limit/-Remaining/-Reset, on the MCP door too.","The capabilities manifest, llms.txt and llms-full.txt carry an ETag and answer 304 to a matching If-None-Match. /openapi.json is new, generated from the tool registry.","POST /api/crawl takes an Idempotency-Key: the same key and body within 24 hours answer the first 202 again; a different body with the same key is a 422.","POST /api/tools/<name> runs only the seo:write writes it publishes; cvl_crawl_start and cvl_error_fix_shipped are refused there (405) — use POST /api/crawl and the MCP door."]},{"version":"2026-10-06","fingerprint":"ae22d2f7e6b8a7ff","changes":["GET /api/tools/<name> (served since 2026-09-02, dated here): any read tool of the catalogue by its name, as JSON, with the scopes that tool needs. Arguments ride the query string.","A window whose from is after its to is now a 400 (\"the window runs backwards\") on every route that takes from/to. It used to answer 200 with all-zero figures.","llms-full.txt now lists the paths a token reaches through a 307 to GET /api/tools/<name> (the SEO readings, whoami, workspaces, install-verify, replays, proposals, connections), and the session_required and key_invalid refusals."]},{"version":"2026-08-21","fingerprint":"88d2d1cc0954db90","changes":["GET /api/sessions/search is new (CVL-182): the sessions that match a question — path, channel, device, converted, crashed, from/to against the session start — with the session_id each one is read by. Until it existed, session ids were produced by nothing a credential could reach. Scope sessions:read, from/to honoured. An argument outside the documented filter set is a 400 that names it."]},{"version":"2026-08-20","fingerprint":"96b5daf866e12ac2","changes":["GET /api/memory is new (CVL-199): the decision ledger for this workspace — prior findings with the receipt behind each, decisions, preferences, and questions nobody answered. Read it before deriving any of it again. Scope memory:read, no time range.","Two scopes are new: memory:read and memory:write. A token minted before today holds neither, so re-mint one to reach the ledger.","This API is no longer read-only in the literal sense, and llms.txt now says so: POST /api/memory appends to that ledger and needs memory:write plus an owner behind the credential. Nothing else in the API changes anything, and nothing about your site, tracking, funnels or data is writable through it."]},{"version":"2026-08-19","fingerprint":"d0ab752579fe207a","changes":["llms.txt, llms-full.txt and /.well-known/convertlyft-capabilities.json are served, unauthenticated (CVL-189).","Those three documents carry Convertlyft-API-Version; the report endpoints do not (CVL-266).","GET /api/funnels is new (CVL-182): it lists the funnels on this site and their ids. Until it existed, funnel_id was required by three endpoints and produced by none of them, so a token holder could not reach any funnel report without opening the dashboard. Scopes reports:read, no time range."]}]}