Listar objetivos de outreach
/sites/{siteId}/outreach- Permiso
search:read- Herramienta MCP
list_outreach_targets
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.
Las descripciones vienen del documento OpenAPI y están en inglés.
Parámetros
| Nombre | Dónde | Detalles |
|---|---|---|
siteIdObligatorio | ruta | stringWebsite id, from GET /sites. |
status | query | to_contactcontactedaddeddeclinedOnly this status. |
source | query | ai_sourcebest_listlink_gaplost_linkmanualOnly this source. |
tag | query | stringat most 40 characters, pattern ^[a-z0-9]+(-[a-z0-9]+)*$Only targets with this tag (one label). |
spam | query | 1trueInclude targets with a spam score above 60 (same as include=spam). |
include | query | stringHidden 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). |
page | query | integerdefault 1, min 1Page number, from 1. |
per | query | integerdefault 50, min 1, max 200Rows per page, 1 to 200. |
Respuesta
200 · application/json
| Campo | Detalles |
|---|---|
filters | object · required; The filters applied |
filters.status | to_contact | contacted | added | declined | · required; Status filter |
filters.source | ai_source | best_list | link_gap | lost_link | manual | · required; Source filter |
filters.tag | string or null · required; Tag filter |
filters.spam | true or false · required; Spam-flagged targets included |
filters.include | list of spam | auto | gone · required; Hidden groups included |
counts | object · required; Counts |
counts.all | integer · required; Targets shown, all statuses |
counts.status | object · required; Targets per status |
counts.status.to_contact | integer · required; Targets to_contact |
counts.status.contacted | integer · required; Targets contacted |
counts.status.added | integer · required; Targets added |
counts.status.declined | integer · required; Targets declined |
counts.source | object · required; Targets per source |
counts.source.ai_source | integer · required; Targets from ai_source |
counts.source.best_list | integer · required; Targets from best_list |
counts.source.link_gap | integer · required; Targets from link_gap |
counts.source.lost_link | integer · required; Targets from lost_link |
counts.source.manual | integer · required; Targets from manual |
counts.spamHidden | integer · required; Spam-flagged targets left out (platform pages included) |
counts.platformHidden | integer · required; Platform pages of much larger sites left out |
counts.autoHidden | integer · required; Script-made pages and link gap domains without a page left out |
counts.goneHidden | integer · required; Targets the source no longer lists, left out |
total | integer · required; Rows that match, over all pages |
page | integer · required; This page, from 1 |
per | integer · required; Rows per page |
hasMore | true or false · required; More rows after this page |
targets | list of values · required |
targets[].id | string |
targets[].source | string |
targets[].url | string |
targets[].domain | string |
targets[].title | string |
targets[].score | number |
targets[].class | string |
targets[].reason | object |
targets[].reason.competitors | list of strings |
targets[].reason.domainRank | number |
targets[].reason.ourRank | number |
targets[].reason.spamScore | number |
targets[].reason.outOf | number |
targets[].reason.backlinks | number |
targets[].reason.pages | list of objects |
targets[].reason.pages[].competitor | string |
targets[].reason.pages[].url | string |
targets[].reason.pages[].anchor | string |
targets[].reason.pages[].title | string |
targets[].reason.pageKind | string |
targets[].reason.pageKindBy | string |
targets[].status | string |
targets[].statusAt | string |
targets[].statusAuto | true or false |
targets[].note | string |
targets[].tags | list of strings |
targets[].firstSeen | string |
targets[].lastSeen | string |
targets[].gone | true or false |
targets[].check | object |
targets[].check.at | string |
targets[].check.ok | true or false |
targets[].check.status | number |
targets[].check.linksUs | true or false |
targets[].check.mentionsUs | true or false |
targets[].check.matched | list of strings |
targets[].link | string |
note | string · required; How to read the fields |
link | address (URL) · required; The Outreach screen in the app |
Notas
GET /sites/{siteId}/outreach lista páginas y sitios a los que vale la pena pedir un enlace o una mención, ordenados: primero los objetivos abiertos por score (de 0 a 100), luego los contactados, añadidos y rechazados. Los objetivos que su fuente ya no encuentra (gone) van al final. MonoRanks no envía correos ni busca datos de contacto: lista los objetivos, tú haces el outreach y registras lo que pasó.
| Qué | Detalles |
|---|---|
source |
ai_source (las respuestas de IA a tus preguntas seguidas citan la página pero no te nombran), best_list (una lista de “los mejores X” que nombra a tus competidores pero no a ti), link_gap (un sitio que enlaza a dos o más de tus competidores, no a ti), lost_link (un sitio fuerte que dejó de enlazarte, donde la solución es pedirles que actualicen el enlace) o manual (añadido a mano). |
reason |
dice por qué, con los campos que conoce su fuente: por ejemplo questions, models y timesCited; keyword y position; competitors, domainRank, spamScore y outOf; o lostAt. |
status |
to_contact, contacted, added o declined. Filtra con status y source. counts tiene los totales por estado y por fuente. |
| Spam | Los objetivos con una puntuación de spam superior a 60 se dejan fuera salvo que pases spam=1; counts.spamHidden dice cuántos. |
| Escritura | POST /sites acepta status y/o note (como máximo 2.000 caracteres; una nota vacía la borra). El cambio queda registrado en la Activity del sitio web a nombre del dueño de la clave. El estado y la nota se mantienen cuando la fuente actualiza el objetivo. |
| Añadido por sí solo | Una vez por semana MonoRanks vuelve a leer cada página objetivo abierta, gratis. Cuando la página ya enlaza al sitio web o lo nombra, el objetivo pasa a added y statusAuto es true. |
Errores
| Estado | Significado |
|---|---|
400 | Bad request. Codes: bad_status, bad_source, bad_include, bad_tag, bad_page, bad_per. |
401 | Missing, unknown or revoked key. Codes: missing_key, invalid_key. |
403 | The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden. |
404 | Not found. Codes: not_found. |
429 | Too many requests this hour for this key. Codes: rate_limited. |
Petición de ejemplo
curl \
-H "Authorization: Bearer mr_ws_…" \
"https://app.monoranks.com/api/v1/sites/SITE_ID/outreach"const res = await fetch("https://app.monoranks.com/api/v1/sites/SITE_ID/outreach", {
headers: { Authorization: "Bearer mr_ws_…" },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();import requests
res = requests.get(
"https://app.monoranks.com/api/v1/sites/SITE_ID/outreach",
headers={"Authorization": "Bearer mr_ws_…"},
)
res.raise_for_status()
data = res.json()<?php
$ch = curl_init("https://app.monoranks.com/api/v1/sites/SITE_ID/outreach");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: Bearer mr_ws_…"],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import axios from "axios";
const { data } = await axios.get("https://app.monoranks.com/api/v1/sites/SITE_ID/outreach", { headers: { Authorization: "Bearer mr_ws_…" } });Respuesta de ejemplo
{
"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"
}{
"error": {
"code": "bad_status",
"message": "status must be one of to_contact, contacted, added, declined."
}
}{
"error": {
"code": "missing_key",
"message": "Send the key as Authorization: Bearer mr_site_…"
}
}{
"error": {
"code": "missing_scope",
"message": "This key does not have the scope this call needs."
}
}{
"error": {
"code": "not_found",
"message": "Website not found."
}
}{
"error": {
"code": "rate_limited",
"message": "More than 1200 requests this hour for this key."
}
}El servidor MCP hace lo mismo con la herramienta list_outreach_targets.