c. CallMint

DEVELOPER GUIDE

Small surface.
Clear contracts.

Base URL: https://staging.callmint.dev. Download OpenAPI 3.1.

Authentication & billing

Use Authorization: Bearer cm_… and Content-Type: application/json. Every chargeable POST requires an Idempotency-Key of 8–128 ASCII letters, digits, underscores, dots, colons or hyphens. Keys are unique per account across endpoints. Same endpoint and JSON serialization replays the saved result for 24 hours, including its original balance snapshot. Property order matters. After 24 hours, retained tombstones prevent repeat billing and return 409 result_expired.

A request reserves credits before work. Validation errors and upstream/server failures refund them. Interrupted reservations are refunded after two minutes by a five-minute cron. Successful DNS lookups with no records are billed; upstream 4xx/5xx failures are not. Four disabled routes return 503 before reservation.

Get and recover a key

Verify your email from Your credits, buy a pack and wait for the signed payment webhook. Then explicitly issue your key. Email links and customer sessions last 15 minutes. Key issuance/rotation consumes the session and revokes every old key. Lost the response? Request another email link and rotate again. Email never contains a full key.

GET /billing/balance with a bearer key returns {"credits":5000}. POST /billing/checkout with the same key, a new Idempotency-Key and {"pack":5000} recharges the same account. Packs: 5000, 10000, 25000. The browser uses its verified HttpOnly session instead. Checkout returns only checkout_url.

Errors

HTTPError
400invalid_input
401invalid_api_key
402insufficient_credits
403account_suspended
404not_found
409idempotency_conflict / request_in_progress / result_expired / reservation_expired
413payload_too_large
415unsupported_media_type
429rate_limited
500internal_error
502upstream_error
503endpoint_unavailable
504upstream_timeout

Errors include credits_charged: 0. Errors may also include idempotency_key_required, verification_required, checkout_unavailable or purchase_mismatch. Retry a 409 request_in_progress using the same key later. Never retry an uncertain charged request with a new key.

Project-based business checks

Start with Invoice Policy, then compare supplied crawler and SEO snapshots. Project setup and policy examples. These APIs do not fetch websites or run background monitoring.

Rate limits & privacy

Default quota: 60 requests per minute per key/account, 5 email recovery requests per 15 minutes per IP and 3 per email, 5 checkout attempts per 15 minutes per IP, and 10 demos per minute per IP. Fixed windows; retries count. No CORS is granted unless configured. Request bodies are not logged, but successful result JSON is stored for replay for 24 hours and may contain customer data. Billing and idempotency records are retained for reconciliation.

POST /v1/json-repair

Repair fenced JSON and trailing commas

Clean JSON copied from a code block before passing it into a workflow.

2 credits · USD $0.002

Input schema

