---
title: "Backlinks and link exchanges"
description: "Vet a site that offers a link, record the deal, let Writavo confirm both links and keep the history, and choose which links are dofollow, nofollow or sponsored."
canonical: "https://writavo.com/docs/links"
last-updated: "2026-09-30"
---

# Backlinks and link exchanges

Someone writes in offering a link swap, a guest post or a paid placement. Writavo is where that deal lives: who it is with, what was agreed, whether their link is really there, whether yours is, and the day either one changed. You state who the deal is with; Writavo reads the rest from the pages themselves.

## Nothing about a link is typed in

A record you have to keep up to date by hand is wrong within a month. So the only thing a person or an assistant enters is who the deal is with. Everything else is read.

- **Your side** is found in your published articles. Add the link to an article and the exchange shows it within a few minutes; remove it and the exchange shows that too.
- **Their side** is read from their page by plain HTTP, at once and then every week. If the exchange names no page, Writavo watches your backlinks for a link from their site instead.
- **The history** is kept by the database: the day the deal was recorded, the day you agreed, the day their link was first seen, the day it turned nofollow, the day it disappeared. It cannot be edited.
- All of it is free. No credits, no plan requirement, no approval step for an assistant.

## From the offer to the record

1. **Look at what they are offering.** `inspectLinkProspect` with the page they named. You learn whether it loads, whether it is hidden from search engines (`noindex`), how many other sites it links to (a very high number is what a list of links looks like), whether it already links to you and whether that link is followed, whether your articles already link to them, and whether they are on your disavow list. It stores nothing.
2. **Record the deal.** `createLinkExchange` with `their_page_url` (or just `partner_domain`). Optional, for the record: `kind` (`swap`, `guest_post`, `paid`, `other`), `contact` (who offered it), `note`, `our_target_url` (the page of yours they should link to) and `status`. Their page is read straight away.
3. **Add your link.** Put the link in the article with `update_article`. There is nothing to tell the exchange: it finds the link itself. If the link is part of a swap or is paid for, mark it, as the next section explains.
4. **Confirm theirs.** `checkLinkExchange` reads their page now and answers in the same request: is the link there, is it followed, what does it say. Every open exchange is also re-read each week without anyone asking.
5. **See who is not holding up their side.** `listLinkExchanges` with `needs_attention=true`. `getLinkExchange` returns one deal with its full `history`.

In the dashboard the same steps are on **SEO, Link Exchanges**: a box to check a page, **Add exchange**, **Check now** on each row, and the record and history behind the clock icon.

## One verdict per deal

Each exchange carries a `health` value, decided in one place so the dashboard, the API and an assistant cannot disagree.

| `health` | What it means | Needs attention |
|---|---|---|
| `balanced` | Their link to you is live and followed, and yours to them is live. | no |
| `their_link_removed` | Their link was seen before and is gone, while yours is still live. | yes |
| `their_link_nofollow` | Their link is marked nofollow, sponsored or ugc, while yours is live. | yes |
| `waiting_on_them` | Yours is live. Theirs has never been seen. | yes |
| `waiting_on_us` | Theirs is live. None of your published articles link to them yet. | no |
| `not_started` | Neither link exists yet. | no |
| `could_not_check` | Their page did not load. Nothing is concluded from that; it is read again next week. | no |
| `closed` | You declined or ended the deal. | no |

> A page that cannot be read is never treated as a removed link. Only a page that was read and no longer links to you, or one that answers 404 or 410, counts as the link being gone.

## Dofollow, nofollow and sponsored

Whether a link passes ranking credit is a choice, and one rule decides it everywhere: on the blog Writavo serves and in the `content_html` the read API returns.

1. **What is set on the link wins.** `setArticleLinkRel` with the article and the link's `target_url` from `listArticleLinks`. `rel` is `follow`, `nofollow`, `sponsored`, `ugc`, or `null` to clear it. In the dashboard: the **Ranking credit** menu on each row of SEO, Internal Links, All links, or the menu beside the Link button in the editor.
2. **Otherwise, a link to your own pages is followed.** Always, whether it is written as a path or as a full address on your own domain.
3. **Otherwise, a link to another site takes the Site setting.** `external_link_rel` on `updateSiteSettings`: `follow` (the default) or `nofollow`. In the dashboard: Settings, Site, Links to other sites.

The choice on one link is stored in the link's Markdown title and removed again when the page is rendered, so it travels with the article through the editor, the API, an export and an import:

```markdown
[our partner](https://partner.example/page "rel:sponsored")
```

- You can write that title yourself in `create_article` or `update_article`; it is the same thing `setArticleLinkRel` does.
- If your own code renders the Markdown `content` rather than using `content_html`, read the title the same way: take `rel:follow`, `rel:nofollow`, `rel:sponsored` or `rel:ugc` out of it and set the link's `rel` from it.
- Search engines ask that a link you were paid for, or gave in exchange for one, carries `sponsored` or `nofollow`. Writavo does not decide that for you; it makes the choice one call and shows you on every exchange whether your link to the partner is followed (`our_link.followed`).
- A WordPress import keeps the links the old site had marked nofollow, sponsored or ugc.

## Every link in your articles

The links are read from the articles themselves, within minutes of an article being published, edited or imported from another CMS.

| You want | Operation |
|---|---|
| Every link, one row each, with its state and whether it is followed | `listArticleLinks` (filter by `type`, `state`, `article_id`, `target_article_id`, `domain`, `q`) |
| The problems, grouped: orphans, under-linked articles, broken links, anchor text | `getInternalLinkReport` |
| The sites your articles link to, and which of them link back | `listOutboundLinkDomains` (add `reciprocal=true`) |
| Every link to one site | `listOutboundLinks` |
| Who links to you | `getBacklinkOverview`, `listBacklinks` (import with `importBacklinksCsv` or `syncBing`) |

## What it does not do

- **It does not score a site.** Authority, spam score and traffic need a paid link index for a domain you do not own. `inspectLinkProspect` names them in `not_measured` rather than guessing.
- **It does not send email.** Writing to a partner is yours to do. Outreach campaigns are set up by a person in the dashboard, and an assistant can only read their status.
- **It does not change anyone's link.** Removing an exchange stops the tracking; your article keeps its link until you edit the article.
