{"openapi":"3.1.0","info":{"title":"Medoura Landing Page API","version":"1.0.0","description":"Read-only API that lets a tenant pull its Medoura branding, content, categories, products and pricing into a custom landing page. Internal and admin routes are not part of this public contract and are never included here."},"servers":[{"url":"https://medoura.co","description":"Production"}],"tags":[{"name":"Branding","description":"Tenant branding (/api/v1)."},{"name":"Content","description":"Tenant content (/api/v1)."},{"name":"Catalog","description":"Product categories, products and pricing (/api/v1)."}],"components":{"securitySchemes":{"apiKeyBearer":{"type":"http","scheme":"bearer","description":"A Medoura API key, sent as `Authorization: Bearer <key>`."}},"schemas":{"PublicApiError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_key","feature_not_enabled","account_locked","not_found","validation_failed","rate_limited","internal_error"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}}}}},"required":["code","message"]}},"required":["error"]}}},"paths":{"/api/v1/branding":{"get":{"summary":"Get tenant branding","description":"The tenant's brand identity: names, contact details, legal links and imagery. Light and dark variants are provided for logos and colors. Only values the tenant has configured (or that derive from the tenant's own domain or LegitScript seal id) are returned. Every field the tenant has not configured is null, never a Medoura or platform default, so check for null before use.\n\nRequires `Authorization: Bearer <Medoura API key>`. The key resolves to exactly one tenant -- no request names a tenant.","tags":["Branding"],"operationId":"getApiV1Branding","security":[{"apiKeyBearer":[]}],"responses":{"200":{"description":"The tenant's branding. Every field is a string or null. New fields may be added over time.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"name":{"type":["string","null"],"description":"Display name. Null when the tenant has not configured it."},"shortName":{"type":["string","null"],"description":"Short name. Null when the tenant has not configured it. Falls back to the tenant's own `name` when only that is set."},"legalName":{"type":["string","null"],"description":"Legal entity name. Null when the tenant has not configured it. Falls back to the tenant's own `name` when only that is set."},"operatingState":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"url":{"type":["string","null"],"description":"The tenant's production site URL, derived from its own configured domain. Null when the tenant has no usable domain."},"shopUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"cdnUrl":{"type":["string","null"],"description":"Base URL for the tenant's hosted assets. Null when the tenant has not configured it."},"logoLightUrl":{"type":["string","null"],"description":"Logo for light backgrounds. Null when the tenant has not configured it. Absolute http(s) URL."},"logoDarkUrl":{"type":["string","null"],"description":"Logo for dark backgrounds. Null when the tenant has not configured it. Absolute http(s) URL."},"symbolLogoUrl":{"type":["string","null"],"description":"Symbol mark for light backgrounds. Null when the tenant has not configured it. Absolute http(s) URL."},"symbolLogoDarkUrl":{"type":["string","null"],"description":"Symbol mark for dark backgrounds. Null when the tenant has not configured it. Absolute http(s) URL."},"faviconUrl":{"type":["string","null"],"description":"Favicon. Null when the tenant has not configured it. Absolute http(s) URL."},"supportEmail":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"supportPhone":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"supportPhoneDisplay":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"privacyContactEmail":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"privacyContactPhone":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"privacyEffectiveDate":{"type":["string","null"],"description":"ISO date (YYYY-MM-DD) the Notice of Privacy Practices took effect. Null when the tenant has not configured it."},"billingContactEmail":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"billingContactPhone":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"emergencyInstructions":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"nppUrl":{"type":["string","null"],"description":"Notice of Privacy Practices URL. The tenant's own value when configured; otherwise derived from the tenant's domain (its hosted privacy-policy page); null when neither exists."},"patientTermsUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"telehealthConsentUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"paymentTermsUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"communicationsUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"additionalDocumentsUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"twitterHandle":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"trustpilotUrl":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"legitscriptSealId":{"type":["string","null"],"description":"Null when the tenant has not configured it."},"legitscriptSealUrl":{"type":["string","null"],"description":"Derived from the tenant's own `legitscriptSealId`. Null when no seal id is set."},"legitscriptCheckerUrl":{"type":["string","null"],"description":"Derived from the tenant's own `legitscriptSealId` and `url`. Null when either is missing."},"ogImageUrl":{"type":["string","null"],"description":"Social-sharing image. Null when the tenant has not configured it. Absolute http(s) URL."},"influencerAvatarUrl":{"type":["string","null"],"description":"Avatar image. Null when the tenant has not configured it. Absolute http(s) URL."},"legalFooterCopy":{"type":["string","null"],"description":"Copyright line. The tenant's own value when configured; otherwise derived as \"© <legalName>. All rights reserved.\" from the tenant's own name; null when the tenant has no name."},"heroBottleShadowUrl":{"type":["string","null"],"description":"Reserved. Hero illustration shadow image. Not tenant-configurable, so always null."},"heroBottleUrl":{"type":["string","null"],"description":"Hero image. Null when the tenant has not configured it. Absolute http(s) URL."},"heroBottleRightUrl":{"type":["string","null"],"description":"Right-side hero image. Defaults to `heroBottleUrl` when only that is set; null when neither is set. Absolute http(s) URL."},"colors":{"type":"object","additionalProperties":true,"description":"Brand colors as CSS color strings. The object is always present; each member is null when the tenant has not configured that color. `dark` is the dark-variant color.","properties":{"primary":{"type":["string","null"]},"dark":{"type":["string","null"]},"cream":{"type":["string","null"]},"accent":{"type":["string","null"]},"badgeBg":{"type":["string","null"]},"badgeText":{"type":["string","null"]},"bgGradient1":{"type":["string","null"]},"bgGradient2":{"type":["string","null"]}}}}}}}},"401":{"description":"`invalid_key` -- the API key is missing, unknown, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"403":{"description":"`feature_not_enabled` -- the Landing Page API is not enabled for this tenant. `account_locked` -- the account is locked or otherwise unavailable (for example for billing); contact support. A lock or unlock can take up to about a minute to take effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"`rate_limited` -- 60 requests per minute and 5,000 per day per key. Includes a `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"500":{"description":"`internal_error` -- unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/categories":{"get":{"summary":"List product categories","description":"The tenant's active product categories, in display order, with labels in the requested locale.\n\nRequires `Authorization: Bearer <Medoura API key>`. The key resolves to exactly one tenant -- no request names a tenant.","tags":["Catalog"],"operationId":"getApiV1Categories","security":[{"apiKeyBearer":[]}],"parameters":[{"name":"locale","in":"query","required":false,"description":"Label language. Defaults to `en`.","schema":{"type":"string","enum":["en","es"],"default":"en"}}],"responses":{"200":{"description":"The tenant's categories.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["categories"],"properties":{"categories":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"key":{"type":"string","description":"Stable category key; pass it as `category` to other endpoints."},"label":{"type":"string","description":"Display name in the requested locale."},"labelEs":{"type":["string","null"],"description":"Spanish display name, if configured."},"allowMinors":{"type":"boolean","description":"Whether patients under 18 may enroll."},"minimumAge":{"type":"integer","description":"Minimum patient age in years."},"videoUrl":{"type":["string","null"],"description":"Intro video URL, if configured."}}}}}}}}},"401":{"description":"`invalid_key` -- the API key is missing, unknown, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"403":{"description":"`feature_not_enabled` -- the Landing Page API is not enabled for this tenant. `account_locked` -- the account is locked or otherwise unavailable (for example for billing); contact support. A lock or unlock can take up to about a minute to take effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"422":{"description":"`validation_failed` -- `locale` is not `en` or `es`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"`rate_limited` -- 60 requests per minute and 5,000 per day per key. Includes a `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"500":{"description":"`internal_error` -- unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/content/{pageKey}":{"get":{"summary":"Get published page content","description":"The tenant's published marketing content for a page, in the requested locale. Only the `home` page is available in v1. Draft content is never returned. If the tenant has no published content, `content` is `null`. Responses are cached for 60 seconds.\n\nRequires `Authorization: Bearer <Medoura API key>`. The key resolves to exactly one tenant -- no request names a tenant.","tags":["Content"],"operationId":"getApiV1ContentPageKey","security":[{"apiKeyBearer":[]}],"parameters":[{"name":"pageKey","in":"path","required":true,"description":"Only `home` in v1. Any other value returns 404.","schema":{"type":"string","enum":["home"]}},{"name":"locale","in":"query","required":false,"description":"Content language. Defaults to `en`. Spanish content may be partial; sections not yet translated are omitted.","schema":{"type":"string","enum":["en","es"],"default":"en"}}],"responses":{"200":{"description":"The published page content, or `content: null` when none is published.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["pageKey","locale","content"],"properties":{"pageKey":{"type":"string","enum":["home"]},"locale":{"type":"string","enum":["en","es"]},"content":{"type":["object","null"],"additionalProperties":true,"description":"Page sections keyed by section name, or null when nothing is published.","properties":{"hero":{"type":"object","additionalProperties":true,"description":"Hero section: `badge`, `title`, `subtitle`."},"howItWorks":{"type":"object","additionalProperties":true,"description":"How-it-works section: `badge`, `title`, `description`, and `steps` (`step1` to `step4`, each with `number`, `title`, `description`)."},"faq":{"type":"object","additionalProperties":true,"description":"FAQ section: `badge`, `title`, and `items` (each with `question` and `answer`)."},"testimonials":{"type":"object","additionalProperties":true,"description":"Testimonials section: `badge`, `title`, and `items` (each with `name`, `beforeImageUrl`, `afterImageUrl`, optional `categories`)."}}}}}}}},"401":{"description":"`invalid_key` -- the API key is missing, unknown, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"403":{"description":"`feature_not_enabled` -- the Landing Page API is not enabled for this tenant. `account_locked` -- the account is locked or otherwise unavailable (for example for billing); contact support. A lock or unlock can take up to about a minute to take effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"404":{"description":"`not_found` -- `pageKey` is not `home`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"422":{"description":"`validation_failed` -- `locale` is not `en` or `es`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"`rate_limited` -- 60 requests per minute and 5,000 per day per key. Includes a `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"500":{"description":"`internal_error` -- unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/pricing":{"get":{"summary":"Get pricing","description":"The tenant's full pricing catalog. It mirrors what the tenant's own `/plans` page data (`/api/pricing-data`) contains, including the Stripe price ids on plans and nutrition variants. Promotions are an allowlisted projection: inactive promotions and Stripe promotion or coupon ids are not exposed. `?category` filters only `products`; `promos`, `nutritionProducts`, `nutritionBundles` and `stateCoverage` are NOT category-filtered and are always returned in full.\n\nRequires `Authorization: Bearer <Medoura API key>`. The key resolves to exactly one tenant -- no request names a tenant.","tags":["Catalog"],"operationId":"getApiV1Pricing","security":[{"apiKeyBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"description":"Only return `products` in this category. Must be a `key` from `GET /api/v1/categories`; an unknown key returns 404 `not_found`. Does not filter `promos`, `nutritionProducts`, `nutritionBundles` or `stateCoverage`.","schema":{"type":"string"}}],"responses":{"200":{"description":"The tenant's pricing data.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["products","promos","nutritionProducts","nutritionBundles","stateCoverage"],"properties":{"products":{"type":"array","description":"Plans with checkout options and prices. The only list that `?category` filters.","items":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"categoryKey":{"type":"string","description":"Category key; matches a `key` from `GET /api/v1/categories`."},"typeKey":{"type":"string"},"image":{"type":"string","description":"Image URL; empty string when none."},"badgeKey":{"type":"string","description":"Badge identifier, when the product has a badge."},"badgeAmount":{"type":["string","number"],"description":"Amount shown on the badge, when present."},"parentSlug":{"type":"string","description":"Slug of the parent plan, for add-ons and derived plans."},"summaryLabel":{"type":"string","description":"Short label used in order summaries."},"getStartedLink":{"type":"string"},"exploreLink":{"type":"string"},"slug":{"type":"string"},"displayName":{"type":"string"},"familyKey":{"type":"string","description":"Medication family key."},"medicationKey":{"type":"string"},"planType":{"type":"string","enum":["reference","exact-plan"]},"billingType":{"type":"string","enum":["subscription","one_time"]},"isAddOn":{"type":"boolean"},"requiresAdult":{"type":"boolean"},"featured":{"type":"boolean"},"sortOrder":{"type":"number"},"shortDescription":{"type":"string"},"shortDescriptionEs":{"type":"string"},"planDescription":{"type":"string"},"includes":{"type":"array","items":{"type":"string"}},"defaultPromoCode":{"type":"string"},"availablePharmacies":{"type":"array","items":{"type":"string"}},"checkoutOptions":{"type":"array","description":"Purchasable options; each has `type`, optional `durationMonths`, and `variants` keyed by pharmacy with `price`, `priceLabel` and `stripePriceId`.","items":{"type":"object","additionalProperties":true}},"checkout":{"type":"object","additionalProperties":true,"description":"Checkout options keyed by billing type."},"paymentOptions":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"promos":{"type":"array","description":"The tenant's active promotions (not category-filtered). Inactive promotions are omitted. An allowlisted projection: Stripe promotion and coupon ids are not exposed. Fields that are unset are omitted.","items":{"type":"object","additionalProperties":true,"required":["code","label","scope"],"properties":{"code":{"type":"string","description":"Promo code the customer enters."},"label":{"type":"string"},"description":{"type":"string"},"scope":{"type":"string","enum":["global","product"]},"autoApply":{"type":"boolean","description":"Applied automatically when the order is eligible."},"bannerAnnouncement":{"type":"string"},"bannerLabel":{"type":"string"},"eligibleProductSlugs":{"type":"array","items":{"type":"string"},"description":"When present, only these product slugs qualify."},"requiredAddOnProductSlugs":{"type":"array","items":{"type":"string"}},"eligibleBillingTypes":{"type":"array","items":{"type":"string","enum":["subscription","one_time"]}},"eligiblePaymentDurations":{"type":"array","items":{"type":"integer"},"description":"Payment durations, in months, that qualify."},"eligiblePharmacies":{"type":"array","items":{"type":"string"}},"summaryPricing":{"type":"object","additionalProperties":true,"description":"The discount: `type` is `amount_off` (with `amountOff`, in dollars) or `percent_off` (with `percentOff`); `applyTo` is `plan` or `order`.","properties":{"type":{"type":"string","enum":["amount_off","percent_off"]},"amountOff":{"type":"number"},"percentOff":{"type":"number"},"applyTo":{"type":"string","enum":["plan","order"]}}},"minimumOrderAmount":{"type":"number","description":"Minimum order, in dollars."},"firstOrderOnly":{"type":"boolean"},"lineItemQuantity":{"type":"integer","minimum":1,"description":"Used with `summaryPricing` for BOGO-style promos. Omitted when 1. When greater than 1, multiply the plan subtotal by this quantity and apply the discount to a single unit (the promo frees exactly one unit, for example \"1 month free\"), not to the scaled subtotal. Ignored when the promo has no `summaryPricing`."}}}},"nutritionProducts":{"type":"array","description":"Nutrition shop products (not category-filtered). An allowlisted projection: internal fields such as tenant id, supplier SKU and row ids are not exposed.","items":{"type":"object","additionalProperties":true,"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"image_url":{"type":["string","null"]},"nutrition_label_url":{"type":["string","null"]},"stock_status":{"type":"string","enum":["in_stock","low_stock","out_of_stock"]},"sort_order":{"type":"integer"},"featured":{"type":"boolean"},"variants":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"billing_type":{"type":"string","enum":["one_time","subscription"]},"duration_months":{"type":"integer"},"price_cents":{"type":"integer","description":"Price in cents."},"stripe_price_id":{"type":"string"}}}}}}},"nutritionBundles":{"type":"array","description":"Nutrition shop bundles (not category-filtered). Same fields as `nutritionProducts` plus `components`.","items":{"type":"object","additionalProperties":true,"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"image_url":{"type":["string","null"]},"nutrition_label_url":{"type":["string","null"]},"stock_status":{"type":"string","enum":["in_stock","low_stock","out_of_stock"]},"sort_order":{"type":"integer"},"featured":{"type":"boolean"},"variants":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"billing_type":{"type":"string","enum":["one_time","subscription"]},"duration_months":{"type":"integer"},"price_cents":{"type":"integer","description":"Price in cents."},"stripe_price_id":{"type":"string"}}}},"components":{"type":"array","description":"Products included in the bundle.","items":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"slug":{"type":"string"},"image_url":{"type":["string","null"]}}}}}}},"stateCoverage":{"type":"array","description":"Which pharmacies serve each US state (not category-filtered).","items":{"type":"object","additionalProperties":true,"properties":{"state":{"type":"string"},"label":{"type":"string"},"pharmacies":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"key":{"type":"string"},"label":{"type":"string"},"isPrimary":{"type":"boolean"}}}}}}}}}}}},"401":{"description":"`invalid_key` -- the API key is missing, unknown, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"403":{"description":"`feature_not_enabled` -- the Landing Page API is not enabled for this tenant. `account_locked` -- the account is locked or otherwise unavailable (for example for billing); contact support. A lock or unlock can take up to about a minute to take effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"404":{"description":"`not_found` -- `category` is not one of the tenant's category keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"`rate_limited` -- 60 requests per minute and 5,000 per day per key. Includes a `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"500":{"description":"`internal_error` -- unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/products":{"get":{"summary":"List products","description":"The tenant's published medication products, each with the path of its enrollment flow on the tenant's own Medoura host (`start_url_path`) and its plan templates. Optionally filtered to one category.\n\nRequires `Authorization: Bearer <Medoura API key>`. The key resolves to exactly one tenant -- no request names a tenant.","tags":["Catalog"],"operationId":"getApiV1Products","security":[{"apiKeyBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"description":"Only return products in this category. Must be a `key` from `GET /api/v1/categories`; an unknown key returns 404 `not_found`. Omit to return every product.","schema":{"type":"string"}}],"responses":{"200":{"description":"The tenant's products.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["products"],"properties":{"products":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"key":{"type":"string","description":"Stable product (medication) key."},"label":{"type":"string","description":"Display name."},"medication_family":{"type":["string","null"],"description":"Key of the medication family the product belongs to, if any."},"category":{"type":["string","null"],"description":"Category key; matches a `key` from `GET /api/v1/categories`."},"start_url_path":{"type":"string","description":"Path of the enrollment flow on the tenant's own Medoura host (for example `/start?medication_family=...`, or `/start` when the product has no family). Prefix it with the tenant's host to build a link."},"short_description":{"type":["string","null"],"description":"Short marketing description."},"features":{"type":["array","null"],"items":{"type":"string"},"description":"Feature bullet points."},"requires_adult":{"type":"boolean","description":"Whether the patient must be an adult to enroll."},"templates":{"type":"array","description":"Plan templates available for the product.","items":{"type":"object","additionalProperties":true,"properties":{"key":{"type":"string"},"displayName":{"type":"string"},"planType":{"type":"string"},"imageUrl":{"type":["string","null"],"description":"Image URL, or null when none."},"isAddOn":{"type":"boolean"}}}}}}}}}}}},"401":{"description":"`invalid_key` -- the API key is missing, unknown, or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"403":{"description":"`feature_not_enabled` -- the Landing Page API is not enabled for this tenant. `account_locked` -- the account is locked or otherwise unavailable (for example for billing); contact support. A lock or unlock can take up to about a minute to take effect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"404":{"description":"`not_found` -- `category` is not one of the tenant's category keys.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"`rate_limited` -- 60 requests per minute and 5,000 per day per key. Includes a `Retry-After` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"500":{"description":"`internal_error` -- unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}}}}