Skip to content
Metric VaultHelp Center
Open app

POST /api/v1/analyze

The complete reference for the public analysis endpoint: authentication, request body, every response field, errors, cost and behavior.

Last updated 2026-08-06

Summary#

POST /api/v1/analyze is the only public endpoint in the Metric Vault API. It takes a domain and returns a single JSON object containing a competitive analysis: authority and SEO scores, estimated traffic, brand sentiment, market position, a content-gap score, a threat level, keywords, competitors, opportunities, weaknesses and a written summary. It requires an mv_live_ API key, the Enterprise plan, and it costs 6 credits per successful call.

Overview#

The endpoint is synchronous. One request produces one complete analysis in the response body; there is no job id, no polling and no callback. The call runs a language-model analysis inside the request, so expect several seconds of latency and set a generous client timeout.

Important

Important: The response is a model-generated expert estimate of the domain, not a measurement pulled from a search-data provider. Two calls for the same domain can return slightly different numbers. Treat the values as directional intelligence, not as metered analytics. The measured, provider-backed figures live in the dashboard tools. See AI models used across the platform and Where the data comes from for how the two differ.

Endpoint#

PropertyValue
MethodPOST
URLhttps://metricvaultai.com/api/v1/analyze
AuthenticationAuthorization: Bearer mv_live_...
Content typeapplication/json
Plan requiredEnterprise, re-checked on every call
Credit cost6, metered as the tool domain_overview
IdempotentNo. Every call runs a fresh analysis and is charged
CachingNone. Responses are not cached or deduplicated
CORSAccess-Control-Allow-Origin: *

Request headers#

HeaderRequiredValue
AuthorizationYesBearer followed by the full key. Any other scheme is treated as missing
Content-TypeYesapplication/json

Request body#

FieldTypeRequiredNotes
urlstringOne of url or domainThe subject of the analysis. A bare domain such as example.com or a full URL both work
domainstringOne of url or domainAlias for url. Used only if url is absent

Any other field in the body is ignored. An unparseable body is treated as an empty object, which then fails the missing-target check.

json
{ "url": "example.com" }

Response#

200 OK

json
{
  "ok": true,
  "url": "example.com",
  "analysis": { }
}
Envelope fieldTypeNotes
okbooleanAlways true on success
urlstringEchoes the value you sent
analysisobjectThe payload, described below

The analysis object#

FieldTypeRange or valuesMeaning
domainAuthoritynumber1 to 100Estimated overall domain strength
seoScorenumber1 to 100Estimated search-performance health
estimatedTrafficstringFor example "1.2M/mo"Estimated monthly organic traffic, formatted for display
brandSentimentstringVery Positive, Positive, Neutral, NegativeOverall tone of brand mentions
sentimentScorenumber1 to 100Numeric form of the sentiment reading
marketPositionstringFree textOne-line description of where the brand sits in its category
contentGapScorenumber1 to 100Estimated size of the content opportunity against competitors
threatLevelstringLow, Medium, High, CriticalCompetitive pressure on the domain
topKeywordsstring array5 entriesHighest-value keyword themes for the domain
competitorsstring array3 entriesClosest competing domains
opportunitiesstring arrayShort entriesWhere the domain has headroom
weaknessesstring arrayShort entriesWhere the domain is exposed
summarystring2 to 3 sentencesExecutive summary of the analysis

The array lengths above are what the endpoint asks for and normally returns. Write your client so that a missing field or a differently-sized array does not throw: read defensively rather than destructuring blindly.

Errors#

Responses are JSON with an error string, and sometimes a machine-readable code. The request stops at the first gate that fails.

HTTPcodeBody messageCauseFix
401Missing API key. Send header: Authorization: Bearer mv_live_...No Authorization header, or a scheme other than BearerSend the header exactly as shown
401Invalid or revoked API keyThe key is unknown, truncated, or revokedCheck the value end to end, or create a new key
403upgrade_requiredThis feature requires the Enterprise plan. Your account is on <Plan>. Upgrade to unlock it.The key's owner is not on Enterprise nowRestore the plan. The same key resumes working
403account_suspendedThis account is suspended. Please contact support.The owning account is suspendedContact support@metricvaultai.com
400Provide a JSON body: { "url": "example.com" }Neither url nor domain was presentSend one of them
429quota_exceededYou've used all <N> premium reports on the <PLAN> plan this month. …The month's credit allowance is spentWait for reset_date in the response, or upgrade
503plan_check_failedPlan check temporarily unavailable, please retry.The plan lookup could not completeRetry. Nothing was charged
503quota_check_failedUsage check temporarily unavailable, please retry.The usage lookup could not completeRetry. Nothing was charged
500The upstream error messageThe analysis call failed or its output could not be parsedRetry once. If it persists, contact support

The 429 body also carries plan, used, quota, cost, reset_at in ISO form, reset_date in readable form, days_until_reset and upgrade_url. The full catalogue is in Error codes.

Order of checks#

The endpoint applies its gates in a fixed order, which determines what you are charged:

StepCheckCharged if it fails?
1Authorization header present and parseableNo
2Key exists and is not revokedNo
3Key owner is currently on EnterpriseNo
4Account is not suspended, and has 6 credits availableNo
5Body contains url or domainNo
6Analysis runsCharged only on success

A 200 has always been metered. Anything else has not.

Side effects of a successful call#

EffectDetail
Credits6 deducted from the owning account's current-month allowance
Usage attributionRecorded against the tool name domain_overview
Key metadataThe key's last_used_at timestamp is updated
LibraryNothing is saved. API results do not appear in Saved Work

Metering is best-effort in the sense that a failure to record usage does not fail your request. It does not mean calls are free.

Limits#

LimitValue
Credit cost6 per call
Monthly allowance (Enterprise)10,000 credits
Calls per month at that allowance1,666
Hourly fair-use limitDoes not apply. That limit covers light tools costing fewer than 3 credits
Request body sizeNo documented cap; the body is a single short JSON object
ConcurrencyNot limited by the endpoint. Your monthly quota is the real ceiling

Example#

bash
curl -sS -X POST https://metricvaultai.com/api/v1/analyze \
  -H "Authorization: Bearer mv_live_3f9a1c7d4b28e05a6f13c9d720b48e1a5c6d7f0293a4b1c8" \
  -H "Content-Type: application/json" \
  -d '{"url": "notion.so"}'
json
{
  "ok": true,
  "url": "notion.so",
  "analysis": {
    "domainAuthority": 86,
    "seoScore": 81,
    "estimatedTraffic": "9.4M/mo",
    "brandSentiment": "Positive",
    "sentimentScore": 84,
    "marketPosition": "Leading all-in-one workspace for teams and individuals",
    "contentGapScore": 46,
    "threatLevel": "Medium",
    "topKeywords": ["notion templates", "note taking app", "project management tool", "wiki software", "notion ai"],
    "competitors": ["coda.io", "clickup.com", "obsidian.md"],
    "opportunities": ["Template-led landing pages for niche workflows", "Comparison content against task-first competitors"],
    "weaknesses": ["Limited depth on enterprise governance queries", "Community content outranks owned pages on how-to intent"],
    "summary": "Notion converts strong branded demand into broad category visibility, with template and how-to queries driving most non-branded entry. The largest gap is owned depth on workflows where community content currently ranks first."
  }
}

More languages are in Code examples.

Screenshots#

Screenshot
A terminal showing the curl request to /api/v1/analyze and the pretty-printed JSON response.
Screenshot
The Usage tile on the Account screen before and after an API call, showing the 6-credit increment.

See also

Was this article helpful?