Developer docs

List outreach targets

GET/sites/{siteId}/outreach
Scope
search:read

Outreach targets, ranked, with why Pages and sites worth asking for a link or a mention: open ones by score, then contacted, added, declined; targets the source no longer lists last, when included. Spam-flagged, script-made and gone targets are left out unless include names them; counts and totals leave out what is hidden. MonoRanks says who and why; it does not send email or look up contacts.

Parameters

NameInDetails
siteIdRequiredpathstringWebsite id, from GET /sites.
statusqueryto_contactcontactedaddeddeclinedOnly this status.
sourcequeryai_sourcebest_listlink_gaplost_linkmanualOnly this source.
tagquerystringat most 40 characters, pattern ^[a-z0-9]+(-[a-z0-9]+)*$Only targets with this tag (one label).
spamquery1trueInclude targets with a spam score above 60 (same as include=spam).
includequerystringHidden groups to list too, comma separated: spam, auto (pages a script made, link gap domains with no linking page, and AI-source pages nobody can be asked about: example addresses, competitors' own pages, home or product pages of much larger sites), gone (no longer listed by the source).
pagequeryintegerdefault 1, min 1Page number, from 1.
perqueryintegerdefault 50, min 1, max 200Rows per page, 1 to 200.

Response

200 · application/json

FieldDetails
filtersobject · required; The filters applied
filters.statusto_contact | contacted | added | declined | · required; Status filter
filters.sourceai_source | best_list | link_gap | lost_link | manual | · required; Source filter
filters.tagstring or null · required; Tag filter
filters.spamtrue or false · required; Spam-flagged targets included
filters.includelist of spam | auto | gone · required; Hidden groups included
countsobject · required; Counts
counts.allinteger · required; Targets shown, all statuses
counts.statusobject · required; Targets per status
counts.status.to_contactinteger · required; Targets to_contact
counts.status.contactedinteger · required; Targets contacted
counts.status.addedinteger · required; Targets added
counts.status.declinedinteger · required; Targets declined
counts.sourceobject · required; Targets per source
counts.source.ai_sourceinteger · required; Targets from ai_source
counts.source.best_listinteger · required; Targets from best_list
counts.source.link_gapinteger · required; Targets from link_gap
counts.source.lost_linkinteger · required; Targets from lost_link
counts.source.manualinteger · required; Targets from manual
counts.spamHiddeninteger · required; Spam-flagged targets left out (platform pages included)
counts.platformHiddeninteger · required; Platform pages of much larger sites left out
counts.autoHiddeninteger · required; Script-made pages and link gap domains without a page left out
counts.goneHiddeninteger · required; Targets the source no longer lists, left out
totalinteger · required; Rows that match, over all pages
pageinteger · required; This page, from 1
perinteger · required; Rows per page
hasMoretrue or false · required; More rows after this page
targetslist of values · required
targets[].idstring
targets[].sourcestring
targets[].urlstring
targets[].domainstring
targets[].titlestring
targets[].scorenumber
targets[].classstring
targets[].reasonobject
targets[].reason.competitorslist of strings
targets[].reason.domainRanknumber
targets[].reason.ourRanknumber
targets[].reason.spamScorenumber
targets[].reason.outOfnumber
targets[].reason.backlinksnumber
targets[].reason.pageslist of objects
targets[].reason.pages[].competitorstring
targets[].reason.pages[].urlstring
targets[].reason.pages[].anchorstring
targets[].reason.pages[].titlestring
targets[].reason.pageKindstring
targets[].reason.pageKindBystring
targets[].statusstring
targets[].statusAtstring
targets[].statusAutotrue or false
targets[].notestring
targets[].tagslist of strings
targets[].firstSeenstring
targets[].lastSeenstring
targets[].gonetrue or false
targets[].checkobject
targets[].check.atstring
targets[].check.oktrue or false
targets[].check.statusnumber
targets[].check.linksUstrue or false
targets[].check.mentionsUstrue or false
targets[].check.matchedlist of strings
targets[].linkstring
notestring · required; How to read the fields
linkaddress (URL) · required; The Outreach screen in the app

Notes

GET /sites/{siteId}/outreach lists pages and sites worth asking for a link or a mention, ranked: open targets first by score (0 to 100), then contacted, added and declined. Targets their source no longer finds (gone) come last. MonoRanks does not send email and does not look up contact details: it lists the targets, you do the outreach and record what happened.

What Details
source ai_source (AI answers to your tracked questions quote the page but do not name you), best_list (a “best X” list that names your competitors but not you), link_gap (a site that links to two or more of your competitors, not to you), lost_link (a strong site that stopped linking to you, where asking them to update the link is the fix) or manual (added by hand).
reason says why, with the fields its source knows: for example questions, models and timesCited; keyword and position; competitors, domainRank, spamScore and outOf; or lostAt.
status to_contact, contacted, added or declined. Filter with status and source. counts has the totals per status and source.
Spam Targets with a spam score above 60 are left out unless you pass spam=1; counts.spamHidden says how many.
Writing POST /sites/{siteId}/outreach/{targetId} takes status and/or note (at most 2,000 characters; an empty note clears it). The change is recorded in the website’s Activity as the key owner. Status and note stay when the source refreshes the target.
Added on its own Once a week MonoRanks reads each open target page again, for free. When the page now links to the website or names it, the target turns added and statusAuto is true.

Errors

StatusMeaning
400Bad request. Codes: bad_status, bad_source, bad_include, bad_tag, bad_page, bad_per.
401Missing, unknown or revoked key. Codes: missing_key, invalid_key.
403The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden.
404Not found. Codes: not_found.
429Too many requests this hour for this key. Codes: rate_limited.

Example request

curl \
  -H "Authorization: Bearer mr_ws_…" \
  "https://app.monoranks.com/api/v1/sites/SITE_ID/outreach"

Example response

{
  "filters": {
    "status": null,
    "source": null,
    "tag": null,
    "spam": false,
    "include": []
  },
  "counts": {
    "all": 64,
    "status": {
      "to_contact": 51,
      "contacted": 8,
      "added": 3,
      "declined": 2
    },
    "source": {
      "ai_source": 12,
      "best_list": 9,
      "link_gap": 38,
      "lost_link": 4,
      "manual": 1
    },
    "spamHidden": 5,
    "platformHidden": 2,
    "autoHidden": 11,
    "goneHidden": 3
  },
  "total": 64,
  "page": 1,
  "per": 50,
  "hasMore": true,
  "targets": [
    {
      "id": "0b2d4f6a-8c0e-4a2c-9e4a-8c0e2a4c6e8a",
      "source": "link_gap",
      "url": "https://rideguide.example/best-bike-shops/",
      "domain": "rideguide.example",
      "title": "The best online bike shops",
      "score": 82,
      "class": "editorial",
      "reason": {
        "competitors": [
          "bikeworld.example",
          "cyclehub.example"
        ],
        "domainRank": 47,
        "ourRank": 33,
        "spamScore": 4,
        "outOf": 2,
        "backlinks": 5,
        "pages": [
          {
            "competitor": "bikeworld.example",
            "url": "https://rideguide.example/best-bike-shops/",
            "anchor": "Bike World",
            "title": "The best online bike shops"
          }
        ],
        "pageKind": "review",
        "pageKindBy": "ai"
      },
      "status": "contacted",
      "statusAt": "2026-10-02T09:30:00.000Z",
      "statusAuto": false,
      "note": "Emailed the editor on Oct 2.",
      "tags": [
        "gear-review"
      ],
      "firstSeen": "2026-09-14T03:00:00.000Z",
      "lastSeen": "2026-10-05T03:00:00.000Z",
      "gone": false,
      "check": {
        "at": "2026-10-05T03:10:00.000Z",
        "ok": true,
        "status": 200,
        "linksUs": false,
        "mentionsUs": false,
        "matched": []
      },
      "link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/outreach?open=0b2d4f6a-8c0e-4a2c-9e4a-8c0e2a4c6e8a"
    }
  ],
  "note": "Pages and sites worth asking for a link or a mention, with why (reason) and a score (0–100, higher first).",
  "link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/outreach"
}

The MCP server does the same with the tool list_outreach_targets.