Tinplate 42 Edge APIs

Developer Utilities Tier 3 Ready POST /v1/schema-diff

OpenAPI & JSON Schema Diff API — Catch Breaking API Changes in CI/CD

Diff two OpenAPI 3.x or JSON Schemas to catch breaking changes and recommend SemVer bumps. Compare two OpenAPI 3.x specs or JSON Schemas to detect breaking changes, removed endpoints, tightened required fields, and recommend a SemVer bump.

Try It Live in Your Browser · No API Key Required

1. Interactive Sandbox & Sample JSON Output

200 OK · Ready

Editable Request JSON (POST /v1/schema-diff)

Live 200 OK Response Envelope

{
  "ok": true,
  "data": {
    "compatible": false,
    "detected_mode": "json_schema",
    "breaking_count": 2,
    "non_breaking_count": 0,
    "changes": [
      {
        "path": "$.email",
        "kind": "required_field_added",
        "severity": "breaking",
        "message": "Field 'email' became required",
        "before": false,
        "after": true
      },
      {
        "path": "$.name",
        "kind": "property_removed",
        "severity": "breaking",
        "message": "Property 'name' was removed",
        "before": "name",
        "after": null
      }
    ]
  },
  "meta": {
    "request_id": "req_sd_01",
    "ms": 1
  }
}

2. Quickstart Code Examples

Full TypeScript & Python SDK →
curl -X POST "https://api.tinplate.dev/v1/schema-diff" \
  -H "Content-Type: application/json" \
  -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \
  -d '{"mode":"json_schema","before":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"after":{"type":"object","required":["id","email"],"properties":{"id":{"type":"string"},"email":{"type":"string"}}}}'
import { TinplateClient } from "@tinplate/sdk"; // npm install @tinplate/sdk

const tinplate = new TinplateClient({
  rapidApiKey: process.env.RAPIDAPI_KEY!,
});

const { data, meta } = await tinplate.call("/v1/schema-diff", {
  "mode": "json_schema",
  "before": {
    "type": "object",
    "required": [
      "id"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  },
  "after": {
    "type": "object",
    "required": [
      "id",
      "email"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "email": {
        "type": "string"
      }
    }
  }
});
console.log(`[${meta.ms} ms]`, data);
import requests

response = requests.post(
    "https://api.tinplate.dev/v1/schema-diff",
    headers={
        "Content-Type": "application/json",
        "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    },
    json={
  "mode": "json_schema",
  "before": {
    "type": "object",
    "required": [
      "id"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  },
  "after": {
    "type": "object",
    "required": [
      "id",
      "email"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "email": {
        "type": "string"
      }
    }
  }
}
)
print(response.json())
const response = await fetch("https://api.tinplate.dev/v1/schema-diff", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
  },
  body: JSON.stringify({
  "mode": "json_schema",
  "before": {
    "type": "object",
    "required": [
      "id"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      }
    }
  },
  "after": {
    "type": "object",
    "required": [
      "id",
      "email"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "email": {
        "type": "string"
      }
    }
  }
}),
});
const result = await response.json();
console.log(result);
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "tinplate_schema_diff",
    "arguments": {
      "mode": "json_schema",
      "before": {
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "after": {
        "type": "object",
        "required": [
          "id",
          "email"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "email": {
            "type": "string"
          }
        }
      }
    }
  }
}
OpenAPI 3.0.3 Schema Contract

Request Parameters & Response Schema Reference

Request Body Parameters (POST /v1/schema-diff)

Parameter Type & Constraints Description
beforerequired object Previous JSON Schema or OpenAPI 3.x document.
afterrequired object New JSON Schema or OpenAPI 3.x document.
modeoptional "auto" | "json_schema" | "openapi" Comparison mode (auto detects OpenAPI when 'paths' and 'openapi' are present).

Response data Object Fields (200 OK)

Field Type Description
compatible boolean Field 'compatible'
detected_mode "json_schema" | "openapi" Field 'detected_mode'
breaking_count integer Field 'breaking_count'
non_breaking_count integer Field 'non_breaking_count'
changes object[] Field 'changes'

3. What OpenAPI & JSON Schema Breaking-Change Diff API Detects & Validates

Honest Engineering Boundaries

4. Known Limitations & Test Verification

Release Version: v1.0.7 · Last Verified / Benchmarked: 14 November 2026 · Latency Note: Sub-millisecond figures measure in-Worker V8 compute time (typical client HTTPS network RTT to the nearest Cloudflare PoP is 15–65 ms) · See Full Portfolio Benchmarks & Corpora →

5. Marketplace Plans & Payload Quotas

Plan Monthly Price Included Requests Rate Limit Max Request Payload Best For
BASIC $0.00 / month 500 / month (hard limit) 10 req / min 64 KB Evaluation, local development & CI smoke tests
PRO $9.99 / month 15,000 / month 60 req / min 128 KB Solo developers & production apps
ULTRA $29.99 / month 100,000 / month 300 req / min 256 KB Growing SaaS & multi-agent pipelines
MEGA $79.99 / month 500,000 / month 1,000 req / min 256 KB High-volume enterprise workloads

6. Frequently Asked Questions

Can I gate pull requests in GitHub Actions with this API?

Yes—send your main branch OpenAPI JSON as before and the PR branch OpenAPI JSON as after, and fail CI if breaking: true.

Does it distinguish request vs response directionality in OpenAPI?

Yes: adding a required property to a request body is breaking, while adding a new property to a response body is non-breaking (minor).

Are local $ref references resolved?

Yes, local #/components/schemas/... and #/$defs/... pointers are resolved automatically.

Zero Payload Logging

7. Data Handling, Privacy & Marketplace Proxy Disclosure

Stateless in-memory schema comparison; specs are never stored.

Worker Zero-Logging Guarantee: Cloudflare Workers Observability and invocation logging are disabled in configuration (observability.enabled = false, head_sampling_rate = 0, invocation_logs = false). Payloads are processed strictly in volatile V8 memory and never logged or stored by Tinplate.

Marketplace Proxies vs. Direct Bearer Key: Requests sent via RapidAPI or Zyla API Hub pass through those marketplaces' proxy infrastructure (subject to their respective privacy policies). Security-sensitive workloads requiring end-to-end zero-intermediary processing can connect directly to https://api.tinplate.dev using a Direct Bearer Key (Authorization: Bearer <API_KEY>). Read our full Privacy Notice and OpenAPI 3.0.3 JSON Schema.

Related Tinplate APIs

📦 POST /v1/semver-lockfile-judge Developer Utilities

SemVer & Package Manifest / Lockfile Diff Judge API

Diff two package.json files to flag breaking SemVer bumps and risky dependency changes.

🔧 POST /v1/tool-call-validator AI Safety & Agents

Agent Tool-Call Validator & Repairer API

Validate and auto-repair broken LLM tool-call arguments against your JSON Schema.

🩹 POST /v1/json-heal Live on Hub

Broken JSON & LLM Output Healer API

Repair malformed or truncated LLM JSON outputs into valid, schema-checked JSON in 1 ms.