# Meta Mate 🔍 — Link Metadata Extractor (Batch) (`perryay/meta-mate`) Actor

Fetches one or more URLs and extracts Open Graph tags, Twitter Cards, JSON-LD structured data, meta description, title, and favicon. Supports batch processing of up to 20 URLs.

- **URL**: https://apify.com/perryay/meta-mate.md
- **Developed by:** [Perry AY](https://apify.com/perryay) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / actor start

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Meta Mate — Extract Open Graph, Twitter Cards, JSON-LD, and SEO Metadata from Any URL

### What does it do?

**Meta Mate** fetches one or more URLs and extracts every piece of metadata they expose — Open Graph tags (used by Facebook, LinkedIn, Discord, Telegram, and Slack), Twitter Cards, JSON-LD structured data, HTML meta tags, page titles, and favicons. It's the fastest way to inspect how your content will appear when shared on social platforms, messaging apps, or search engines. Run a single URL or batch dozens — every tag comes back structured, clean, and ready to analyze.

### Who is it for?

| Persona | What they use it for |
|---|---|
| SEO Specialist | Auditing how pages render in social previews, checking og: tags, and verifying JSON-LD structured data implementation |
| Content Marketer | Previewing how blog posts, product pages, and landing pages look when shared on LinkedIn, Twitter, and Facebook before publishing |
| Web Developer | Validating meta tag implementations during development and catching missing og:image or twitter:card tags before launch |
| Social Media Manager | Batch-checking multiple campaign URLs to ensure all landing pages have proper, consistent share previews |
| Data Analyst | Collecting structured metadata (JSON-LD, schema.org) from competitor pages for market research and content analysis |
| Technical Writer | Verifying that documentation pages have correct Open Graph tags and structured data for search engine rich results |
| Digital Publisher | Generating link preview databases for newsletters, content aggregators, and embed widgets |

### Why use this?

- **See what the social algorithms see** — Open Graph tags determine how your link appears on Facebook, LinkedIn, Discord, Slack, Telegram, and WhatsApp. One run tells you if your og:image, og:title, and og:description are set correctly, and whether the image URL is broken or missing.
- **All metadata in one response** — Open Graph, Twitter Cards, JSON-LD, standard meta tags, page title, and favicon — all returned in a clean JSON object. No need to parse raw HTML, inspect page source, or use a dozen different validator tools.
- **Batch mode for bulk auditing** — Pass multiple URLs in a single run. Perfect for content inventories, site-wide SEO audits, competitor analysis at scale, and pre-launch campaign verification.
- **JSON-LD structured data extraction** — Pull schema.org, Article, Product, FAQ, Event, Organization, and other structured data formats from any page. Use it for knowledge graph feed generation, data analysis, or verifying your structured markup.
- **Favicon detection** — Get the favicon URL for any page. Useful when building link previews, bookmarking tools, dashboard UI elements, or any interface that needs a recognizable site icon next to a link.
- **Graceful error handling** — If a URL times out, returns a 404, or fails DNS resolution, Meta Mate reports the error for that specific URL while continuing to process the rest of your batch.

### Input Parameters

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `urls` | array | yes | — | An array of one or more fully qualified URLs to extract metadata from. Each URL should include the protocol (e.g., `https://example.com/page`). |

### Example Input

```json
{
  "urls": [
    "https://example.com/blog/post-1",
    "https://example.com/products/widget",
    "https://example.com/about"
  ]
}
````

### Output Structure

| Field | Type | Description |
|---|---|---|
| `results` | array | Array of per-URL metadata objects, in the same order as the input |
| `totalCount` | integer | Number of URLs submitted |
| `successCount` | integer | Number of URLs that were successfully fetched and parsed |
| `failCount` | integer | Number of URLs that returned errors |

#### Per-URL result structure

| Field | Type | Description |
|---|---|---|
| `url` | string | The URL that was fetched |
| `title` | string | The content of the page `<title>` element |
| `description` | string | The content of the meta description tag |
| `favicon` | string | Absolute URL of the page's favicon image |
| `openGraph` | object | Key-value pairs of all Open Graph (`og:`) tags found on the page |
| `twitterCard` | object | Key-value pairs of all Twitter Card (`twitter:`) tags found |
| `jsonLd` | array | Array of parsed JSON-LD structured data objects (may be empty) |
| `metaTags` | object | All other named `<meta>` tags (viewport, robots, charset, author, etc.) |
| `canonical` | string | The canonical URL specified in `<link rel="canonical">`, if present |
| `error` | string | Present only if fetching or parsing this URL failed |

### Example Output

```json
{
  "results": [
    {
      "url": "https://example.com/blog/post-1",
      "title": "10 Tips for Better Meta Tags",
      "description": "Learn how to optimize your meta tags for social sharing and SEO.",
      "favicon": "https://example.com/favicon.ico",
      "canonical": "https://example.com/blog/post-1",
      "openGraph": {
        "og:title": "10 Tips for Better Meta Tags",
        "og:description": "Learn how to optimize your meta tags for social sharing and SEO.",
        "og:image": "https://example.com/images/hero.jpg",
        "og:image:width": "1200",
        "og:image:height": "630",
        "og:url": "https://example.com/blog/post-1",
        "og:type": "article",
        "og:site_name": "Example Blog",
        "og:locale": "en_US"
      },
      "twitterCard": {
        "twitter:card": "summary_large_image",
        "twitter:title": "10 Tips for Better Meta Tags",
        "twitter:description": "Learn how to optimize your meta tags for social sharing.",
        "twitter:image": "https://example.com/images/hero.jpg",
        "twitter:site": "@exampleblog"
      },
      "jsonLd": [
        {
          "@context": "https://schema.org",
          "@type": "Article",
          "headline": "10 Tips for Better Meta Tags",
          "author": {
            "@type": "Person",
            "name": "Jane Doe"
          },
          "datePublished": "2025-06-15T10:00:00Z",
          "image": "https://example.com/images/hero.jpg"
        }
      ],
      "metaTags": {
        "viewport": "width=device-width, initial-scale=1",
        "robots": "index, follow",
        "author": "Jane Doe"
      }
    }
  ],
  "totalCount": 3,
  "successCount": 1,
  "failCount": 2
}
```

### API Usage

#### cURL

```bash
## Single URL extraction
curl -X POST "https://api.apify.com/v2/acts/perryay~meta-mate/runs" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
    "urls": [
      "https://example.com/blog/post-1"
    ]
  }'

