# Azure Classic CDN & Front Door Retirement Checker (`donrulezz/azure-classic-cdn-front-door-checker`) Actor

Azure Front Door (classic) retires 31 March 2027 and Azure CDN classic (azureedge.net) 30 September 2027; classic endpoints may stop from 1 April 2028. Find every hostname and page asset still pointing to them, via DNS. Bulk, no Azure login.

- **URL**: https://apify.com/donrulezz/azure-classic-cdn-front-door-checker.md
- **Developed by:** [Ashish Agarwal](https://apify.com/donrulezz) (community)
- **Categories:** Developer tools, Automation, 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 hostname checkeds

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

## Azure Classic CDN & Front Door Retirement Checker

Microsoft is retiring the classic Azure edge services:

- **Azure Front Door (classic) retires on 31 March 2027.**
- **Azure CDN Standard from Microsoft (classic) retires on 30 September 2027.**
- **"Starting April 1, 2028, classic endpoints are no longer supported and might stop functioning."** Custom domains must
  point to the new `name-hash.z01.azurefd.net` endpoint instead of `name.azurefd.net` (Front Door classic) or
  `name.azureedge.net` (CDN classic) by 31 March 2028 — even after a profile has been migrated.

Source: [Microsoft Learn, Front Door migration FAQ](https://learn.microsoft.com/azure/frontdoor/migration-faq) (updated
26 Aug 2026).

Microsoft emails the subscription owner, but agencies, MSPs, security teams and companies that only *use* assets served
from someone else's endpoint aren't told. This Actor checks, from the outside and in bulk:

- **Hostnames**: follows each custom domain's CNAME chain and tells you whether it ends at a Front Door (classic)
  endpoint, an azureedge.net (CDN classic) endpoint, or an already-migrated Standard/Premium endpoint.
- **Pages** (optional): reads a web page and checks every host its scripts, styles, images, fonts and iframes load from,
  so you also catch third-party widgets and asset hosts that sit on classic endpoints.

No Azure login, no access to anyone's subscription: public DNS and public pages only.

### Input

```json
{
  "hostnames": ["www.example.com", "cdn.example.com", "assets.example.org"],
  "pageUrls": ["https://www.example.com"]
}
```

### Output

```json
{
  "hostname": "amcdn.msftauth.net",
  "kind": "classic-front-door",
  "risk": "high",
  "endpoint": "mecontrol-prod.azurefd.net",
  "cnameChain": ["mecontrol-prod.azurefd.net", "mr-azurefd.tm-azurefd.net"],
  "action": "Points to a Front Door (classic) endpoint. Front Door (classic) retires on 31 Mar 2027: migrate the profile..."
}
```

`kind` is `classic-front-door`, `classic-cdn` (azureedge.net), `front-door-standard-premium` (nothing to do) or
`not-azure-cdn`. (Real example from 27 Oct 2026; `js.monitor.azure.com` in the same check is already on a Standard/Premium
endpoint.)

### Good to know

- A profile that was migrated but whose CNAME still points to the classic endpoint looks the same as one that wasn't
  migrated: both need the CNAME change before 31 March 2028.
- `*.azureedge.net` hostnames used directly (without a custom domain) are reported too: replace them in your apps and
  integrations.

### Pricing

Pay per hostname checked.

### FAQ

**When does Azure Front Door classic retire?** On 31 March 2027. Azure CDN Standard from Microsoft (classic) retires on
30 September 2027, and classic endpoints may stop working from 1 April 2028.

**How do I find which of my domains use azureedge.net?** Paste your hostnames (or your DNS zone's CNAME records) into
this Actor; every hostname whose CNAME chain reaches azureedge.net is flagged.

**What do I change after migrating to Front Door Standard/Premium?** Point the custom domain's CNAME to the new
`name-hash.z01.azurefd.net` endpoint, verify traffic, then delete the classic resource (Front Door classic).

### 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.
- [PayPal Legacy Button Finder](https://apify.com/donrulezz/paypal-legacy-button-finder): every old PayPal Buy Now / Add to Cart button before PayPal retires them.
- [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.
- [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.

*Microsoft, Azure and Azure Front Door are trademarks of the Microsoft group of companies. This Actor is independent and not affiliated with or endorsed by Microsoft.*

# Actor input Schema

## `hostnames` (type: `array`):

Custom domains to check, one per line (www.example.com, cdn.example.com, assets.example.org). URLs are fine too.

## `pageUrls` (type: `array`):

Optional. The Actor reads each page and checks every host its scripts, styles, images, fonts and iframes load from, including third-party ones.

## `onlyAtRiskAssets` (type: `boolean`):

For page scans: output only asset hosts on classic endpoints (on by default; turn off to list every asset host).

## Actor input object example

```json
{
  "hostnames": [
    "www.example.com",
    "cdn.example.com"
  ],
  "onlyAtRiskAssets": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Risk and action per hostname.

## `summary` (type: `string`):

Counts per endpoint type.

## `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 = {
    "hostnames": [
        "amcdn.msftauth.net",
        "js.monitor.azure.com",
        "www.microsoft.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("donrulezz/azure-classic-cdn-front-door-checker").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 = { "hostnames": [
        "amcdn.msftauth.net",
        "js.monitor.azure.com",
        "www.microsoft.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("donrulezz/azure-classic-cdn-front-door-checker").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 '{
  "hostnames": [
    "amcdn.msftauth.net",
    "js.monitor.azure.com",
    "www.microsoft.com"
  ]
}' |
apify call donrulezz/azure-classic-cdn-front-door-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,donrulezz/azure-classic-cdn-front-door-checker"
        }
    }
}
```

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/dj9mv4gXtRgxiZMd3/builds/27Jh7KUxKy3SZkY4s/openapi.json
