> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pocketutils.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Meta Scanner

> Parse and score a page's title, description, Open Graph, Twitter Card, and technical meta tags.

Fetches a page and audits its `<head>`: title and description length/presence, canonical URL, viewport and charset, `robots.txt` and `sitemap.xml` reachability, every Open Graph and Twitter Card tag, and the favicon. Each check is scored and rolled up into an overall grade.

<Info>
  **1 credit** per call · Typical response time \~180ms
</Info>

## Query parameters

<ParamField query="url" type="string" required>
  The page to scan. `https://` is assumed if the scheme is omitted.
</ParamField>

## Response

<ResponseField name="success" type="boolean" required />

<ResponseField name="data" type="object" required>
  <Expandable title="properties" defaultOpen>
    <ResponseField name="url" type="string" required />

    <ResponseField name="finalScore" type="integer" required>
      Overall score, 0–100.
    </ResponseField>

    <ResponseField name="grade" type="string" required>
      Letter grade derived from `finalScore` (e.g. `"A"`, `"B"`, `"F"`).
    </ResponseField>

    <ResponseField name="categories" type="array" required>
      One entry per category, each holding every check in that category.

      <Expandable title="item shape">
        <ResponseField name="id" type="string" required>
          `"basic"`, `"technical"`, `"social"`, or `"images"`.
        </ResponseField>

        <ResponseField name="results" type="array" required>
          <Expandable title="item shape">
            <ResponseField name="id" type="string" required>
              Check identifier — see the table below.
            </ResponseField>

            <ResponseField name="value" type="any" required>
              The extracted value (a string, or `null` if the tag is missing).
            </ResponseField>

            <ResponseField name="status" type="string" required>
              `"pass"`, `"warning"`, or `"fail"`.
            </ResponseField>

            <ResponseField name="message" type="string" required>
              Human-readable explanation of the result.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="summary" type="object" required>
      <Expandable title="properties">
        <ResponseField name="critical" type="integer" required>
          Checks that failed.
        </ResponseField>

        <ResponseField name="warnings" type="integer" required>
          Checks that passed with a caveat.
        </ResponseField>

        <ResponseField name="passed" type="integer" required>
          Checks that passed cleanly.
        </ResponseField>

        <ResponseField name="total" type="integer" required>
          Total checks run.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Checks by category

| Category    | Check IDs                                                                                                                                                                                                                                   |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `basic`     | `meta_title`, `meta_description`, `meta_keywords`, `meta_author`                                                                                                                                                                            |
| `technical` | `meta_viewport`, `meta_charset`, `meta_robots`, `link_canonical`, `file_robots_txt`, `file_sitemap_xml`                                                                                                                                     |
| `social`    | `og_title`, `og_description`, `og_image`, `og_image_alt`, `og_url`, `og_type`, `og_site_name`, `og_locale`, `twitter_card`, `twitter_title`, `twitter_description`, `twitter_image`, `twitter_site`, `twitter_creator`, `twitter_image_alt` |
| `images`    | `asset_favicon`                                                                                                                                                                                                                             |

## Errors

| Status | Cause                                     |
| ------ | ----------------------------------------- |
| `400`  | `url` query parameter missing             |
| `500`  | The target could not be fetched or parsed |

See the full [error reference](/errors) for the platform-level codes (`401`, `402`, `429`) that apply to every endpoint.

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.pocketutils.com/v1/meta-scan?url=https://example.com" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  const res = await fetch(
    "https://api.pocketutils.com/v1/meta-scan?url=https://example.com",
    { headers: { Authorization: "Bearer YOUR_API_KEY" } },
  );
  const { data } = await res.json();
  ```

  ```python Python theme={null}
  import requests

  res = requests.get(
      "https://api.pocketutils.com/v1/meta-scan",
      params={"url": "https://example.com"},
      headers={"Authorization": "Bearer YOUR_API_KEY"},
  )
  data = res.json()["data"]
  ```
</RequestExample>

<ResponseExample>
  ```json Response (abridged) theme={null}
  {
    "success": true,
    "data": {
      "url": "https://example.com",
      "finalScore": 78,
      "grade": "B",
      "categories": [
        {
          "id": "basic",
          "results": [
            {
              "id": "meta_title",
              "value": "Example Domain",
              "status": "pass",
              "message": "Title length is within the recommended range."
            },
            {
              "id": "meta_description",
              "value": null,
              "status": "fail",
              "message": "Meta description is missing."
            }
          ]
        },
        {
          "id": "technical",
          "results": [
            {
              "id": "link_canonical",
              "value": "https://example.com/",
              "status": "pass",
              "message": "Canonical URL is present and self-referential."
            }
          ]
        },
        {
          "id": "social",
          "results": [
            {
              "id": "og_title",
              "value": null,
              "status": "warning",
              "message": "No og:title tag found — falls back to <title> on most platforms."
            }
          ]
        },
        {
          "id": "images",
          "results": [
            {
              "id": "asset_favicon",
              "value": "https://example.com/favicon.ico",
              "status": "pass",
              "message": "Favicon found."
            }
          ]
        }
      ],
      "summary": { "critical": 3, "warnings": 5, "passed": 18, "total": 26 }
    }
  }
  ```
</ResponseExample>


## Related topics

- [Introduction](/index.md)
- [SSL Scanner](/api-reference/ssl-scan.md)
- [Rate Limits & Credits](/rate-limits-and-credits.md)
