Every API 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 apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
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.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/ex2-com:ex2-com-compare-api"
All apis
curl "https://apis.io/api/v1/apis?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.
openapi: 3.2.0
info:
title: Ex2 catalogue Compare API
version: '1'
summary: Plans, prices and domain names of Ex2, web hosting from Québec.
description: Read-only, public, no authentication. Prices come from the Ex2 billing system (cached for up to 10 minutes), in the currency asked for, excluding taxes. Fields are added, never renamed or removed. A breaking change comes as a new version (/api/v2); the old one then keeps answering for at least 12 months, with Deprecation and Sunset headers (RFC 9745, RFC 8594) and a notice on the developers page. Errors are RFC 9457 problem details. The same data is available to AI assistants through the MCP server at https://www.ex2.com/mcp.
termsOfService: https://www.ex2.com/en/terms-and-conditions
contact:
name: Ex2 support
url: https://www.ex2.com/en/support
servers:
- url: https://www.ex2.com
tags:
- name: Compare
paths:
/api/v1/compare:
get:
operationId: comparePlans
summary: Compare plans
description: Two to 10 plans side by side, one row per specification label.
parameters:
- $ref: '#/components/parameters/plans'
- $ref: '#/components/parameters/currency'
- $ref: '#/components/parameters/lang'
responses:
'200':
description: The plans and their comparison.
content:
application/json:
schema:
$ref: '#/components/schemas/Comparison'
'400':
description: A parameter is not valid.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: A plan id is unknown.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: WHMCS (or, for availability, the registry) is unreachable and nothing is cached. Try again in a few minutes.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Error'
tags:
- Compare
components:
schemas:
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: '#/components/schemas/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: '#/components/schemas/Spec'
description: 'Single plan and compare only: the plan''s column of its page''s comparison table.'
Comparison:
type: object
required:
- currency
- lang
- plans
- comparison
properties:
currency:
type: string
lang:
type: string
plans:
type: array
items:
$ref: '#/components/schemas/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.
Error:
type: object
required:
- type
- title
- status
- detail
- code
- error
description: RFC 9457 problem details, sent as application/problem+json; error repeats code and detail as the API first gave them.
properties:
type:
type: string
description: urn:ex2:problem:<code>
title:
type: string
status:
type: integer
detail:
type: string
description: What to change, in English.
code:
type: string
description: The same code as error.code.
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Stable, e.g. invalid_currency, unknown_plan, invalid_domain, unsupported_tld, rate_limited, unavailable, whois_unavailable.
message:
type: string
description: What to change, in English.
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.
parameters:
currency:
name: currency
in: query
required: false
description: 'Currency of the prices: EUR for France and Europe, CAD for Canada, USD elsewhere.'
schema:
type: string
enum:
- CAD
- EUR
- USD
default: USD
lang:
name: lang
in: query
required: false
description: Language of names, features, specifications and links.
schema:
type: string
enum:
- en
- fr
default: en
plans:
name: plans
in: query
required: true
description: 2 to 10 plan ids, comma-separated, e.g. green-power,green-expert.
schema:
type: string
pattern: ^[a-z0-9-]+(,[a-z0-9-]+)+$
externalDocs:
description: Developers page
url: https://www.ex2.com/en/developers