# Mobile Deep Link Preflight (`checksmithcats/mobile-deep-link-preflight`) Actor

Parses public AASA and assetlinks.json files for reachability, syntax, redirect, content-type, and expected identifier match signals.

- **URL**: https://apify.com/checksmithcats/mobile-deep-link-preflight.md
- **Developed by:** [Checksmith Cats](https://apify.com/checksmithcats) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / mobile deep link report generated

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Mobile Deep Link Preflight

Mobile Deep Link Preflight checks public iOS and Android association files before or after a mobile release.

### What it checks

- AASA file reachability at `.well-known` and root paths
- `assetlinks.json` reachability at `.well-known`
- Redirect observations
- Content-Type signals
- AASA JSON parseability and size
- Observed iOS app IDs
- Observed Android package names and SHA-256 certificate fingerprints
- Optional expected-value matching against supplied app identifiers

### How it works

Submit bare domains and, if available, expected app identifiers. The Actor fetches public association files, records normalized parser signals, writes report files, and returns one dataset row per finding. If expected values are omitted, the Actor reports presence and syntax signals only and marks identifier matching as skipped.

For recurring drift records after this one-off preflight, submit the public AASA and assetlinks URLs to Policy Page Drift Pack. That pack records reachability and content-fingerprint drift but does not replace the syntax and expected-value checks here.

### Outputs

- Dataset rows: one row per finding
- `REPORT.json`: full structured report and evidence pack
- `REPORT.html`: readable report
- `REPORT.md`: Markdown report

### Billing

Pay-per-event billing is based only on domains where at least one public association file was reachable. Invalid input and domains with no reachable association file are not charged as checked domains.

### Boundary

This Actor does not inspect app binaries, entitlements, Android manifests, OS caches, app-store settings, user devices, or runtime link behavior. It records public association-file signals observed at run time.

### Related tools

- Checksmith CI - Use earlier in CI when AASA and assetlinks files are still local.
- Security Headers Bulk QA - Use when deployed association files should be checked alongside response headers.
- Policy Page Drift Pack - Use when well-known and policy files need recurring drift records.

### Minimal input

```json
{
  "domains": [
    "links.example"
  ],
  "iosTeamId": "ABCDE12345",
  "iosBundleIds": [
    "com.example.app"
  ],
  "androidPackageNames": [
    "com.example.app"
  ],
  "sha256CertFingerprints": [
    "14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
  ]
}
```

### API and scheduled use

Run the same validated input from Apify Console, the Actor API, CLI, schedules, or integrations. The run writes machine-readable findings to the default dataset and the complete report to the run storage.

### Common input errors

Start with the published example and keep `domains`, `iosTeamId`, `iosBundleIds`, `androidPackageNames`, `sha256CertFingerprints` in the documented JSON shape. Malformed JSON, unsupported URL schemes, missing required values, and inputs above the stated limits are rejected rather than repaired silently.

# Actor input Schema

## `domains` (type: `array`):

Bare domains to inspect for AASA and assetlinks.json files.

## `iosTeamId` (type: `string`):

Optional Apple Team ID used with iOS bundle IDs for AASA expected-value matching.

## `iosBundleIds` (type: `array`):

Optional iOS bundle IDs to compare against observed AASA app IDs.

## `androidPackageNames` (type: `array`):

Optional Android package names to compare against observed assetlinks.json statements.

## `sha256CertFingerprints` (type: `array`):

Optional colon-separated SHA-256 certificate fingerprints to compare against observed assetlinks.json statements.

## Actor input object example

```json
{
  "domains": [
    "example.com"
  ]
}
```

# Actor output Schema

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

No description

## `report` (type: `string`):

No description

# 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 = {
    "domains": [
        "example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("checksmithcats/mobile-deep-link-preflight").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 = { "domains": ["example.com"] }

# Run the Actor and wait for it to finish
run = client.actor("checksmithcats/mobile-deep-link-preflight").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 '{
  "domains": [
    "example.com"
  ]
}' |
apify call checksmithcats/mobile-deep-link-preflight --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,checksmithcats/mobile-deep-link-preflight"
        }
    }
}

```

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/GrMxfo4iVa98WhTCD/builds/n2QnsCUOGg6lJRIWR/openapi.json