## Batch extraction for SEO audit
curl -X POST "https://api.apify.com/v2/acts/perryay~meta-mate/runs" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
    "urls": [
      "https://example.com",
      "https://example.com/about",
      "https://example.com/contact",
      "https://example.com/blog",
      "https://example.com/pricing"
    ]
  }'
```

#### Python

```python
import requests

API_TOKEN = "YOUR_API_TOKEN"
ACTOR_URL = "https://api.apify.com/v2/acts/perryay~meta-mate/runs"

## Batch extract metadata from multiple URLs
response = requests.post(
    ACTOR_URL,
    headers={"Content-Type": "application/json",
             "Authorization": f"Bearer {API_TOKEN}"},
    json={
        "urls": [
            "https://example.com",
            "https://example.com/about",
            "https://example.com/contact"
        ]
    }
)

result = response.json()
print(f"Processed {result['successCount']}/{result['totalCount']} URLs successfully\n")

for page in result["results"]:
    if page.get("error"):
        print(f"❌ {page['url']}: {page['error']}")
        continue

    # Extract key metadata
    og_title = page.get("openGraph", {}).get("og:title", page["title"])
    og_image = page.get("openGraph", {}).get("og:image", "(no image)")
    og_desc = page.get("openGraph", {}).get("og:description", "(no description)")

    print(f"✅ {page['url']}")
    print(f"   Title:    {og_title}")
    print(f"   Image:    {og_image}")
    print(f"   Desc:     {og_desc[:80]}...")
    print(f"   Favicon:  {page.get('favicon', 'N/A')}")
    print(f"   JSON-LD:  {len(page.get('jsonLd', []))} object(s)")
    print()
