# PayPal Legacy Button Finder (WPS Buy Now / Add to Cart) (`donrulezz/paypal-legacy-button-finder`) Actor

PayPal deprecated Website Payments Standard Buy Now and Add to Cart buttons and may retire them any time after 1 January 2027. Crawl your sites and list every old PayPal button, its item and price, which must be replaced, and which Donate/Subscribe buttons stay.

- **URL**: https://apify.com/donrulezz/paypal-legacy-button-finder.md
- **Developed by:** [Ashish Agarwal](https://apify.com/donrulezz) (community)
- **Categories:** E-commerce, Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 page scanneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## PayPal Legacy Button Finder (WPS Buy Now / Add to Cart)

PayPal is deprecating **Website Payments Standard (WPS)**, the classic HTML "Buy Now" and "Add to Cart" buttons pasted
into millions of websites. PayPal's developer page (updated 4 June 2026) says WPS is deprecated from January 2026,
affects **Buy Now** and **Add to Cart**, leaves **Donate and Subscribe** buttons unaffected, and that "PayPal may retire
WPS anytime after **January 1, 2027**". WooCommerce, Gravity Forms, MemberPress and other platforms already treat
January 2027 as the end.

The hard part is **finding every old button**: they hide on product, ticket, event, course, membership and download pages.
This Actor crawls your websites and lists each legacy PayPal button with its page, item, price and what to do.

### What it finds

| Button (WPS `cmd`) | Status | Why |
|---|---|---|
| Buy Now (`_xclick`) | **at-risk** | Deprecated; must be replaced |
| Add to Cart / View Cart / cart upload (`_cart`) | **at-risk** | Deprecated; must be replaced |
| Hosted button (`_s-xclick`) | at-risk / likely-safe / **check** | The real type is stored in your PayPal account; the button image is used as a hint (Buy Now, Pay Now, Cart → at-risk; Donate, Subscribe → likely-safe; anything else → check) |
| Donate (`_donations`) | safe | PayPal: not affected |
| Subscribe (`_xclick-subscriptions`) | safe | PayPal: not affected |

It reads both forms posting to `paypal.com/cgi-bin/webscr` and link buttons (`webscr?cmd=...`), notes sandbox buttons,
and reports whether the site already uses current PayPal integrations (JS SDK, Payment Links, PayPal.Me).

### Input

```json
{ "startUrls": ["https://my-club.org", "https://my-ebook-shop.com"], "maxPagesPerSite": 100, "maxDepth": 3 }
```

Agencies: put your client sites in a CSV or Google Sheet and pass its link as `siteListUrl`.

Each site is crawled on its own host, robots.txt is respected, pages listed in the site's sitemap are queued too, and
shop/ticket/donate/course/pricing pages are crawled first.

### Output

One item per distinct button (the same button repeated in a footer or sidebar is one item with all its pages):

```json
{
  "type": "button",
  "site": "https://www.irfanview.com",
  "pages": ["https://www.irfanview.com/main_support_engl.htm"],
  "pageCount": 1,
  "kind": "form",
  "cmd": "_s-xclick",
  "type": "Hosted button (looks like Buy Now)",
  "status": "at-risk",
  "itemName": null,
  "amount": null,
  "currency": "EUR",
  "hostedButtonId": "XXXXXXXXXXXXX",
  "fix": "Hosted button: open PayPal > Pay & Get Paid > PayPal Buttons > Saved buttons to see its type..."
}
```

plus one `site-summary` item per site: buttons to replace, to check, safe, the pages with at-risk buttons, current PayPal
integrations found, and a one-line verdict. The PayPal account email inside old buttons is never copied to the output.

### Who it's for

- **Site owners**: find every old button before PayPal switches them off.
- **Web designers and agencies**: audit all client sites in one run and quote the replacement work.
- **Platforms and hosts**: see how many of your customers' sites still use WPS buttons.

### Pricing

Pay per page crawled. Pages that fail to load are free, and the run stops at your spending limit.

### Good to know

- PayPal's date is "any time after 1 January 2027", not a fixed switch-off day; PayPal says it will tell affected
  merchants directly at key milestones.
- Replacement: PayPal's current Payment Links and Buttons (Button Builder) or PayPal Checkout; on WooCommerce, Gravity
  Forms, MemberPress etc. install the platform's current PayPal add-on.
- Buttons added by JavaScript after page load (rare for WPS) are not seen.

### FAQ

**Is PayPal discontinuing the Buy Now button?**
PayPal is deprecating Website Payments Standard (WPS), which includes the classic HTML Buy Now and Add to Cart buttons.
Its developer page (updated 4 June 2026) says WPS is deprecated from January 2026 and that PayPal may retire it any time
after 1 January 2027. Donate and Subscribe buttons remain unaffected.

**How do I know if my site uses PayPal Website Payments Standard?**
WPS buttons are HTML forms that post to `paypal.com/cgi-bin/webscr` (or links to that address). This Actor crawls your
site and lists every one with its page, item and price.

**What is a hosted PayPal button (`_s-xclick`)?**
A button saved in your PayPal account; the page only holds its ID. Its real type (Buy Now, Add to Cart, Donate,
Subscribe) is stored at PayPal, so the Actor guesses it from the button image and tells you which to check under
PayPal > Pay & Get Paid > PayPal Buttons > Saved buttons.

**What should I replace old PayPal buttons with?**
PayPal's current Payment Links and Buttons (Button Builder) or PayPal Checkout. On WooCommerce, Gravity Forms,
MemberPress and similar platforms, install the platform's current PayPal add-on instead of pasting new code.

**Do Donate buttons need changing?**
No: PayPal says Donations and Subscribe buttons remain unaffected. They are listed as `safe` (or `likely-safe` for hosted
buttons whose image says Donate/Subscribe).

### More tools from the same author

- [Google Merchant Center Q\&A Writer](https://apify.com/donrulezz/merchant-center-qa-writer): write the new question_and_answer attribute for every product, as a ready supplemental feed.
- [AI Visibility Monitor](https://apify.com/donrulezz/ai-answer-engine-monitor): does ChatGPT, Perplexity, Claude or Gemini recommend your brand.
- [Shopify Script Tag Shutoff Scanner](https://apify.com/donrulezz/shopify-script-tag-scanner): which apps on a Shopify store stop on 1 March 2027, and legacy customer accounts.
- [SSL Root Certificate Distrust Checker](https://apify.com/donrulezz/root-certificate-distrust-checker): which sites, APIs and mail servers break when Mozilla removes 19 roots on 15 April 2027.
- [Azure Classic CDN & Front Door Retirement Checker](https://apify.com/donrulezz/azure-classic-cdn-front-door-checker): hostnames and page assets still on Front Door (classic) or azureedge.net.
- [Drupal Version & End-of-Life Checker](https://apify.com/donrulezz/drupal-version-eol-checker): which sites run Drupal 10 (end of life 9 December 2026) or older.
- [Website 2027 Breakage Audit](https://apify.com/donrulezz/website-2027-breakage-audit): every 2026-2027 deadline (certificates, Shopify, PayPal, Azure, Drupal, PHP) in one report per site.

*PayPal is a trademark of PayPal, Inc. This Actor is independent and not affiliated with or endorsed by PayPal.*

# Actor input Schema

## `startUrls` (type: `array`):

Home pages (or any start page) of the sites to scan, one per line. Each site is crawled on its own host; robots.txt is respected.

## `siteListUrl` (type: `string`):

A CSV/TXT file or a published Google Sheets CSV link with your client sites; any column holding a domain or URL is used (one site per row).

## `maxPagesPerSite` (type: `integer`):

Pages that look like shop, ticket, donate, course or pricing pages are crawled first.

## `maxDepth` (type: `integer`):

How many clicks away from the start page to follow links.

## `useSitemap` (type: `boolean`):

Also queue the pages listed in the sitemap (robots.txt Sitemap lines or /sitemap.xml), so product, ticket and course pages deep in the site are reached; shop-like pages are still crawled first.

## `maxConcurrency` (type: `integer`):

Keep it low for small hosting plans.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.irfanview.com",
    "https://keepass.info"
  ],
  "maxPagesPerSite": 100,
  "maxDepth": 3,
  "useSitemap": true,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `buttons` (type: `string`):

Every legacy button with page, item, price and the fix.

## `sites` (type: `string`):

Per site: buttons to replace, to check, safe.

## `results` (type: `string`):

Everything as JSON.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.irfanview.com",
        "https://keepass.info"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("donrulezz/paypal-legacy-button-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [
        "https://www.irfanview.com",
        "https://keepass.info",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("donrulezz/paypal-legacy-button-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.irfanview.com",
    "https://keepass.info"
  ]
}' |
apify call donrulezz/paypal-legacy-button-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,donrulezz/paypal-legacy-button-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/k7b6yL8V9kkScvRoc/builds/TPZ411PacLrP1V8IA/openapi.json
