---
title: "Find website contacts"
method: POST
path: "/api/v1/tools/find_website_contact"
tags: ["guarded"]
---

# Find website contacts

`POST /api/v1/tools/find_website_contact`

## Request

- Base URL: `https://www.affiliatespy.io`
- URL: `https://www.affiliatespy.io/api/v1/tools/find_website_contact`
- Auth: HTTP bearer

Find a contact email for up to 25 sites, as the Websites Find email button does: the free chain first (cache, the site's contact pages, policy and deliverability checks), then ONE paid contact-finder lookup per site when that finds nothing and the project's monthly finder budget has room. Found addresses (and the contact's name when known) are saved on the site. Sites that already show a contact path are skipped, as in the dashboard. Runs one site at a time for up to about four minutes; sites not reached come back as not_started. Nothing is sent. Guarded: without approval_token it returns {error:"approval_required", approval_token, summary} for the user to confirm; call again with the token. Every dashboard guardrail still applies: this is exactly what a user clicking the dashboard could do, no more. GUARDED: requires the account's Unrestricted MCP setting; returns 403 {error:'restricted'} otherwise.

## Request body

- object
  - `site_ids` string[], required: Up to 25 site ids from list_websites.
  - `approval_token` string: Approval token from a previous approval_required response, after the user said yes.

## Response `200`

The tool's JSON result (same payload the MCP tool returns).

- unknown

## Other responses

- `400`: Arguments failed validation; body lists the issues.
- `401`: Missing or invalid API key.
- `403`: Guarded tool with Unrestricted MCP off.
- `429`: Rate limited (60 requests per minute per key).

---

[API](https://skmtc.dev/affiliatespy/apis/affiliatespy-api.md) · [All operations](https://skmtc.dev/affiliatespy/apis/affiliatespy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/affiliatespy/apis/affiliatespy-api/revisions/0300d370b356?raw)
