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 itWhat you use
A page with no session — your landing, a widget third parties embedGET /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 dashboardGET /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_amount is in cents. 49900 is 499.00 MXN.
  • Bullets are bilingual inside the same object: text_es and text_en. Pick by your page's language; don't request the endpoint twice.
  • monthly_validation_limit can be null, 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