Properties
| Name | Type | Description |
|---|---|---|
| schema_version | string | |
| id | string | |
| name | string | |
| vendor_domain | stringnull | |
| category | string | |
| task | stringnull | |
| summary | stringnull | |
| best_for | stringnull | |
| skip_if | stringnull | |
| honest_knock | stringnull | |
| pricing | object | |
| verification | object | Per core field: 'quoted' (a verbatim vendor line is in pricing.source_quotes), 'read' (read on the vendor's page on pricing.verified_at, summarised in pricing.notes) or 'being_verified' (not yet match |
| status_page | object | |
| measured | object | |
| third_party_video | object | Optional. A YouTube video by another channel that shows the product in use (not ours, not a paid promotion when independent is true). Absent means none was checked or none qualified. |
| free_plan | boolean | |
| cost_traps | array | |
| compare_with | objectnull | |
| links | object | |
| purchase | object | |
| unknowns | array | |
| provenance | object |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/aibuildermarketplace-com/json-schema/aibuildermarketplace-com-product-schema.json",
"title": "Product",
"x-generated": "2026-11-01",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/aibuildermarketplace-com-openapi.json#/components/schemas/Product",
"type": "object",
"required": [
"id",
"name",
"pricing",
"purchase",
"unknowns"
],
"properties": {
"schema_version": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"vendor_domain": {
"type": [
"string",
"null"
]
},
"category": {
"type": "string"
},
"task": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"best_for": {
"type": [
"string",
"null"
]
},
"skip_if": {
"type": [
"string",
"null"
]
},
"honest_knock": {
"type": [
"string",
"null"
]
},
"pricing": {
"type": "object",
"properties": {
"status": {
"type": "string"
},
"entry_price": {
"type": [
"string",
"null"
]
},
"entry_price_terms": {
"type": [
"string",
"null"
]
},
"from_price_usd_month": {
"type": [
"number",
"null"
],
"description": "Only when the entry price is US dollars per month. The lowest entry price, often on annual billing: read entry_price_terms"
},
"schema_offer": {
"type": [
"object",
"null"
],
"description": "The Offer exactly as it appears in the JSON-LD of the canonical review (what search engines read): one plan's price without commitment where known, with plan and billing basis in description. It can differ from from_price_usd_month, which is the lowest entry price.",
"properties": {
"price": {
"type": "number"
},
"currency": {
"type": [
"string",
"null"
]
},
"description": {
"type": [
"string",
"null"
]
},
"page": {
"type": "string"
}
}
},
"plans": {
"type": [
"array",
"null"
],
"items": {
"$ref": "#/$defs/Plan"
}
},
"plans_source": {
"type": [
"string",
"null"
]
},
"notes": {
"type": [
"string",
"null"
]
},
"verified_at": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": [
"string",
"null"
]
},
"recent_change": {
"type": [
"object",
"null"
],
"description": "A buyer-relevant change from the vendor's own changelog or release notes in the last 6 months (plan renamed or dropped, new limit or meter, pricing model, feature moved to a pricier plan or removed), checked by us against the source. date = when the vendor made the change; read_at = when we read it.",
"properties": {
"date": {
"type": [
"string",
"null"
]
},
"text": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": [
"string",
"null"
]
},
"read_at": {
"type": [
"string",
"null"
]
}
}
},
"source_quotes": {
"type": [
"array",
"null"
],
"description": "Verbatim lines from the vendor's own pages (max 200 characters), each matched word for word against the live page on read_on. Only quotes that still agree with pricing.notes.",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"enum": [
"price",
"free_trial",
"refund"
]
},
"plan": {
"type": [
"string",
"null"
]
},
"quote": {
"type": "string"
},
"source_url": {
"type": "string"
},
"read_on": {
"type": "string"
}
}
}
}
}
},
"verification": {
"type": "object",
"description": "Per core field: 'quoted' (a verbatim vendor line is in pricing.source_quotes), 'read' (read on the vendor's page on pricing.verified_at, summarised in pricing.notes) or 'being_verified' (not yet matched; not the same as 'does not exist'). 'measured' means a confirmed hands-on trial-duration claim in measured.claims; it does not confirm all trial terms or create a vendor quote.",
"properties": {
"price": {
"type": "string",
"enum": [
"quoted",
"read",
"being_verified",
"measured"
]
},
"free_trial": {
"type": "string",
"enum": [
"quoted",
"read",
"being_verified",
"measured"
]
},
"refund": {
"type": "string",
"enum": [
"quoted",
"read",
"being_verified",
"measured"
]
}
}
},
"status_page": {
"$ref": "#/$defs/StatusPage"
},
"measured": {
"$ref": "#/$defs/Measured"
},
"third_party_video": {
"type": "object",
"description": "Optional. A YouTube video by another channel that shows the product in use (not ours, not a paid promotion when independent is true). Absent means none was checked or none qualified.",
"properties": {
"url": {
"type": "string"
},
"channel": {
"type": "string"
},
"published": {
"type": [
"string",
"null"
]
},
"shows": {
"type": [
"string",
"null"
]
},
"independent": {
"type": "boolean"
},
"checked_at": {
"type": [
"string",
"null"
]
}
}
},
"free_plan": {
"type": "boolean"
},
"cost_traps": {
"type": "array",
"items": {
"$ref": "#/$defs/CostTrap"
}
},
"compare_with": {
"type": [
"object",
"null"
]
},
"links": {
"type": "object"
},
"purchase": {
"type": "object",
"properties": {
"seller": {
"type": "string"
},
"how": {
"type": "string"
},
"handoff_url": {
"type": [
"string",
"null"
]
},
"affiliate": {
"type": "boolean"
},
"disclosure": {
"type": "string"
}
}
},
"unknowns": {
"type": "array",
"items": {
"type": "string"
}
},
"provenance": {
"type": "object"
}
},
"$defs": {
"CostTrap": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"quote_only",
"per_seat",
"usage_metered",
"renewal_jump",
"addons_extra",
"annual_lock"
]
},
"label": {
"type": "string"
},
"evidence": {
"type": "string",
"description": "Full evidence sentence from the dossier, never truncated"
},
"verified_at": {
"type": [
"string",
"null"
]
},
"source_url": {
"type": [
"string",
"null"
]
}
}
},
"Measured": {
"type": "object",
"additionalProperties": false,
"description": "Own hands-on session from handson/<map>/meetlog.json; absent without a matching log. roles/api_access/downgrade are omitted when unknown; API availability is a UI observation, not a key or call test. tested_on is the original session date, not the rebuild date; claims and exit tests carry their own observation dates. Unknown facts are not_tested, never inferred from absence. tested_by identifies our team; the actor, account type and blocked/limited attempts are in the review.",
"required": [
"tested_on",
"tested_by",
"review_url",
"method",
"claims",
"exit_test",
"facts",
"inbox",
"invites",
"entry_exit",
"support",
"onboarding"
],
"properties": {
"tested_on": {
"type": "string",
"format": "date"
},
"tested_by": {
"type": "string"
},
"review_url": {
"type": "string",
"format": "uri"
},
"method": {
"type": "array",
"maxItems": 7,
"items": {
"type": "string"
},
"description": "Recorded actions from hands_on.methode; empty when no session steps were retained."
},
"claims": {
"type": "array",
"items": {
"$ref": "#/$defs/MeasuredClaim"
}
},
"inbox": {
"$ref": "#/$defs/MeasuredInbox"
},
"invites": {
"$ref": "#/$defs/MeasuredInvites"
},
"entry_exit": {
"$ref": "#/$defs/MeasuredEntryExit"
},
"support": {
"$ref": "#/$defs/MeasuredSupport"
},
"onboarding": {
"$ref": "#/$defs/MeasuredOnboarding"
},
"roles": {
"$ref": "#/$defs/MeasuredRoles"
},
"api_access": {
"$ref": "#/$defs/MeasuredApiAccess"
},
"downgrade": {
"$ref": "#/$defs/MeasuredDowngrade"
},
"exit_test": {
"$ref": "#/$defs/MeasuredExitTest"
},
"facts": {
"type": "object",
"additionalProperties": false,
"required": [
"trial_requires_card",
"trial_duration_confirmed",
"export_file_inspected",
"export_reimport_tested",
"export_direct_download",
"marketing_emails_14d"
],
"properties": {
"trial_requires_card": {
"$ref": "#/$defs/MeasuredFact"
},
"trial_duration_confirmed": {
"$ref": "#/$defs/MeasuredFact"
},
"export_file_inspected": {
"$ref": "#/$defs/MeasuredFact"
},
"export_reimport_tested": {
"$ref": "#/$defs/MeasuredFact"
},
"export_direct_download": {
"$ref": "#/$defs/MeasuredFact"
},
"marketing_emails_14d": {
"$ref": "#/$defs/MeasuredCountFact"
}
}
}
}
},
"MeasuredApiAccess": {
"type": "object",
"additionalProperties": false,
"required": [
"plan",
"route",
"quote",
"evidence",
"status"
],
"properties": {
"plan": {
"type": "string",
"pattern": "\\S"
},
"route": {
"type": "string",
"pattern": "\\S"
},
"quote": {
"type": "object",
"additionalProperties": false,
"required": [
"text",
"source_url",
"observed_at"
],
"properties": {
"text": {
"type": "string",
"pattern": "\\S"
},
"source_url": {
"type": "string",
"format": "uri",
"pattern": "^https?://[^/\\s?#]+(?:[^\\s]*)$"
},
"observed_at": {
"type": "string",
"format": "date-time"
}
}
},
"evidence": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^bewijs/[a-zA-Z0-9_.-]+\\.(jpg|png|webp)$"
}
},
"status": {
"enum": [
"available_on_tested_plan",
"gated",
"not_found_in_ui"
]
},
"gated_plan": {
"type": "string",
"pattern": "\\S"
}
},
"allOf": [
{
"if": {
"properties": {
"status": {
"const": "gated"
}
}
},
"then": {
"required": [
"gated_plan"
]
},
"else": {
"not": {
"required": [
"gated_plan"
]
}
}
}
]
},
"MeasuredClaim": {
"type": "object",
"description": "Exactly koopbewijs.api(): vendor claim alongside our observation, not a vendor verification.",
"required": [
"claim",
"claim_source",
"claim_read_on",
"observed",
"observed_on",
"evidence",
"status"
],
"properties": {
"claim": {
"type": "string"
},
"claim_source": {
"type": "string"
},
"claim_changed_on": {
"type": [
"string",
"null"
],
"format": "date",
"description": "First observed absence of the current vendor wording; does not change measurement status."
},
"claim_read_on": {
"type": "string",
"format": "date"
},
"observed": {
"type": "string"
},
"observed_on": {
"type": "string",
"format": "date"
},
"evidence": {
"type": "object",
"required": [
"label",
"url"
],
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
}
}
},
"status": {
"enum": [
"confirmed",
"contradicted",
"not_comparable",
"not_testable",
"out_of_date"
]
},
"plan": {
"type": [
"string",
"null"
]
},
"comparability": {
"type": [
"string",
"null"
]
},
"buying_consequence": {
"type": [
"string",
"null"
]
}
}
},
"MeasuredCountFact": {
"type": "object",
"additionalProperties": false,
"required": [
"value",
"basis",
"observed_on",
"evidence_url"
],
"properties": {
"value": {
"oneOf": [
{
"type": "integer",
"minimum": 0
},
{
"const": "not_tested"
}
]
},
"basis": {
"type": "string"
},
"observed_on": {
"type": "string",
"format": "date"
},
"evidence_url": {
"type": "null",
"description": "Aggregate not rendered in the review in this round."
}
}
},
"MeasuredDowngrade": {
"type": "object",
"additionalProperties": false,
"required": [
"plan",
"route",
"quote",
"evidence",
"status"
],
"properties": {
"plan": {
"type": "string",
"pattern": "\\S"
},
"route": {
"type": "string",
"pattern": "\\S"
},
"quote": {
"type": "object",
"additionalProperties": false,
"required": [
"text",
"source_url",
"observed_at"
],
"properties": {
"text": {
"type": "string",
"pattern": "\\S"
},
"source_url": {
"type": "string",
"format": "uri",
"pattern": "^https?://[^/\\s?#]+(?:[^\\s]*)$"
},
"observed_at": {
"type": "string",
"format": "date-time"
}
}
},
"evidence": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^bewijs/[a-zA-Z0-9_.-]+\\.(jpg|png|webp)$"
}
},
"status": {
"enum": [
"self_service",
"contact_required",
"not_offered"
]
}
}
},
"MeasuredEntryExit": {
"type": "object",
"additionalProperties": false,
"required": [
"signup",
"cancel"
],
"properties": {
"signup": {
"type": "object",
"additionalProperties": false,
"required": [
"screens",
"card_required",
"call_required",
"observed_on",
"evidence_url"
],
"properties": {
"screens": {
"oneOf": [
{
"type": "integer",
"minimum": 0
},
{
"const": "not_tested"
}
]
},
"card_required": {
"oneOf": [
{
"type": "boolean"
},
{
"const": "not_tested"
}
]
},
"call_required": {
"oneOf": [
{
"type": "boolean"
},
{
"const": "not_tested"
}
]
},
"observed_on": {
"type": [
"string",
"null"
],
"format": "date"
},
"evidence_url": {
"type": [
"string",
"null"
],
"format": "uri"
}
}
},
"cancel": {
"type": "object",
"additionalProperties": false,
"required": [
"screens",
"call_required",
"observed_on",
"evidence_url"
],
"properties": {
"screens": {
"oneOf": [
{
"type": "integer",
"minimum": 0
},
{
"const": "not_tested"
}
]
},
"call_required": {
"oneOf": [
{
"type": "boolean"
},
{
"const": "not_tested"
}
]
},
"observed_on": {
"type": [
"string",
"null"
],
"format": "date"
},
"evidence_url": {
"type": [
"string",
"null"
],
"format": "uri"
}
}
}
}
},
"MeasuredExitTest": {
"type": [
"object",
"null"
],
"description": "Exactly vertrektest.api() plus a public evidence_url. friction.format describes the route's formats, not a list of formats actually tested. available_fields/not_offered describe the dialog when file_inspected is false; they are never promoted to came_along/lost. Read not_tested and note.",
"required": [
"run_date",
"evidence_url",
"what",
"file_inspected",
"reimport_tested",
"friction",
"not_tested",
"note"
],
"properties": {
"run_date": {
"type": "string",
"format": "date"
},
"evidence_url": {
"type": "string",
"format": "uri"
},
"what": {
"type": "string"
},
"first_import": {
"type": [
"string",
"null"
]
},
"awkward": {
"type": [
"string",
"null"
]
},
"file_inspected": {
"type": "boolean"
},
"reimport_tested": {
"type": "boolean"
},
"friction": {
"type": "object",
"properties": {
"export_route": {
"type": [
"string",
"null"
]
},
"format": {
"type": [
"string",
"null"
]
},
"reimport": {
"type": [
"string",
"null"
]
},
"cancellation": {
"type": [
"string",
"null"
]
}
}
},
"came_along": {
"type": "array",
"items": {
"type": "string"
}
},
"lost": {
"type": "array",
"items": {
"type": "string"
}
},
"available_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"not_offered": {
"type": "array",
"items": {
"type": "string"
}
},
"not_tested": {
"type": "array",
"items": {
"type": "string"
}
},
"note": {
"type": "string"
}
}
},
"MeasuredFact": {
"type": "object",
"additionalProperties": false,
"required": [
"value",
"basis",
"observed_on",
"evidence_url"
],
"properties": {
"value": {
"enum": [
true,
false,
"not_tested"
]
},
"basis": {
"type": "string"
},
"observed_on": {
"type": "string",
"format": "date"
},
"evidence_url": {
"type": "string",
"format": "uri"
}
}
},
"MeasuredInbox": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"description": "Dated observation of retained INBOX/junk messages, with optional literal timeline. Counts exclude uncertain classifications; time_basis states whether the signup hour is known.",
"required": [
"window_start",
"window_end",
"window_days",
"time_basis",
"status",
"observed_at",
"counts",
"first_sales_email_hours",
"has_list_unsubscribe",
"uncertain",
"after_cancel",
"after_deletion",
"after_unsubscribe"
],
"properties": {
"window_start": {
"type": "string",
"format": "date-time"
},
"window_end": {
"type": "string",
"format": "date-time"
},
"window_days": {
"const": 14,
"type": "integer"
},
"time_basis": {
"enum": [
"signup_date_midnight_Europe_Amsterdam",
"signup_timestamp"
],
"type": "string"
},
"status": {
"enum": [
"complete",
"partial"
]
},
"observed_at": {
"type": "string",
"format": "date-time"
},
"counts": {
"type": "object",
"additionalProperties": false,
"required": [
"transactional",
"onboarding_tips",
"sales_upsell",
"personal_looking_sales"
],
"properties": {
"transactional": {
"type": "integer",
"minimum": 0
},
"onboarding_tips": {
"type": "integer",
"minimum": 0
},
"sales_upsell": {
"type": "integer",
"minimum": 0
},
"personal_looking_sales": {
"type": "integer",
"minimum": 0
}
}
},
"first_sales_email_hours": {
"type": [
"number",
"null"
],
"minimum": 0
},
"has_list_unsubscribe": {
"type": "boolean"
},
"uncertain": {
"type": "integer",
"minimum": 0
},
"after_cancel": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"status"
],
"properties": {
"status": {
"const": "not_tested"
}
}
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"window_start": {
"type": "string",
"format": "date-time"
},
"window_end": {
"type": "string",
"format": "date-time"
},
"observed_at": {
"type": "string",
"format": "date-time"
},
"status": {
"enum": [
"complete",
"partial"
]
},
"window_days": {
"const": 30,
"type": "integer"
},
"time_basis": {
"const": "event_date_midnight_Europe_Amsterdam"
},
"counts": {
"type": "object",
"additionalProperties": false,
"required": [
"transactional",
"marketing",
"sales"
],
"properties": {
"transactional": {
"type": "integer",
"minimum": 0
},
"marketing": {
"type": "integer",
"minimum": 0
},
"sales": {
"type": "integer",
"minimum": 0
}
}
},
"last_marketing_day": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 29
},
"uncertain": {
"type": "integer",
"minimum": 0
},
"has_list_unsubscribe": {
"type": "boolean"
}
},
"required": [
"window_start",
"window_end",
"observed_at",
"status",
"window_days",
"time_basis",
"counts",
"last_marketing_day",
"uncertain",
"has_list_unsubscribe"
]
}
]
},
"after_deletion": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"status"
],
"properties": {
"status": {
"const": "not_tested"
}
}
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"window_start": {
"type": "string",
"format": "date-time"
},
"window_end": {
"type": "string",
"format": "date-time"
},
"observed_at": {
"type": "string",
"format": "date-time"
},
"status": {
"enum": [
"complete",
"partial"
]
},
"window_days": {
"const": 30,
"type": "integer"
},
"time_basis": {
"const": "event_date_midnight_Europe_Amsterdam"
},
"counts": {
"type": "object",
"additionalProperties": false,
"required": [
"transactional",
"marketing",
"sales"
],
"properties": {
"transactional": {
"type": "integer",
"minimum": 0
},
"marketing": {
"type": "integer",
"minimum": 0
},
"sales": {
"type": "integer",
"minimum": 0
}
}
},
"last_marketing_day": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 29
},
"uncertain": {
"type": "integer",
"minimum": 0
},
"has_list_unsubscribe": {
"type": "boolean"
}
},
"required": [
"window_start",
"window_end",
"observed_at",
"status",
"window_days",
"time_basis",
"counts",
"last_marketing_day",
"uncertain",
"has_list_unsubscribe"
]
}
]
},
"after_unsubscribe": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"status"
],
"properties": {
"status": {
"enum": [
"not_tested",
"indeterminate"
]
}
}
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"status": {
"enum": [
"waiting",
"partial",
"complete"
]
},
"submitted_at": {
"type": "string",
"format": "date-time"
# --- truncated at 32 KB (52 KB total) ---
# Full source: https://artifacts.apis.io/aibuildermarketplace-com/json-schema/aibuildermarketplace-com-product-schema.json
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/aibuildermarketplace-com-product"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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.