```

### Use Cases

1. **Social Preview Audit** — Before launching a marketing campaign, run all landing pages through Meta Mate to verify og:image, og:title, and og:description are set. Check that image URLs resolve and dimensions are correct. Fix missing tags before they ruin your LinkedIn, Facebook, and Discord share previews.

2. **Competitive Content Research** — Extract metadata, titles, and descriptions from competitor blog posts and product pages. Understand what keywords and social strategies they optimize for. Collect JSON-LD structured data to see how they implement schema.org markup.

3. **Structured Data Validation** — Verify that your FAQ schema, Product schema, Article schema, and Event schema render correctly and contain valid JSON-LD. Catch syntax errors, missing @context fields, invalid property types, and broken references before Google flags them in Search Console.

4. **Bookmarking & Link Preview Tools** — Build a bookmarking app, link-sharing dashboard, or news aggregation tool that shows rich previews for every saved URL. Use the favicon, title, description, og:image, and canonical URL output to create beautiful thumbnail cards.

5. **Content Inventory at Scale** — Run all URLs from your sitemap through Meta Mate to inventory every page's metadata health. Find pages missing og:tags, pages with broken og:image URLs, pages without meta descriptions, and pages with duplicate titles — all in a single structured report.

6. **Email Campaign Pre-Flight** — Before sending a newsletter or marketing email containing links, run the destination URLs through Meta Mate to confirm they produce proper share previews. No more sending a test email to discover the og:image is missing.

7. **Favicon Collection for Dashboards** — Build a dashboard or admin panel that shows site favicons next to links. Meta Mate extracts the favicon URL from any page, which you can display as an icon next to bookmarks, recent pages, or external links.

### FAQ

**Q: How many URLs can I submit in a single run?**
A: Meta Mate accepts any number of URLs in the `urls` array. For very large batches (100+ URLs), processing time scales linearly with count — roughly 1–3 seconds per URL depending on response times of the target servers.

**Q: What happens if a URL is unreachable or returns an error?**
A: Meta Mate processes each URL independently and gracefully. Unreachable URLs, DNS failures, timeouts, and HTTP errors (404, 500, etc.) are each reported with a descriptive `error` field on that specific result. All other URLs in the batch continue processing normally.

**Q: Does Meta Mate execute JavaScript on the page?**
A: No. Meta Mate fetches the raw HTML and parses the `<head>` section for meta tags and structured data. Content rendered dynamically by JavaScript — typical of single-page apps (SPAs) built with React, Vue, or Angular — will not appear unless the page also includes static meta tags in the initial HTML.

**Q: What structured data formats are supported in JSON-LD output?**
A: Any JSON-LD embedded in `<script type="application/ld+json">` tags is extracted and returned as a parsed JavaScript object. This includes all schema.org types: Article, Product, FAQPage, Recipe, Event, Organization, Person, LocalBusiness, BreadcrumbList, HowTo, VideoObject, and more. The output preserves the full nested structure as the page authored it.

**Q: Can I use Meta Mate to check my own site's SEO health?**
A: Absolutely. It's one of the fastest ways to audit a site's meta tags at scale. Run your homepage, product pages, blog posts, and landing pages through a single batch to verify that every page has a unique title, a well-written meta description, proper og:image, and valid structured data.

**Q: Does Meta Mate return `og:image:width` and `og:image:height` tags?**
A: Yes. If the page includes these optional image dimension tags, they appear as separate keys in the `openGraph` object. This is useful for verifying that your share images meet the recommended aspect ratio (~1.91:1 for most platforms).

**Q: What is the difference between Open Graph and Twitter Cards?**
A: Open Graph is the broader protocol (used by Facebook, LinkedIn, Discord, Telegram, Pinterest). Twitter Cards are a Twitter-specific extension that can override or supplement OG tags. Meta Mate returns both so you can verify each platform's preview independently.

**Q: How does Meta Mate handle relative URLs in meta tag content?**
A: Relative URLs in `og:image`, `twitter:image`, and `<link rel="canonical">` are automatically resolved to absolute URLs based on the page's base URL, so you always get a clickable/usable URL in the output.

### Related Tools

- [JSON Studio](https://apify.com/perryay/json-studio) — Format, validate, diff, and transform JSON documents
- [QR Craft](https://apify.com/perryay/qr-craft) — Generate high-quality QR codes in PNG or SVG format
- [UUID Lab](https://apify.com/perryay/uuid-lab) — Generate UUIDs, nanoids, short IDs, and ULIDs
- [Domain Intel](https://apify.com/perryay/domain-intel) — WHOIS lookups, DNS enumeration, and SSL certificate validation

### Comparison: What Meta Mate extracts vs. what you'd parse manually

| Data Layer | What Meta Mate gives you | Manual alternative |
|---|---|---|
| Page title | `title` field | Parse `<title>` from raw HTML |
| Meta description | `description` field | Find `<meta name="description">` in the DOM |
| Open Graph tags | `openGraph` object (all og: keys) | Iterate over every `<meta property="og:*">` tag |
| Twitter Cards | `twitterCard` object (all twitter: keys) | Iterate over every `<meta name="twitter:*">` tag |
| JSON-LD structured data | `jsonLd` array (parsed objects) | Extract and JSON.parse every `<script type="application/ld+json">` |
| Favicon | `favicon` URL | Find `<link rel="icon">` and resolve relative paths |
| Canonical URL | `canonical` URL | Find `<link rel="canonical">` and resolve |
| All other meta tags | `metaTags` object | Iterate over every remaining `<meta>` element |

**Q: How does Meta Mate handle relative URLs in meta tag content?**
A: Relative URLs in `og:image`, `twitter:image`, and `<link rel="canonical">` are automatically resolved to absolute URLs based on the page's base URL, so you always get a clickable/usable URL in the output.

**Q: Can I use Meta Mate to check pages behind authentication?**
A: Meta Mate fetches the public HTML of each URL. If the page requires authentication (login, session cookie, API key), it will return the login page's metadata rather than the protected content. For authenticated page checks, use Meta Mate on the public-facing URLs of your site.

**Q: Does Meta Mate support internationalized domain names (IDNs) and non-ASCII URLs?**
A: Yes. Meta Mate accepts internationalized URLs — just make sure they are properly percent-encoded (e.g., `https://例子.测试` should be passed as `https://xn--fsq.xn--0zwm56d` or use the UTF-8 directly; the tool handles encoding as needed).

