# Import from another service

Copy the links from a Linktree, Taplink, Beacons or any public link page, or the photo, name and bio from Instagram.

## At creation

Send `importFromUrl` with `POST /api/agent/pages` and the links found on that page are appended as `link` blocks after the ones you sent. The page title fills `displayName` if you left it empty.

```json
{ "username": "anna-bakes", "importFromUrl": "https://linktr.ee/annabakes" }
```

## Separately

```bash
curl -X POST https://tapmy.link/api/import/page -H "Authorization: Bearer …" \
  -H "Content-Type: application/json" -d '{ "url": "https://linktr.ee/annabakes" }'
```

```json
{ "title": "Anna Bakes", "links": [ { "label": "Order", "url": "https://…" } ], "avatar": "https://…" }
```

Nothing is written: you get the list, decide what to keep, and send blocks with `PATCH`. The `avatar` is a URL on the other service; pass it to `POST /api/upload` to make it yours. 30 imports per hour per account.

## Instagram

```bash
curl -X POST https://tapmy.link/api/import/instagram -H "Authorization: Bearer …" \
  -H "Content-Type: application/json" -d '{ "handle": "annabakes", "withAvatar": true }'
```

```json
{ "profile": { "fullName": "Anna", "biography": "…", "externalUrl": "https://…", "followersCount": 12400 }, "avatarKey": "avatar/…avif" }
```

`avatarKey` is already a storage key — save it straight into `avatar`. Ten Instagram lookups per account per day; the scraper is third-party and sometimes slow (`502 slow`), which is worth one retry a minute later.

## Errors

`bad_url`, `blocked` (the service walled us off), `unreachable`, `nothing_found`, `js_only` (the page renders its links client-side; add them by hand).

---
Part of the [Tapmy.link agent documentation](https://tapmy.link/documentation/agents.md). Canonical: https://tapmy.link/documentation/agents/import.md
