Seomely
Reference

API and MCP

Base URL https://seomely.com/api

Everything the dashboard shows is available over REST and over MCP. Both use the same API key and the same monthly allowance, so there is one credential to manage rather than two.

Authentication

Create a key at /app/api-keys. It is shown once and stored only as a hash, so we cannot recover it for you.

curl https://seomely.com/api/v1/investigate \
    -H "Authorization: Bearer sk_live_..." \
    -d "project=example.com"

Rate limits

Calls are metered per month, per account, across REST and MCP together. Every response carries the running count:

x-api-calls-used: 412
x-api-calls-limit: 25000
  • Free 1,000 calls a month
  • Pro 25,000 calls a month
  • Agency 250,000 calls a month

Past the ceiling you get 429 quota_exceeded until the 1st. There is no per-second limit and no burst throttle. If you find one, it is a bug rather than a policy.

A separate limit worth knowing. Google allows 2,000 URL inspections per property per day and we stay under 1,500 so we never exhaust the allowance your other tools share. That governs how fast fresh data appears, and it is not something an API call can hurry.

Endpoints

project accepts a domain or a project id, and can be omitted on GET endpoints to cover every property the key can see. GET parameters go in the query string; POST parameters go in a JSON body.

GET /v1/investigate

Regressions, the factor they share, and remaining pages ranked by priority with reasons. Start here.

Parameters: project, since_days (default 30)

GET /v1/projects

Properties this key can see.

Parameters: none

GET /v1/urls/unindexed

Everything not in the index, each with a cause and whether submitting helps.

Parameters: project, limit (100), orphans=true

GET /v1/urls/orphans

Only pages with no inbound links from your own site.

Parameters: project, limit (100)

GET /v1/urls/status

Current state for one URL.

Parameters: url (required)

GET /v1/urls/history

Every observation we hold for one URL, newest first.

Parameters: url (required), limit (100)

GET /v1/regressions

Pages that were indexed and are not now.

Parameters: project, since_days (30)

GET /v1/stats

Coverage totals per property.

Parameters: project

GET /v1/indexnow

Whether IndexNow is set up, and whether autopilot is on.

Parameters: project

POST /v1/sitemaps/sync

Re-read the sitemap now.

Parameters: project (body)

POST /v1/indexnow/setup

Generate a key, or register one you already host.

Parameters: project, key (optional)

POST /v1/indexnow/autopilot

Turn nightly submission on or off.

Parameters: project, enabled

POST /v1/urls/submit

Submit URLs to the IndexNow network. Pages where submission cannot help are skipped and reported as skipped.

Parameters: project, urls[]

Errors

Every error has the same shape:

{ "error": { "code": "project_not_found", "message": "No connected property matches \"example.com\"." } }
  • 401 missing_key No Authorization header.
  • 401 invalid_key The key does not exist.
  • 401 revoked_key The key was revoked. It stops working immediately.
  • 400 missing_url An endpoint that needs ?url= did not get one.
  • 400 missing_project A POST that needs a property did not name one.
  • 404 project_not_found No connected property matches that domain or id.
  • 404 unknown_endpoint No endpoint at that method and path.
  • 429 quota_exceeded Monthly call ceiling reached. Resets on the 1st.
  • 500 internal_error Our fault. Nothing was charged against your quota beyond the call itself.

MCP server

Streamable HTTP at https://seomely.com/api/mcp, authorised with the same bearer token. There is nothing to install: it is a remote server, not a package.

Claude Code

claude mcp add --transport http seomely https://seomely.com/api/mcp \
  --header "Authorization: Bearer sk_live_..."

Claude Desktop, Cursor, or any client that takes a config file

{
  "mcpServers": {
    "seomely": {
      "type": "http",
      "url": "https://seomely.com/api/mcp",
      "headers": { "Authorization": "Bearer sk_live_..." }
    }
  }
}

The tools mirror the REST endpoints, with investigate_indexing as the one to reach for first: it correlates regressions with their shared cause and returns ranked work, so an agent does not have to infer the connection from separate calls.

One field decides how you should report results. Every diagnosis carries submission_helps. When it is false, the cause is content or configuration, and submitting the URL again cannot change the outcome. Tools that promise indexing rely on people not knowing that. Please do not tell someone to resubmit a page we have already told you submission will not help.

Priorities carry a why array of the specific observations that produced them. There is no composite score anywhere in this API, so quoting those reasons is always more accurate than inventing an explanation for a number.

Discovery