Goal
Render your own pricing cards or your own comparison table from the real catalogue data, without copying it by hand and without it going stale when the catalogue changes.
There are two doors, and which one you take depends on where the content goes:
| Where you show it | What you use |
|---|---|
| A page with no session — your landing, a widget third parties embed | GET /v1/plans/public and GET /v1/plans/public/comparison. No credentials, a five-minute cache and per-IP rate limiting. |
| A page behind your API key — your product's dashboard | GET /v1/plans and GET /v1/plans/{slug}/prices. |
Prerequisites
- For the public door, nothing.
- For the other one, an active API key (
veriko_…).
Steps
1. Fetch the public catalogue
curl 'https://api.veriko.mx/v1/plans/public'It returns the plans that are active and flagged public, each with its prices and bullets already filtered down to the active ones:
{
"data": [
{
"type": "plan",
"id": "pro",
"attributes": {
"slug": "pro",
"name": "Pro",
"billing_model": "subscription",
"monthly_validation_limit": 5000,
"trial_days": 14,
"sort_order": 20,
"prices": [
{ "currency": "MXN", "billing_interval": "month", "kind": "base", "unit_amount": 49900, "tax_behavior": "inclusive" }
],
"features": [
{ "text_es": "500 validaciones al mes", "text_en": "500 validations per month", "icon": "check", "sort_order": 10 }
]
}
}
]
}Three things worth knowing before you render it:
unit_amountis in cents.49900is 499.00 MXN.- Bullets are bilingual inside the same object:
text_esandtext_en. Pick by your page's language; don't request the endpoint twice. monthly_validation_limitcan benull, and that is not a gap: it means no limit.
2. Fetch the comparison table
curl 'https://api.veriko.mx/v1/plans/public/comparison'The columns are the same plans as the previous step, in the same order — the comparison cannot drift from the cards — and each row is a bilingual dimension whose cells are either boolean (included or not) or text.
3. From an authenticated surface
GET /v1/plans returns the active plans with their bullets, without the "public" filter. It is what the dashboard uses for its own pricing card.
curl 'https://api.veriko.mx/v1/plans' \
-H 'Authorization: Bearer veriko_••••'And for one plan's price breakdown:
curl 'https://api.veriko.mx/v1/plans/pro/prices' \
-H 'Authorization: Bearer veriko_••••'Prices arrive broken down by currency × interval × kind, and meta.plan carries a mini-summary of the plan (billing_model, trial_days, included_validations) so you can render the context without a second request.
4. Handing off to checkout
None of these endpoints exposes the Stripe price identifier: that is resolved server-side when the payment session is created. Your interface only sends what the user picked — plan_slug, currency, billing_interval — never the concrete price.
Next steps
- The plan the account is on right now, with its cycle dates:
GET /v1/billing/subscription. - How usage is counted against the plan's limit: Quotas and plans.