**Q: What happens if a page has no Open Graph tags at all?**
A: If a page has no Open Graph tags, the `openGraph` object will be empty (`{}`). The `title`, `description`, `favicon`, and other standard meta tags are still returned from the basic HTML parsing, so you always get some useful data even from pages without social metadata.

**Q: How fresh is the metadata Meta Mate returns?**
A: Meta Mate fetches each URL in real time when you make the request. The metadata you receive reflects the current state of the page — not a cached version. This is important for catching recently deployed changes or checking pages that update frequently.

### Quick reference: Common Open Graph tags and what they control

| Tag | Purpose | Example value |
|---|---|---|
| `og:title` | Title shown in the social share preview | `"10 Tips for Better SEO"` |
| `og:description` | Description shown below the title | `"Learn how to optimize your site..."` |
| `og:image` | Thumbnail image for the share card | `https://example.com/hero.jpg` |
| `og:url` | Canonical URL of the shared page | `https://example.com/blog/post` |
| `og:type` | Type of content (article, website, product, video) | `"article"` |
| `og:site_name` | Brand name displayed above the title | `"Example Blog"` |
| `og:locale` | Language and region | `"en_US"` |

### Quick reference: Common Twitter Card tags and what they control

| Tag | Purpose | Example value |
|---|---|---|
| `twitter:card` | Card type (summary, summary\_large\_image, app, player) | `"summary_large_image"` |
| `twitter:site` | Twitter @handle of the site | `"@exampleblog"` |
| `twitter:creator` | Twitter @handle of the content author | `"@janedoe"` |
| `twitter:title` | Title shown in the tweet card | `"10 Tips for Better SEO"` |
| `twitter:description` | Description shown in the tweet card | `"Learn how to optimize..."` |
| `twitter:image` | Image URL for the tweet card | `https://example.com/hero.jpg` |

### SEO Keywords

Open Graph extractor, Twitter Card validator, JSON-LD extractor, meta tag scraper, URL metadata extractor, social preview checker, SEO audit tool, favicon finder, structured data extractor, schema.org extractor, batch URL metadata, og:image checker, link preview generator, OG tag validator, meta description extractor, canonical URL checker, social share preview

# Actor input Schema

## `url` (type: `string`):

Single URL to extract metadata from. Leave empty if using batch mode.

## `urls` (type: `array`):

Multiple URLs to extract metadata from (up to 20). Overrides 'url' if set.

## `timeout` (type: `integer`):

Request timeout per URL

## Actor input object example

```json
{
  "url": "https://example.com",
  "urls": [
    "https://example.com",
    "https://apify.com",
    "https://github.com"
  ],
  "timeout": 15
}
```

# Actor output Schema

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

Per-URL metadata in the default dataset

# 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 = {
    "url": "https://example.com",
    "urls": [
        "https://example.com",
        "https://apify.com",
        "https://github.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("perryay/meta-mate").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 = {
    "url": "https://example.com",
    "urls": [
        "https://example.com",
        "https://apify.com",
        "https://github.com",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("perryay/meta-mate").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "url": "https://example.com",
  "urls": [
    "https://example.com",
    "https://apify.com",
    "https://github.com"
  ]
}' |
apify call perryay/meta-mate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=perryay/meta-mate",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Meta Mate 🔍 — Link Metadata Extractor (Batch)",
        "description": "Fetches one or more URLs and extracts Open Graph tags, Twitter Cards, JSON-LD structured data, meta description, title, and favicon. Supports batch processing of up to 20 URLs.",
        "version": "1.0",
        "x-build-id": "Xu0LnCaERHCuzJLEo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/perryay~meta-mate/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-perryay-meta-mate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/perryay~meta-mate/runs": {
            "post": {
                "operationId": "runs-sync-perryay-meta-mate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/perryay~meta-mate/run-sync": {
            "post": {
                "operationId": "run-sync-perryay-meta-mate",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "url": {
                        "title": "URL (single)",
                        "type": "string",
                        "description": "Single URL to extract metadata from. Leave empty if using batch mode."
                    },
                    "urls": {
                        "title": "URLs (batch)",
                        "type": "array",
                        "description": "Multiple URLs to extract metadata from (up to 20). Overrides 'url' if set."
                    },
                    "timeout": {
                        "title": "Timeout (seconds)",
                        "minimum": 5,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Request timeout per URL",
                        "default": 15
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
