Skip to content

Products

The clinic's storefront catalogue, its prices and purchase options, and the four products test mode sells.

A product is one thing a clinic's storefront sells: a medication prescribed through a case, or a product that ships without one. The catalogue is read-only here; the clinic's products manager owns every row.

Both operations need products:read.

curl "https://api.cuvo.co/v1/products?status=active&type=medication" \
  -H "Authorization: Bearer cuvo_sk_live_…"
{
  "data": [
    {
      "id": "prod_2a7f",
      "name": "Tadalafil",
      "type": "medication",
      "rx": true,
      "status": "active",
      "category": "sexual_health",
      "price_cents": 2900,
      "price_unit": "/mo",
      "price_qualifier": null,
      "purchase_options": [
        { "kind": "monthly", "price_cents": 2900, "recurring_price_cents": 3900 },
        { "kind": "one_time", "price_cents": 4900, "recurring_price_cents": null }
      ],
      "variations": [],
      "medication": "med_tadalafil",
      "is_membership": false,
      "follow_up_months": 12,
      "blocked_states": [],
      "orderable": true,
      "created_at": "2026-10-01T12:00:00Z",
      "updated_at": "2026-11-01T08:30:00Z"
    }
  ],
  "has_more": false
}
  • status, type and updated_after filter the list; limit and starting_after page it, newest first.
  • GET /v1/products/{id} reads one.

What a product says

price_cents with price_unit and price_qualifier is the headline price as the storefront prints it. What a customer is actually charged is a purchase option: kind is one_time, monthly, quarterly, yearly or a custom cadence written every_<n>_<unit>, price_cents is the first charge, and recurring_price_cents is what each later charge costs when the option is an introductory offer. A product with variations (doses, strengths) prices each variation with its own options.

medication is the catalog id GET /v1/medications publishes, for a product that dispenses one. is_membership marks a plan whose purchase starts a recurring membership. blocked_states are the states the storefront will not sell into, and orderable is true when a patient can buy the product right now: active, priced and complete enough to check out.

A product never carries what it costs the clinic, its checkout configuration, the questionnaire behind it, or its storefront image and copy.

A purchase names its product as product.id, with the variation_id and purchase_option that were bought.

In test mode

Every sandbox sells the same four products, so you can pin their ids in your tests:

idWhat it is
prod_test_semaglutideA medication with two dose variations, starter and maintenance
prod_test_tadalafilA medication with an introductory monthly price
prod_test_sharps_kitA product that ships without a prescription
prod_test_membershipA membership plan, monthly or yearly

Buy them with POST /v1/test/purchases. See Purchases and customers. The sandbox does not model memberships yet, so buying the plan records a treatment purchase and opens no membership.