{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "maxLength": 50000,
      "x-maxUtf8Bytes": 50000
    }
  },
  "required": [
    "text"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/json-repair' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"text":"{\"name\":\"CallMint\",}"}'

Response result

{
  "value": {
    "name": "CallMint"
  },
  "transformations": [
    "removed_trailing_commas"
  ]
}

Limitations

Only removes complete JSON code fences and trailing commas outside strings. Does not infer missing quotes, values or braces. The text field is limited to 50 KB of UTF-8.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/utm-validator

Build and check UTM campaign URLs

Check campaign tagging while preserving existing query parameters. This API never opens the destination URL.

1 credits · USD $0.001

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "x-maxUtf8Bytes": 2048
    },
    "utm_source": {
      "type": "string",
      "maxLength": 200,
      "x-maxUtf8Bytes": 200
    },
    "utm_medium": {
      "type": "string",
      "maxLength": 200,
      "x-maxUtf8Bytes": 200
    },
    "utm_campaign": {
      "type": "string",
      "maxLength": 200,
      "x-maxUtf8Bytes": 200
    },
    "utm_term": {
      "type": "string",
      "maxLength": 200,
      "x-maxUtf8Bytes": 200
    },
    "utm_content": {
      "type": "string",
      "maxLength": 200,
      "x-maxUtf8Bytes": 200
    }
  },
  "required": [
    "url"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/utm-validator' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com/?ref=launch","utm_source":"newsletter","utm_medium":"email","utm_campaign":"november"}'

Response result

{
  "url": "https://example.com/?ref=launch&utm_source=newsletter&utm_medium=email&utm_campaign=november",
  "valid": true,
  "missing": []
}

Limitations

Requires HTTP(S) without embedded credentials. A valid result means source, medium and campaign are nonblank; it does not measure campaign performance.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/invoice-validator

Check invoice arithmetic with decimal rounding

Catch invoice total mismatches before importing billing data into another system.

20 credits · USD $0.020

Input schema

{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "minItems": 1,
      "maxItems": 200,
      "items": {
        "type": "object",
        "properties": {
          "quantity": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 999999999999
              },
              {
                "type": "string",
                "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
              }
            ]
          },
          "unit_price": {
            "oneOf": [
              {
                "type": "number",
                "minimum": 0,
                "maximum": 999999999999
              },
              {
                "type": "string",
                "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
              }
            ]
          }
        },
        "required": [
          "quantity",
          "unit_price"
        ]
      }
    },
    "total": {
      "oneOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 999999999999
        },
        {
          "type": "string",
          "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
        }
      ]
    },
    "tax": {
      "oneOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 999999999999
        },
        {
          "type": "string",
          "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
        }
      ]
    },
    "discount": {
      "oneOf": [
        {
          "type": "number",
          "minimum": 0,
          "maximum": 999999999999
        },
        {
          "type": "string",
          "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
        }
      ]
    },
    "currency": {
      "enum": [
        "USD",
        "EUR",
        "GBP",
        "AUD",
        "CAD",
        "JPY",
        "KWD"
      ]
    }
  },
  "required": [
    "items",
    "total"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/invoice-validator' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"items":[{"quantity":2,"unit_price":"10.00"}],"tax":"2.00","total":"22.00","currency":"USD"}'

Response result

{
  "valid": true,
  "currency": "USD",
  "rounding": "half_up_per_line",
  "line_totals": [
    20
  ],
  "subtotal": 20,
  "expected_total": 22,
  "provided_total": 22,
  "difference": 0,
  "note": "Arithmetic only. Tax calculation and jurisdiction rules not verified."
}

Limitations

Arithmetic only, not tax-law validation. Up to 200 lines. Nonnegative fixed-point values only; quantities and unit prices have at most six decimals. Tax, discount and total use currency precision: JPY 0, KWD 3, others 2. Each line rounds half up before summing; discount is a fixed invoice amount. Prefer decimal strings. No scientific notation, unsafe totals or discount exceeding subtotal.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/webhook-hmac

Verify generic HMAC-SHA256 signatures

Check a raw UTF-8 payload against a shared-secret hexadecimal signature.

1 credits · USD $0.001

Input schema

{
  "type": "object",
  "properties": {
    "secret": {
      "type": "string",
      "maxLength": 1000,
      "x-maxUtf8Bytes": 1000
    },
    "payload": {
      "type": "string",
      "maxLength": 50000,
      "x-maxUtf8Bytes": 50000
    },
    "signature": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    }
  },
  "required": [
    "secret",
    "payload",
    "signature"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/webhook-hmac' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"secret":"key","payload":"The quick brown fox jumps over the lazy dog","signature":"f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"}'

Response result

{
  "valid": true,
  "algorithm": "HMAC-SHA256",
  "note": "Generic raw-body hex HMAC only; not a Stripe signature verifier"
}

Limitations

Generic raw UTF-8 HMAC only. Not a Stripe webhook verifier. Signature accepts 64 hex characters with an optional sha256= prefix. Do not send production secrets unless you accept processing them by this service; request bodies are not logged or retained.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/jsonld-validator

Check JSON-LD syntax and basic structure

Confirm that a JSON-LD payload is parseable and inspect whether top-level context and type are present.

5 credits · USD $0.005

Input schema

{
  "type": "object",
  "properties": {
    "document": {
      "oneOf": [
        {
          "type": "string",
          "maxLength": 50000,
          "x-maxUtf8Bytes": 50000
        },
        {
          "type": "object"
        },
        {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object"
          }
        }
      ]
    }
  },
  "required": [
    "document"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/jsonld-validator' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"document":{"@context":"https://schema.org","@type":"Thing"}}'

Response result

{
  "valid": true,
  "has_context": true,
  "has_type": true,
  "note": "Syntax/basic structure only; not full schema.org validation"
}

Limitations

Accepts an object or a nonempty array of objects, including an encoded JSON string. Does not resolve contexts or check Schema.org semantics. Array responses report false for the two top-level presence flags.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/metadata

Public HTML metadata extraction — coming soon

Planned: extract page title, canonical URL, descriptions and social metadata for content tooling.

5 credits · USD $0.005 · Coming soon; unavailable and unbilled.

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "x-maxUtf8Bytes": 2048
    }
  },
  "required": [
    "url"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/metadata' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com"}'

Response (503)

{
  "error": "endpoint_unavailable",
  "credits_charged": 0
}

Limitations

Unavailable: connection-level public-IP enforcement and a robust HTML parser have not been verified. No outbound fetch or billing occurs.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/redirects

Public redirect inspection — coming soon

Planned: inspect redirect hops when checking destination changes in published links.

5 credits · USD $0.005 · Coming soon; unavailable and unbilled.

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "x-maxUtf8Bytes": 2048
    }
  },
  "required": [
    "url"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/redirects' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com"}'

Response (503)

{
  "error": "endpoint_unavailable",
  "credits_charged": 0
}

Limitations

Unavailable: safe destination enforcement across redirects and DNS rebinding has not been verified. No outbound fetch or billing occurs.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/email-domain

Look up a domain’s MX and DMARC records

Inspect mail routing and the presence of a DMARC TXT declaration before configuring a domain.

3 credits · USD $0.003

Input schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "maxLength": 253,
      "x-maxUtf8Bytes": 253
    }
  },
  "required": [
    "domain"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/email-domain' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"domain":"example.org"}'

Response result

{
  "domain": "example.org",
  "mx": [
    "0 ."
  ],
  "dmarc": [],
  "note": "DNS records only; does not verify a mailbox, SPF or DMARC policy correctness."
}

Limitations

Uses a fixed Cloudflare DNS-over-HTTPS resolver, never the supplied domain as an HTTP destination. Maximum 20 records per result and 32 KB per DNS response. NXDOMAIN/no records is successful data and billed. Resolver errors/timeouts are not billed. Does not verify mailbox existence, SPF or DMARC policy validity. DNS examples are illustrative and can change.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/robots

Robots directive inspection — coming soon

Planned: retrieve and inspect published robots.txt directives for a website.

3 credits · USD $0.003 · Coming soon; unavailable and unbilled.

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "x-maxUtf8Bytes": 2048
    },
    "agent": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    }
  },
  "required": [
    "url"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/robots' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com"}'

Response (503)

{
  "error": "endpoint_unavailable",
  "credits_charged": 0
}

Limitations

Unavailable: safe egress has not been verified. No authoritative bot allow/deny or RFC 9309 compliance is claimed. No outbound fetch or billing occurs.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/sitemap

Sitemap structure inspection — coming soon

Planned: inspect an XML sitemap’s type and location count without crawling the site.

10 credits · USD $0.010 · Coming soon; unavailable and unbilled.

Input schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "maxLength": 2048,
      "x-maxUtf8Bytes": 2048
    }
  },
  "required": [
    "url"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/sitemap' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://example.com"}'

Response (503)

{
  "error": "endpoint_unavailable",
  "credits_charged": 0
}

Limitations

Unavailable: safe egress and bounded XML parsing have not been verified. No full-site crawl, outbound fetch or billing occurs.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/invoice-policy

Invoice Policy API

Apply your project’s immutable invoice rules and check vendor/invoice-number duplicates without storing raw invoices.

30 credits · USD $0.030

Input schema

{
  "type": "object",
  "properties": {
    "project_id": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    },
    "rule_version": {
      "type": "integer",
      "minimum": 1
    },
    "invoice": {
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "minItems": 1,
          "maxItems": 200,
          "items": {
            "type": "object",
            "properties": {
              "quantity": {
                "oneOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 999999999999
                  },
                  {
                    "type": "string",
                    "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
                  }
                ]
              },
              "unit_price": {
                "oneOf": [
                  {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 999999999999
                  },
                  {
                    "type": "string",
                    "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
                  }
                ]
              }
            },
            "required": [
              "quantity",
              "unit_price"
            ]
          }
        },
        "total": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 999999999999
            },
            {
              "type": "string",
              "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
            }
          ]
        },
        "tax": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 999999999999
            },
            {
              "type": "string",
              "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
            }
          ]
        },
        "discount": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 999999999999
            },
            {
              "type": "string",
              "pattern": "^\\d{1,12}(\\.\\d{1,6})?$"
            }
          ]
        },
        "currency": {
          "enum": [
            "USD",
            "EUR",
            "GBP",
            "AUD",
            "CAD",
            "JPY",
            "KWD"
          ]
        },
        "vendor": {
          "type": "string",
          "maxLength": 200,
          "x-maxUtf8Bytes": 200
        },
        "invoice_number": {
          "type": "string",
          "maxLength": 200,
          "x-maxUtf8Bytes": 200
        }
      },
      "required": [
        "items",
        "total"
      ],
      "description": "Vendor and invoice_number are required unless duplicate_check is false in the chosen policy."
    }
  },
  "required": [
    "project_id",
    "rule_version",
    "invoice"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/invoice-policy' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"project_id":"YOUR_PROJECT_ID","rule_version":1,"invoice":{"vendor":"Example vendor","invoice_number":"INV-001","items":[{"quantity":2,"unit_price":"10.00"}],"total":"20.00","currency":"USD"}}'

Response result

{
  "project_id": "YOUR_PROJECT_ID",
  "kind": "invoice",
  "passed": true,
  "findings": [],
  "severity": "none",
  "rule_version": 1,
  "checked_at": "2026-11-03T00:00:00.000Z",
  "fingerprint": "KEYED_DIGEST",
  "duplicate": false,
  "changes": []
}

Limitations

30 credits per successful check, including a failed policy finding. Uses invoice-validator arithmetic. Duplicate identity is the normalized vendor and invoice number within one project, retained for 90 days; a retry with the same Idempotency-Key is not a duplicate. Select an explicit policy version. Findings retain no raw invoice; policy rules may contain a vendor requirement. Not tax-law validation.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/crawler-policy

AI Crawler Policy Snapshot Comparison

Compare customer-supplied crawler permission maps with a saved baseline and required crawler list.

20 credits · USD $0.020

Input schema

{
  "type": "object",
  "properties": {
    "project_id": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    },
    "rule_version": {
      "type": "integer",
      "minimum": 1
    },
    "baseline_id": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    },
    "current": {
      "type": "object",
      "properties": {
        "crawlers": {
          "type": "object",
          "maxProperties": 20,
          "propertyNames": {
            "minLength": 1,
            "maxLength": 100
          },
          "additionalProperties": {
            "type": "boolean"
          }
        }
      },
      "required": [
        "crawlers"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "project_id",
    "rule_version",
    "baseline_id",
    "current"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/crawler-policy' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"project_id":"YOUR_PROJECT_ID","rule_version":1,"baseline_id":"YOUR_SNAPSHOT_ID","current":{"crawlers":{"GPTBot":true}}}'

Response result

{
  "project_id": "YOUR_PROJECT_ID",
  "kind": "crawler",
  "passed": true,
  "findings": [],
  "severity": "none",
  "rule_version": 1,
  "checked_at": "2026-11-03T00:00:00.000Z",
  "fingerprint": null,
  "duplicate": false,
  "changes": []
}

Limitations

20 credits. Customer-supplied normalized permissions only, at most 20 crawler names. Does not fetch or parse robots.txt, claim RFC 9309 compliance, grant legal permission or guarantee AI visibility. No background monitoring. Caller is responsible for obtaining accurate snapshots. External robots fetching remains disabled.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.

POST /v1/seo-guard

SEO Deployment Guard Snapshot Comparison

Compare customer-supplied deployment metadata with a baseline and versioned release requirements.

50 credits · USD $0.050

Input schema

{
  "type": "object",
  "properties": {
    "project_id": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    },
    "rule_version": {
      "type": "integer",
      "minimum": 1
    },
    "baseline_id": {
      "type": "string",
      "maxLength": 100,
      "x-maxUtf8Bytes": 100
    },
    "current": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string",
          "maxLength": 2048
        },
        "description": {
          "type": "string",
          "maxLength": 2048
        },
        "canonical": {
          "type": "string",
          "maxLength": 2048,
          "description": "Empty or HTTPS URL without credentials."
        },
        "indexable": {
          "type": "boolean"
        },
        "jsonld_types": {
          "type": "array",
          "maxItems": 50,
          "items": {
            "type": "string",
            "maxLength": 100
          }
        }
      },
      "required": [
        "title",
        "description",
        "canonical",
        "indexable",
        "jsonld_types"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "project_id",
    "rule_version",
    "baseline_id",
    "current"
  ]
}

Request

curl -X POST 'https://staging.callmint.dev/v1/seo-guard' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Idempotency-Key: unique-request-001' \
  -H 'Content-Type: application/json' \
  -d '{"project_id":"YOUR_PROJECT_ID","rule_version":1,"baseline_id":"YOUR_SNAPSHOT_ID","current":{"title":"Example","description":"Example page","canonical":"https://example.com/","indexable":true,"jsonld_types":["WebPage"]}}'

Response result

{
  "project_id": "YOUR_PROJECT_ID",
  "kind": "seo",
  "passed": true,
  "findings": [],
  "severity": "none",
  "rule_version": 1,
  "checked_at": "2026-11-03T00:00:00.000Z",
  "fingerprint": null,
  "duplicate": false,
  "changes": []
}

Limitations

50 credits. Compares supplied title, description, canonical, indexing flag and structured-data type list. Does not fetch HTML, verify indexing, crawl redirects or validate structured-data semantics. Baselines are explicit and immutable; no scheduler or dashboard.

All enabled routes accept a JSON object of at most 60,000 UTF-8 bytes. String limits are also measured in UTF-8 bytes.