Properties
| Name | Type | Description |
|---|---|---|
| currency | string | |
| lang | string | |
| plans | array | |
| comparison | array |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/ex2-com/json-schema/ex2-com-comparison-schema.json",
"title": "Comparison",
"x-generated": "2026-10-30",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/ex2-com-openapi.json#/components/schemas/Comparison",
"type": "object",
"required": [
"currency",
"lang",
"plans",
"comparison"
],
"properties": {
"currency": {
"type": "string"
},
"lang": {
"type": "string"
},
"plans": {
"type": "array",
"items": {
"$ref": "#/$defs/Plan"
}
},
"comparison": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"values"
],
"properties": {
"label": {
"type": "string"
},
"values": {
"type": "object",
"additionalProperties": {
"type": [
"string",
"boolean",
"null"
]
},
"description": "Plan id => value; null where a plan has no such row."
}
}
}
}
},
"$defs": {
"Plan": {
"type": "object",
"required": [
"id",
"line",
"name",
"url",
"featured",
"on_quote",
"features",
"pricing",
"order_url"
],
"properties": {
"id": {
"type": "string",
"description": "Stable plan id: <line>-<key>."
},
"line": {
"type": "string",
"enum": [
"green",
"wordpress",
"divi",
"woocommerce",
"ecommerce",
"cms",
"site-builder",
"n8n",
"email",
"reseller",
"vps",
"dedicated",
"server-management"
]
},
"name": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri",
"description": "The plan's product page."
},
"featured": {
"type": "boolean",
"description": "The plan the page highlights."
},
"on_quote": {
"type": "boolean",
"description": "Sold on quote: no price, contact Ex2 through url."
},
"features": {
"type": "array",
"items": {
"type": "string"
},
"description": "Main features, as the page lists them."
},
"mailboxes": {
"oneOf": [
{
"type": "integer",
"minimum": 1
},
{
"const": "unlimited"
}
],
"description": "Email plans only."
},
"performance_index": {
"type": "number",
"description": "Resources against green hosting Power = 1, where the catalogue has it."
},
"pricing": {
"oneOf": [
{
"$ref": "#/$defs/Pricing"
},
{
"type": "null"
}
],
"description": "null when sold on quote or not priced in this currency."
},
"order_url": {
"oneOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "The cart with this plan, or null without pricing."
},
"specs": {
"type": "array",
"items": {
"$ref": "#/$defs/Spec"
},
"description": "Single plan and compare only: the plan's column of its page's comparison table."
}
}
},
"Pricing": {
"type": "object",
"required": [
"free",
"billing_cycles",
"setup_fees",
"first_year_discount",
"from_per_month"
],
"properties": {
"free": {
"type": "boolean"
},
"billing_cycles": {
"type": "object",
"properties": {
"monthly": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"quarterly": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"semiannually": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"annually": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"biennially": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"triennially": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
}
},
"additionalProperties": false,
"description": "Price of each enabled cycle, which is also the renewal price."
},
"setup_fees": {
"type": "object",
"properties": {
"monthly": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"quarterly": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"semiannually": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"annually": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"biennially": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
},
"triennially": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
}
},
"additionalProperties": false,
"description": "Setup fee per cycle, where there is one."
},
"first_year_discount": {
"oneOf": [
{
"type": "object",
"required": [
"percent",
"annually"
],
"properties": {
"percent": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"annually": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
}
}
},
{
"type": "null"
}
]
},
"from_per_month": {
"type": "number",
"minimum": 0,
"description": "In the answer's currency, excluding taxes."
}
}
},
"Spec": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string"
},
"value": {
"type": [
"string",
"boolean"
],
"description": "true / false for the table's check marks and crosses."
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/ex2-com-comparison"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.