diff --git a/.conductor/settings.toml b/.conductor/settings.toml new file mode 100644 index 0000000..4ecb719 --- /dev/null +++ b/.conductor/settings.toml @@ -0,0 +1,11 @@ +"$schema" = "https://conductor.build/schemas/settings.repo.schema.json" + +[scripts] +setup = "yarn install --frozen-lockfile --non-interactive" +run_mode = "concurrent" + +[scripts.run.dev] +command = "yarn start --port $CONDUCTOR_PORT" +available_in = [ "local" ] +default = true +icon = "play" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7336711 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile --non-interactive + + - name: Lint OpenAPI contract + run: yarn api:lint + + - name: Build documentation + run: yarn build diff --git a/.github/workflows/openapi-sync.yml b/.github/workflows/openapi-sync.yml new file mode 100644 index 0000000..947d6d1 --- /dev/null +++ b/.github/workflows/openapi-sync.yml @@ -0,0 +1,81 @@ +name: Sync OpenAPI contract + +on: + workflow_dispatch: + repository_dispatch: + types: + - openapi_updated + schedule: + - cron: "17 6 * * *" + +permissions: + contents: write + pull-requests: write + +concurrency: + group: openapi-contract-sync + cancel-in-progress: true + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile --non-interactive + + - name: Download sandbox contract + run: yarn api:sync + + - name: Detect contract changes + id: changes + shell: bash + run: | + if git diff --quiet -- openapi/public_v1.yaml; then + echo "changed=false" >> "$GITHUB_OUTPUT" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Lint updated contract + if: steps.changes.outputs.changed == 'true' + run: yarn api:lint + + - name: Build updated documentation + if: steps.changes.outputs.changed == 'true' + run: yarn build + + - name: Open or update pull request + if: steps.changes.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + branch="automation/openapi-public-v1" + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git fetch origin "refs/heads/$branch:refs/remotes/origin/$branch" || true + git checkout -B "$branch" + git add openapi/public_v1.yaml + git commit -m "Update OpenAPI contract snapshot" + git push --force-with-lease origin "$branch" + + pr_number=$(gh pr list --head "$branch" --state open --json number --jq '.[0].number') + if [ -z "$pr_number" ]; then + gh pr create \ + --base main \ + --head "$branch" \ + --title "Update OpenAPI contract snapshot" \ + --body "Updates the checked-in public v1 contract from the deployed sandbox API. CI validates the contract and generated documentation before merge." + fi diff --git a/.gitignore b/.gitignore index 81b2534..78888f4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ node_modules/ build/ .docusaurus/ .cache-loader/ + +# Generated from openapi/public_v1.yaml before start/build. +docs/api-reference/ diff --git a/README.md b/README.md index a6c26a0..adcf220 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,27 @@ yarn start Starts a local dev server at `http://localhost:3000` with hot reload. +The start command regenerates the API reference from the checked-in OpenAPI +snapshot before launching Docusaurus. + +## API reference + +The generated API reference uses [`openapi/public_v1.yaml`](openapi/public_v1.yaml), +which is synchronized from the public sandbox contract: + +```sh +yarn api:sync # Download the sandbox contract when it changed semantically +yarn api:lint # Validate the checked-in OpenAPI document +yarn api:generate # Rebuild docs/api-reference locally +``` + +Files under `docs/api-reference` are generated and gitignored. CI regenerates +them before every build. The scheduled OpenAPI sync workflow opens a pull +request when the deployed sandbox contract changes. + +Legacy hand-written API URLs are preserved as `301` redirects in `vercel.json`. +Keep that map updated if a generated operation ID—and therefore its URL—changes. + ## Build ``` diff --git a/docs/api-auth.md b/docs/api-auth.md deleted file mode 100644 index 4383ba1..0000000 --- a/docs/api-auth.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -id: api-auth -title: API Authentication -sidebar_label: Authentication ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Our API is secured by API keys, please make sure you **don’t share these keys** with anyone! They should only be used in a secure server side environment, our API isn't supported for use in the browser, [see our Embed SDK](embed-sdk.md) instead. - -**You can [find your API](https://app.payhere.co/merchants/integrations) key in the integrations section of the merchants admin.** - ---- - -### Authorization Header (recommended) - -We recommend passing your API key in the Authorization header, like so: - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/user -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -raw_json = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/user") - .body.to_s - -json = JSON.parse(raw_json) -``` - - - - - -### access_token parameter - -If you are wanting to test GET endpoints quickly you can pass your API key as a parameter labelled `access_token` - -```sh -GET https://api.payhere.co/api/v1/user?access_token=${api_key_here} -``` diff --git a/docs/api-current-company-show.md b/docs/api-current-company-show.md deleted file mode 100644 index 1948f99..0000000 --- a/docs/api-current-company-show.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -id: api-current-company-show -title: GET /api/v1/current_company -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch the company information for currently authenticated user - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/current_company \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/current_company") - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -N/A - -## Response - -```json -{ - "data": { - "id": 1, - "name": "Alt Labs", - "legal_name": "Alternate Labs Ltd", - "slug": "altlabs", - "ready": true, - "country_code": "GB", - "button_color": "#db0031", - "button_text": "white", - "role": "testing", - "stripe_connected": true, - "gocardless_connected": true, - "currency": "gbp", - "vat_registered": true, - "vat_rate": "20.0", - "created_at": "2018-06-07T21:54:53.617Z", - "updated_at": "2020-04-05T18:39:28.637Z", - "type": "companies", - "plan": "pro", - "subscription_status": "trial", - "active_until": "2020-04-08T18:28:12.798Z", - "testing_access": true, - "support_email": "hello@example.org", - "website": "https://alternatelabs.co", - "address": "123 Anystreet,\r\nAnytime, BT1 1AB", - "vat_registration_number": "XYZ", - "vat_mechanism": "always", - "custom_domain": null, - "users": [ - { - "id": 1, - "display_name": "Pete Test", - "email": "pete@example.org", - "role": "user", - "created_at": "2018-06-07T21:54:53.778Z", - "updated_at": "2020-04-06T10:37:28.065Z", - "type": "users" - } - ] - } -} -``` - -## Errors - -- **401** Unauthorized diff --git a/docs/api-current-company-stats.md b/docs/api-current-company-stats.md deleted file mode 100644 index 6d399a3..0000000 --- a/docs/api-current-company-stats.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -id: api-current-company-stats -title: GET /api/v1/current_company/stats -sidebar_label: GET /stats ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch payment stats for last 30 days. Comparison fields are 30-60days to give a comparison value from last month. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/current_company/stats \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/current_company/stats") - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -N/A - -## Response - -```json -{ - "currency": "gbp", - "payments_last_30": 329.40, - "payments_comparison": 278.42, - "subscribers_last_30": 7, - "subscribers_comparison": 5, - "payments_all_time": 6239.76 -} -``` - -## Errors - -- **401** Unauthorized diff --git a/docs/api-current-company-update.md b/docs/api-current-company-update.md deleted file mode 100644 index ac5d412..0000000 --- a/docs/api-current-company-update.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -id: api-current-company-update -title: PUT /api/v1/current_company -sidebar_label: PUT / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Update the company information for currently authenticated user - -## Request - - - - -```sh -$ curl -X PUT https://api.payhere.co/api/v1/current_company \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" - -d '{"name": "New company name"}' -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .put("https://api.payhere.co/api/v1/current_company", json: { name: "New company name" }) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **name** - Display name of the company -- **legal_name** - Legal name of the company, displayed on receipts -- **address** - Company address, displayed on receipts -- **logo** - Logo image for the company -- **support_email** - Support email, displayed within receipts -- **website** - Company website, displayed within receipts -- **button_color** - Hex color for the pay button background on payment forms and email receipts (e.g. #ff6600) -- **button_text** - Empty (auto detect), "white" or "black" to force to white or black text. - -## Response - -```json -{ - "data": { - "id": 1, - "name": "New company name", - "legal_name": "Alternate Labs Ltd", - "slug": "altlabs", - "ready": true, - "country_code": "GB", - "button_color": "#db0031", - "button_text": "white", - "role": "testing", - "stripe_connected": true, - "gocardless_connected": true, - "currency": "gbp", - "vat_registered": true, - "vat_rate": "20.0", - "created_at": "2018-06-07T21:54:53.617Z", - "updated_at": "2020-04-05T18:39:28.637Z", - "type": "companies", - "plan": "pro", - "subscription_status": "trial", - "active_until": "2020-04-08T18:28:12.798Z", - "testing_access": true, - "support_email": "hello@example.org", - "website": "https://alternatelabs.co", - "address": "123 Anystreet,\r\nAnytime, BT1 1AB", - "vat_registration_number": "XYZ", - "vat_mechanism": "always", - "custom_domain": null, - "users": [ - { - "id": 1, - "display_name": "Pete Test", - "email": "pete@example.org", - "role": "user", - "created_at": "2018-06-07T21:54:53.778Z", - "updated_at": "2020-04-06T10:37:28.065Z", - "type": "users" - } - ] - } -} -``` - -## Errors - -- **401** Unauthorized -- **400** Bad request - validation erros returned diff --git a/docs/api-customer-show.md b/docs/api-customer-show.md deleted file mode 100644 index 0e7e8e6..0000000 --- a/docs/api-customer-show.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -id: api-customer-show -title: GET /api/v1/customers/:id -sidebar_label: GET /:id ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch a customer by ID, this will also pull down their subscriptions and payment history. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/customers/:id \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/customers/:id") - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **id** - Customer ID to lookup - -## Response - -```json -{ - "data": { - "id": 989899294, - "name": "Geoff Williams", - "email": "g.williams01@example.org", - "ip_address": null, - "location": {}, - "created_at": "2019-03-04T16:29:57.026Z", - "updated_at": "2019-03-04T16:29:57.026Z", - "type": "customers", - "subscriptions": [ - { - "id": 173524457, - "customer_id": 989899294, - "company_id": 636211471, - "last_charged": "2018-01-03T00:00:00.000Z", - "next_charge_at": "2018-02-03T00:00:00.000Z", - "stripe_subscription_id": "b3ed033a", - "stripe_plan_id": "void_pro_sub_1", - "billing_interval": "month", - "created_at": "2018-01-03T00:00:00.000Z", - "updated_at": "2018-01-03T00:00:00.000Z", - "status": "active", - "membership_plan_id": 372786875, - "provider": "stripe", - "metadata": {}, - "billing_interval_count": 1, - "min_billing_cycles": null - } - ], - "payments": [ - { - "id": 845088515, - "hashid": "VRSgg9kvB", - "reference": "GW8264", - "amount": 12.99, - "company_id": 636211471, - "card_brand": "visa", - "card_last4": null, - "secure_token": "RksE-jbWnU7oSQjWZ-CFIQ", - "status": "part_refund", - "created_at": "2017-06-03T00:00:00.000Z", - "updated_at": "2017-06-03T00:00:00.000Z", - "type": "payments" - }, - { - "id": 2680839, - "hashid": "7ESVZLr", - "reference": "SUB816", - "amount": 24.99, - "company_id": 636211471, - "card_brand": "visa", - "card_last4": null, - "secure_token": "9d0rEeM7T3xI8PZf6VjnNg", - "status": "success", - "created_at": "2018-01-03T00:00:00.000Z", - "updated_at": "2018-01-03T00:00:00.000Z", - "type": "payments" - } - ] - } -} -``` - -## Errors - -- **404** Not found -- **401** Unauthorized diff --git a/docs/api-customers.md b/docs/api-customers.md deleted file mode 100644 index 70c1cbf..0000000 --- a/docs/api-customers.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -id: api-customers -title: GET /api/v1/customers -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -List all of your customers, ordered chronologically, most recent first. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/customers?page=1&per_page=50 \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get( - "https://api.payhere.co/api/v1/customers", - page: 1, - per_page: 50 - ) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **page** - Page number -- **per_page** - Records per page, default 20, max 100. - -## Response - -```json -{ - "data": [ - { - "id": 989899294, - "name": "Geoff Williams", - "email": "g.williams01@example.org", - "ip_address": null, - "location": {}, - "created_at": "2019-03-04T16:28:32.656Z", - "updated_at": "2019-03-04T16:28:32.656Z", - "type": "customers" - } - ], - "meta": { - "current_page": 1, - "next_page": null, - "prev_page": null, - "total_pages": 1, - "total_count": 1 - } -} -``` - -## Errors - -- **400** Bad request -- **401** Unauthorized - - - diff --git a/docs/api-payment-show.md b/docs/api-payment-show.md deleted file mode 100644 index cf986e6..0000000 --- a/docs/api-payment-show.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -id: api-payment-show -title: GET /api/v1/payments/:id -sidebar_label: GET /:id ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch a payment by ID - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/payments/:id \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/payments/:id") - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **id** - Payment ID to lookup - -## Response - -```json -{ - "data": { - "id": 13, - "hashid": "oPPSd", - "reference": null, - "formatted_amount": "£12.99", - "amount": 12.99, - "currency": "gbp", - "refund_amount": 0, - "amount_paid": 12.99, - "company_id": 1, - "card_brand": "Visa", - "card_last4": "4242", - "secure_token": "8UCnIBSy8hsPO9mr2mI9IA", - "status": "success", - "success": true, - "object_name": "Office space", - "created_at": "2019-02-23T16:51:38.189Z", - "updated_at": "2019-02-23T16:51:45.323Z", - "type": "payments", - "customer": { - "id": 10, - "name": "Colours", - "email": "colours@colours.com", - "ip_address": "127.0.0.1", - "location": {}, - "created_at": "2019-02-23T16:51:38.135Z", - "updated_at": "2019-02-23T16:51:39.336Z", - "type": "customers" - }, - "subscription": { - "id": 4, - "customer_id": 10, - "last_charged": null, - "next_charge_at": null, - "status": "active", - "stripe_subscription_id": "sub_EaEBPP4DcwFD3X", - "stripe_plan_id": "office-space-membership-2", - "billing_interval": "month", - "membership_plan_id": 2, - "provider": "stripe", - "metadata": { - "card_brand": "Visa", - "card_last4": "4242" - }, - "billing_interval_count": 1, - "min_billing_cycles": null, - "created_at": "2019-02-23T16:51:45.301Z", - "updated_at": "2019-02-23T16:51:45.301Z", - "type": "subscriptions" - }, - "item": { - "id": 2, - "name": "Office space", - "description": "Shared office space at Alt Labs HQ", - "price": 100, - "price_in_cents": 10000, - "currency": "gbp", - "slug": "office-space", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": true, - "min_billing_cycles": null, - "limited_qty": false, - "qty": 0, - "created_at": "2018-09-25T16:11:00.990Z", - "updated_at": "2018-09-25T16:11:03.392Z", - "type": "membership_plans" - } - } -} -``` - -## Errors - -- **404** Not found -- **401** Unauthorized - - - diff --git a/docs/api-payments.md b/docs/api-payments.md deleted file mode 100644 index 9026d38..0000000 --- a/docs/api-payments.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -id: api-payments -title: GET /api/v1/payments -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -List all of your payments, ordered chronologically, most recent first. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/payments?page=1&per_page=50 \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get( - "https://api.payhere.co/api/v1/payments", - page: 1, - per_page: 50 - ) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **page** - Page number -- **per_page** - Records per page, default 20, max 100. - -## Response - -```json -{ - "data": [ - { - "id": 845088515, - "hashid": "VRSgg9kvB", - "reference": "GW8264", - "formatted_amount": "£12.99", - "amount": 12.99, - "currency": "gbp", - "refund_amount": 2.99, - "amount_paid": 10.00, - "company_id": 636211471, - "card_brand": "visa", - "card_last4": null, - "secure_token": "Vt-ixl7oXL2OgVQagjUkdg", - "status": "part_refund", - "success": true, - "created_at": "2017-06-03T00:00:00.000Z", - "updated_at": "2017-06-03T00:00:00.000Z", - "type": "payments" - } - ], - "meta": { - "current_page": 1, - "next_page": 2, - "prev_page": null, - "total_pages": 2, - "total_count": 2 - } -} -``` - -## Errors - -- **400** Bad request -- **401** Unauthorized diff --git a/docs/api-plans-create.md b/docs/api-plans-create.md deleted file mode 100644 index 4cdfe50..0000000 --- a/docs/api-plans-create.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -id: api-plans-create -title: POST /api/v1/plans -sidebar_label: POST / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Create a new plan. - -## Request - - - - -```sh -$ curl -X POST https://api.payhere.co/api/v1/plans \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" - -d '{"name": "New name"}' -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .post("https://api.payhere.co/api/v1/plans", json: { name: "New name" }) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **payment_type** - One of "recurring" or "one_off" -- **user_selects_amount** - Set to true for donations -- **name** - Display name of the plan -- **description** - Description of the product/service, displayed to end customer -- **price** - Set the price of the plan, leave empty for donations. -- **currency** - 3 letter currency code for the plan i.e. "usd", "gbp", "eur" -- **receipt_text** - Custom message to be added to the email receipt -- **hidden** - Hide this plan from your payments landing page -- **success_url** - URL to redirect customer to after successful payment -- **webhook_url** - URL for Payhere to send webhooks to about the status of payments on this plan -- **pay_button_text** - Defaults to "Pay", you could change it to "Subscribe", "Donate" or anything really. - -#### Params only applicable to one-off plans: - -- **show_qty** - Show a quantity field on payment form, allowing customers to purchase more than one. - -##### Digital downloads - -- **digital_download** - Set to `true` to enable digital downloads for this payment link (file or external URL). -- **download_type** - Either `"upload"` (attach a file with the request) or `"url"` (use an external download URL). -- **download_file** - The file to deliver when `download_type` is `"upload"`. Must be sent as `multipart/form-data` (ActiveStorage); not available in a JSON-only body. -- **download_url** - HTTPS URL to the file when `download_type` is `"url"`. - -#### Params only applicable to recurring plans: - -- **billing_interval** - One of "week", "month" or "year" -- **setup_fee** - Add a one-off setup fee to the first payment -- **min_billing_cycles** - Customer cannot cancel this plan through Payhere until N payments have been made. -- **billing_day** - Day of the month to charge customer -- **cancel_after** - Cancel plan automatically after N payments. - -### Digital downloads - -For one-off plans you can create a payment link that delivers a digital product either by uploading a file or by pointing to an external URL. - -**File upload** — use `multipart/form-data` and field `download_file`: - -```sh -curl -X POST https://api.payhere.co/api/v1/plans \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" \ - -F "payment_type=one_off" \ - -F "name=My Ebook" \ - -F "price=15" \ - -F "currency=gbp" \ - -F "digital_download=true" \ - -F "download_type=upload" \ - -F "download_file=@/path/to/your-file.pdf" -``` - -**External URL** — send JSON (or form fields) including `download_url`: - -```json -{ - "payment_type": "one_off", - "name": "External Download", - "price": 10, - "currency": "gbp", - "digital_download": true, - "download_type": "url", - "download_url": "https://example.com/file.zip" -} -``` - -## Response - -```json -{ - "data": { - "id": 64, - "payment_type": "recurring", - "name": "New name", - "description": "", - "price": 0, - "price_in_cents": 0, - "currency": "eur", - "slug": "new-name", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": false, - "min_billing_cycles": null, - "billing_day": null, - "limited_qty": false, - "qty": 0, - "cancel_after": null, - "success_url": "", - "trial_period_days": null, - "show_qty": false, - "custom_fields": [], - "user_selects_amount": true, - "pay_button_text": "", - "setup_fee": 0, - "has_setup_fee": false, - "created_at": "2020-03-29T09:31:47.428Z", - "updated_at": "2020-04-01T22:06:04.296Z", - "type": "plans", - "receipt_text": "", - "webhook_url": "" - } -} -``` - -## Errors - -- **401** Unauthorized -- **400** Bad request - validation erros returned diff --git a/docs/api-plans-update.md b/docs/api-plans-update.md deleted file mode 100644 index e3e2ebb..0000000 --- a/docs/api-plans-update.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -id: api-plans-update -title: PUT /api/v1/plans/:id -sidebar_label: PUT /:id ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Update a plan. - -## Request - - - - -```sh -$ curl -X PUT https://api.payhere.co/api/v1/plans/:id \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" - -d '{"name": "New name"}' -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .put("https://api.payhere.co/api/v1/plans/:id", json: { name: "New name" }) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **name** - Display name of the plan -- **description** - Description of the product/service, displayed to end customer -- **receipt_text** - Custom message to be added to the email receipt -- **hidden** - Hide this plan from your payments landing page -- **success_url** - URL to redirect customer to after successful payment -- **webhook_url** - URL for Payhere to send webhooks to about the status of payments on this plan -- **pay_button_text** - Defaults to "Pay", you could change it to "Subscribe", "Donate" or anything really. - -#### Params only applicable to one-off plans: - -- **price** - Set the price of the plan -- **currency** - 3 letter currency code for the plan i.e. "usd", "gbp", "eur" -- **show_qty** - Show a quantity field on payment form, allowing customers to purchase more than one. - -#### Params only applicable to subscription plans: - -- **setup_fee** - Add a one-off setup fee to the first payment -- **min_billing_cycles** - Customer cannot cancel this plan through Payhere until N payments have been made. -- **billing_day** - Day of the month to charge customer -- **cancel_after** - Cancel plan automatically after N payments. - - -## Response - -```json -{ - "data": { - "id": 64, - "payment_type": "recurring", - "name": "New name", - "description": "", - "price": 0, - "price_in_cents": 0, - "currency": "eur", - "slug": "new-name", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": false, - "min_billing_cycles": null, - "billing_day": null, - "limited_qty": false, - "qty": 0, - "cancel_after": null, - "success_url": "", - "trial_period_days": null, - "show_qty": false, - "custom_fields": [], - "user_selects_amount": true, - "pay_button_text": "", - "setup_fee": 0, - "has_setup_fee": false, - "created_at": "2020-03-29T09:31:47.428Z", - "updated_at": "2020-04-01T22:06:04.296Z", - "type": "plans", - "receipt_text": "", - "webhook_url": "" - } -} -``` - -## Errors - -- **401** Unauthorized -- **400** Bad request - validation erros returned diff --git a/docs/api-plans.md b/docs/api-plans.md deleted file mode 100644 index 40a1b5b..0000000 --- a/docs/api-plans.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -id: api-plans -title: GET /api/v1/plans -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -List all of your plans. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/plans?page=1&per_page=50 \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get( - "https://api.payhere.co/api/v1/plans", - page: 1, - per_page: 50 - ) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **page** - Page number -- **per_page** - Records per page, default 20, max 100. - -## Response - -```json -{ - "data": [ - { - "id": 64, - "payment_type": "recurring", - "name": "Help us fight COVID-19", - "description": "", - "price": 0, - "price_in_cents": 0, - "currency": "eur", - "slug": "help-us-fight-covid-19", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": false, - "min_billing_cycles": null, - "billing_day": null, - "limited_qty": false, - "qty": 0, - "cancel_after": null, - "success_url": "", - "trial_period_days": null, - "show_qty": false, - "custom_fields": [], - "user_selects_amount": true, - "pay_button_text": "", - "setup_fee": 0, - "has_setup_fee": false, - "created_at": "2020-03-29T09:31:47.428Z", - "updated_at": "2020-04-01T22:06:04.296Z", - "type": "plans", - "receipt_text": "", - "webhook_url": "" - } - ], - "meta": { - "current_page": 1, - "next_page": 2, - "prev_page": null, - "total_pages": 2, - "total_count": 2 - } -} -``` - -## Errors - -- **400** Bad request -- **401** Unauthorized diff --git a/docs/api-refunds.md b/docs/api-refunds.md deleted file mode 100644 index 837e0bd..0000000 --- a/docs/api-refunds.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: api-refunds -title: POST /api/v1/refunds -sidebar_label: POST / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -This will refund a customer the amount specified, can be a partial refund. - -## Request - - - - -```sh -$ curl -X POST https://api.payhere.co/api/v1/refunds \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer ${api_key_here}" \ - -d '{"payment_id": 373, "amount": 0.5, "reason": "requested_by_customer"}' -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .post( - "https://api.payhere.co/api/v1/refunds", - payment_id: 373, - amount: 0.5, - reason: "requested_by_customer" - ) - -success = resp.status == 204 -``` - - - - -### Params - -- **payment_id** - ID of the payment to refund -- **amount** - amount to refund the customer, uses the currency of their payment, if USD, amount should be in dollars and can use decimal point i.e. 1.5 is $1.50 USD -- **reason** - Reason for the refund, one of: `requested_by_customer`, `duplicate` or `fraudulent` - -## Response - -```json -204 No content -``` - -## Errors - -- **400** Bad request - if validation fails -- **401** Unauthorized diff --git a/docs/api-subscription-destroy.md b/docs/api-subscription-destroy.md deleted file mode 100644 index f364315..0000000 --- a/docs/api-subscription-destroy.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: api-subscription-destroy -title: DELETE /api/v1/subscriptions/:id -sidebar_label: DELETE /:id ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Cancel a subscription immediately so there are no further payments, subscription will remain active until period end. - -## Request - - - - -```sh -$ curl -X DELETE https://api.payhere.co/api/v1/subscriptions/:id \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .delete("https://api.payhere.co/api/v1/subscriptions/:id") - -success = resp.status == 204 -``` - - - - -### Params - -- **id** - Subscription to cancel - -## Response - -```json -204 No content -``` - -## Errors - -- **404** Not found -- **401** Unauthorized diff --git a/docs/api-subscription-show.md b/docs/api-subscription-show.md deleted file mode 100644 index 37863d3..0000000 --- a/docs/api-subscription-show.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -id: api-subscription-show -title: GET /api/v1/subscriptions/:id -sidebar_label: GET /:id ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch a subscription by ID, this will also pull down the customer and payments. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/subscriptions/:id \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/subscriptions/:id") - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **id** - Subscription ID to lookup - -## Response - -```json -{ - "data": { - "id": 173524457, - "customer_id": 989899294, - "last_charged": "2018-01-03T00:00:00.000Z", - "next_charge_at": "2018-02-03T00:00:00.000Z", - "status": "active", - "stripe_subscription_id": "d44ea881", - "stripe_plan_id": "void_pro_sub_1", - "billing_interval": "month", - "membership_plan_id": 372786875, - "provider": "stripe", - "metadata": {}, - "billing_interval_count": 1, - "min_billing_cycles": null, - "created_at": "2018-01-03T00:00:00.000Z", - "updated_at": "2018-01-03T00:00:00.000Z", - "type": "subscriptions", - "customer": { - "id": 989899294, - "name": "Geoff Williams", - "email": "g.williams01@example.org", - "ip_address": null, - "location": {}, - "created_at": "2019-03-04T17:08:19.453Z", - "updated_at": "2019-03-04T17:08:19.453Z", - "type": "customers" - }, - "plan": { - "id": 20, - "payment_type": "recurring", - "name": "Pro Plan", - "description": "", - "price": 15, - "price_in_cents": 1500, - "currency": "gbp", - "slug": "pro-plan", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": false, - "min_billing_cycles": null, - "billing_day": null, - "limited_qty": false, - "qty": 0, - "cancel_after": null, - "success_url": "", - "trial_period_days": null, - "created_at": "2019-04-19T09:02:45.846Z", - "updated_at": "2019-04-27T12:05:38.223Z", - "type": "plans" - }, - "payments": [ - { - "id": 2680839, - "hashid": "7ESVZLr", - "reference": "SUB816", - "amount": 24.99, - "company_id": 636211471, - "card_brand": "visa", - "card_last4": null, - "secure_token": "-zLiIKE-7MEqgeWJgDJpww", - "status": "success", - "created_at": "2018-01-03T00:00:00.000Z", - "updated_at": "2018-01-03T00:00:00.000Z", - "type": "payments" - } - ] - } -} -``` - -## Errors - -- **404** Not found -- **401** Unauthorized diff --git a/docs/api-subscriptions.md b/docs/api-subscriptions.md deleted file mode 100644 index 2ce94ed..0000000 --- a/docs/api-subscriptions.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -id: api-subscriptions -title: GET /api/v1/subscriptions -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -List all of your subscriptions, ordered chronologically, most recent payment first. - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/subscriptions?page=1&per_page=50 \ - -H "Accept: application/json" \ - -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -resp = HTTP.auth("Bearer #{api_key_here}") - .get( - "https://api.payhere.co/api/v1/subscriptions", - page: 1, - per_page: 50 - ) - -parsed = JSON.parse(resp.body) -``` - - - - -### Params - -- **page** - Page number -- **per_page** - Records per page, default 20, max 100. - -## Response - -```json -{ - "data": [ - { - "id": 173524457, - "customer_id": 989899294, - "last_charged": "2018-01-03T00:00:00.000Z", - "next_charge_at": "2018-02-03T00:00:00.000Z", - "status": "active", - "stripe_subscription_id": "2e72dabd", - "stripe_plan_id": "void_pro_sub_1", - "billing_interval": "month", - "membership_plan_id": 372786875, - "provider": "stripe", - "metadata": {}, - "billing_interval_count": 1, - "min_billing_cycles": null, - "created_at": "2018-01-03T00:00:00.000Z", - "updated_at": "2018-01-03T00:00:00.000Z", - "type": "subscriptions", - "customer": { - "id": 989899294, - "name": "Geoff Williams", - "email": "g.williams01@example.org", - "ip_address": null, - "location": {}, - "created_at": "2019-03-04T17:06:36.240Z", - "updated_at": "2019-03-04T17:06:36.240Z", - "type": "customers" - }, - "plan": { - "id": 20, - "payment_type": "recurring", - "name": "Pro Plan", - "description": "", - "price": 15, - "price_in_cents": 1500, - "currency": "gbp", - "slug": "pro-plan", - "billing_interval": "month", - "billing_interval_count": 1, - "hidden": false, - "min_billing_cycles": null, - "billing_day": null, - "limited_qty": false, - "qty": 0, - "cancel_after": null, - "success_url": "", - "trial_period_days": null, - "created_at": "2019-04-19T09:02:45.846Z", - "updated_at": "2019-04-27T12:05:38.223Z", - "type": "plans" - } - } - ], - "meta": { - "current_page": 1, - "next_page": null, - "prev_page": null, - "total_pages": 1, - "total_count": 1 - } -} -``` - -## Errors - -- **400** Bad request -- **401** Unauthorized - - - diff --git a/docs/api-user.md b/docs/api-user.md deleted file mode 100644 index fcddf5c..0000000 --- a/docs/api-user.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: api-user -title: GET /api/v1/user -sidebar_label: GET / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; - -Fetch info on the currently authenticated user - -## Request - - - - -```sh -$ curl -X GET https://api.payhere.co/api/v1/user -H "Authorization: Bearer ${api_key_here}" -``` - - - - -```ruby -require "http" -require "json" - -raw_json = HTTP.auth("Bearer #{api_key_here}") - .get("https://api.payhere.co/api/v1/user") - .body.to_s - -json = JSON.parse(raw_json) -``` - - - - -## Response - -```json -{ - "data": { - "id": 2, - "display_name": "John Smith", - "email": "john.smith@example.org", - "created_at": "2015-11-08T14:12:27.962Z", - "updated_at": "2019-03-04T13:57:32.114Z", - "type": "users" - } -} -``` - -## Errors - -- **401** Unauthorized diff --git a/docs/intro.md b/docs/intro.md index 5bd9515..727bfe7 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -63,4 +63,4 @@ Webhooks provide a secure way for us to communicate payment and customer informa Use our API to build advanced integrations. -[Read more](api-auth.md) +[Read more](api-reference/payhere-rest-api) diff --git a/docs/resthooks.md b/docs/resthooks.md index 295b5ac..d52a271 100644 --- a/docs/resthooks.md +++ b/docs/resthooks.md @@ -14,7 +14,7 @@ If you are building a platform integration [please reach out to us](mailto:suppo ## Subscribing to a REST hook -In order to start receiving REST hooks, you first need to subscribe to a resource or event for a given Company. Follow our [API authentication guide](/docs/api-auth) to provide an API token. +In order to start receiving REST hooks, you first need to subscribe to a resource or event for a given Company. Follow our [API authentication guide](/docs/api-reference/payhere-rest-api#authentication) to provide an API token. diff --git a/docusaurus.config.js b/docusaurus.config.js index 2b1c73e..78cc1ed 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -41,6 +41,7 @@ const config = { docs: { routeBasePath: "docs", sidebarPath: "./sidebars.js", + docItemComponent: "@theme/ApiItem", }, blog: { showReadingTime: true, @@ -52,10 +53,59 @@ const config = { ], ], + plugins: [ + "docusaurus-plugin-sass", + [ + "docusaurus-plugin-openapi-docs", + { + id: "openapi", + docsPluginId: "classic", + config: { + publicV1: { + specPath: "openapi/public_v1.yaml", + outputDir: "docs/api-reference", + downloadUrl: + "https://sandbox.payhere.co/openapi/public_v1.yaml", + hideSendButton: true, + showSchemas: false, + sidebarOptions: { + groupPathsBy: "tag", + categoryLinkSource: "tag", + }, + }, + }, + }, + ], + ], + + themes: ["docusaurus-theme-openapi-docs"], + themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ image: "img/open-graph.png", + languageTabs: [ + { + highlight: "bash", + language: "curl", + logoClass: "curl", + }, + { + highlight: "ruby", + language: "ruby", + logoClass: "ruby", + }, + { + highlight: "javascript", + language: "nodejs", + logoClass: "nodejs", + }, + { + highlight: "python", + language: "python", + logoClass: "python", + }, + ], navbar: { title: "Developers", logo: { @@ -82,7 +132,10 @@ const config = { items: [ { label: "Getting Started", to: "/docs/intro" }, { label: "Embed SDK", to: "/docs/embed-sdk" }, - { label: "API Reference", to: "/docs/api-auth" }, + { + label: "API Reference", + to: "/docs/api-reference/payhere-rest-api", + }, ], }, { @@ -109,6 +162,7 @@ const config = { // of the site's light/dark toggle, so both prism themes match. theme: prismThemes.oneDark, darkTheme: prismThemes.oneDark, + additionalLanguages: ["ruby", "python"], }, }), }; diff --git a/openapi/public_v1.yaml b/openapi/public_v1.yaml new file mode 100644 index 0000000..f76b475 --- /dev/null +++ b/openapi/public_v1.yaml @@ -0,0 +1,8529 @@ +--- +openapi: 3.1.0 +info: + title: PayHere REST API + version: v1 + description: Use the PayHere REST API to manage payment links and inspect companies, + customers, payments, subscriptions, and refunds. All documented operations require + a PayHere API key. + contact: + name: PayHere Support + email: support@payhere.co +paths: + "/api/v1/current_company": + get: + summary: Retrieve the current company + tags: + - Company + operationId: getCurrentCompany + description: Returns the company selected by the authenticated user, including + account, tax, domain, and team details. Platform-only merchant-portal fields + are not returned to API-key requests. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: current company + content: + application/json: + schema: + "$ref": "#/components/schemas/CompanyResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + put: + summary: Update the current company + tags: + - Company + operationId: updateCurrentCompany + description: Updates supplied company settings and returns the detailed company. + Omitted fields remain unchanged; submit multipart form data when uploading + a logo. + security: + - BearerAuth: [] + - AccessToken: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/CompanyUpdateRequest" + examples: + company_details: + summary: Update company details + value: + legal_name: Example Studio Ltd + support_email: support@example.com + multipart/form-data: + schema: + "$ref": "#/components/schemas/CompanyUpdateMultipartRequest" + examples: + logo: + summary: Upload a company logo + value: + name: Example Studio + logo: "" + responses: + '200': + description: company updated + content: + application/json: + schema: + "$ref": "#/components/schemas/CompanyResponse" + '400': + description: validation failed + content: + application/json: + schema: + "$ref": "#/components/schemas/BadRequestError" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/current_company/stats": + get: + summary: Retrieve company statistics + tags: + - Company + operationId: getCurrentCompanyStats + description: Returns successful payment volume and new active-subscriber counts + for the last 30 days, the preceding 30 days, and all time. Monetary totals + are converted to the company's configured currency. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: company statistics + content: + application/json: + schema: + "$ref": "#/components/schemas/StatsResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/customers": + get: + summary: List customers + tags: + - Customers + operationId: listCustomers + description: Returns customers attached to the authenticated company, ordered + newest first. Use detailed=true to embed company-specific details, payments, + and subscriptions in each item. + parameters: + - name: page + in: query + required: false + description: Page number to return. Blank values use the first page. + example: 1 + schema: + type: integer + minimum: 1 + default: 1 + - name: per_page + in: query + required: false + description: Number of records per page. Invalid or blank values use 20; values + above 100 are capped at 100. + example: 20 + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + - name: query + in: query + required: false + description: Full-text search across customer ID, name, company name, and + email. Blank values do not filter the collection. + example: jamie@example.com + schema: + type: string + - name: detailed + in: query + required: false + description: When true, embeds payments, subscriptions, and company-specific + customer details. Blank values behave as false. + example: true + schema: + type: boolean + default: false + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: customers + content: + application/json: + schema: + "$ref": "#/components/schemas/CustomerListResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/customers/{id}": + parameters: + - name: id + in: path + required: true + description: Numeric customer ID belonging to the authenticated company. + example: 24 + schema: + type: integer + minimum: 1 + get: + summary: Retrieve a customer + tags: + - Customers + operationId: getCustomer + description: Returns a company-scoped customer with their company-specific details, + payments, and subscriptions embedded. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: customer + content: + application/json: + schema: + "$ref": "#/components/schemas/CustomerResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: customer not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + "/api/v1/payments": + get: + summary: List payments + tags: + - Payments + operationId: listPayments + description: Returns non-temporary payments for the authenticated company with + customer, purchased-item, and subscription details. Results are ordered newest + first after any requested sort and may be filtered by status or exact coupon + code. + parameters: + - name: page + in: query + required: false + description: Page number to return. Blank values use the first page. + example: 1 + schema: + type: integer + minimum: 1 + default: 1 + - name: per_page + in: query + required: false + description: Number of records per page. Invalid or blank values use 20; values + above 100 are capped at 100. + example: 20 + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + - name: status + in: query + required: false + description: One or more comma-separated payment statuses. Blank values do + not filter the collection. + example: success,part_refund + schema: + type: string + pattern: "^(?:pending|success|part_refund|full_refund|future|failed)(?:,(?:pending|success|part_refund|full_refund|future|failed))*$" + - name: coupon_code + in: query + required: false + description: Exact coupon code to match. Blank values do not filter the collection. + example: WELCOME20 + schema: + type: string + - name: sort_by + in: query + required: false + description: Payment field used as the primary sort. The API currently has + no enforced field allowlist; amount_in_cents is a supported example. Blank + values retain newest-first ordering. + example: amount_in_cents + schema: + type: string + - name: sort_order + in: query + required: false + description: Sort direction when sort_by is present. Blank values use ascending + order for that field. + example: descend + schema: + type: string + enum: + - ascend + - descend + default: ascend + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: payments + content: + application/json: + schema: + "$ref": "#/components/schemas/PaymentListResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/payments/{id}": + parameters: + - name: id + in: path + required: true + description: Numeric payment ID or public hashid belonging to the authenticated + company. + example: pay_7Yx2K9 + schema: + oneOf: + - type: integer + minimum: 1 + - type: string + minLength: 1 + get: + summary: Retrieve a payment + tags: + - Payments + operationId: getPayment + description: Returns a company-scoped payment with its customer, purchased item, + and subscription when present. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: payment + content: + application/json: + schema: + "$ref": "#/components/schemas/PaymentResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: payment not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + "/api/v1/plans": + get: + summary: List payment links + tags: + - Payment links + operationId: listPlans + description: Returns reusable, non-deleted payment links for the authenticated + company, ordered newest first. Each item embeds merchant-only settings and + its owning company. + parameters: + - name: page + in: query + required: false + description: Page number to return. Blank values use the first page. + example: 1 + schema: + type: integer + minimum: 1 + default: 1 + - name: per_page + in: query + required: false + description: Number of records per page. Invalid or blank values use 20; values + above 100 are capped at 100. + example: 20 + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: payment links + content: + application/json: + schema: + "$ref": "#/components/schemas/PlanListResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + post: + summary: Create a payment link + tags: + - Payment links + operationId: createPlan + description: Creates a reusable payment link. Payment type and currency default + to recurring and gbp when omitted. A fixed price is required unless the customer + selects the amount; recurring-only, donation, stock, and download fields apply + conditionally. + security: + - BearerAuth: [] + - AccessToken: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/PlanCreateRequest" + examples: + recurring: + summary: Recurring payment link + value: + payment_type: recurring + name: Consulting membership + price: 30 + currency: gbp + billing_interval: month + donation: + summary: Combined one-off and recurring donation + value: + payment_type: one_off + name: Community appeal + currency: gbp + user_selects_amount: true + donation_mode: both + multipart/form-data: + schema: + "$ref": "#/components/schemas/PlanCreateMultipartRequest" + examples: + digital_download: + summary: Uploaded digital download + value: + payment_type: one_off + name: Example ebook + price: 15 + currency: gbp + digital_download: true + download_type: upload + download_file: "" + responses: + '201': + description: payment link created + content: + application/json: + schema: + "$ref": "#/components/schemas/PlanResponse" + '400': + description: validation failed + content: + application/json: + schema: + "$ref": "#/components/schemas/BadRequestError" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/plans/{id}": + parameters: + - name: id + in: path + required: true + description: Payment-link slug belonging to the authenticated company. + example: consulting-membership + schema: + type: string + minLength: 1 + put: + summary: Update a payment link + tags: + - Payment links + operationId: updatePlan + description: Updates a company-scoped payment link and returns it. Omitted values + remain unchanged. Price and currency changes apply only to existing one-off + links; recurring schedule changes apply only to links that already support + recurring payments. + security: + - BearerAuth: [] + - AccessToken: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/PlanUpdateRequest" + examples: + rename: + summary: Rename a payment link + value: + name: Updated consulting membership + multipart/form-data: + schema: + "$ref": "#/components/schemas/PlanUpdateMultipartRequest" + examples: + replace_download: + summary: Replace an uploaded download + value: + download_type: upload + download_file: "" + responses: + '200': + description: payment link updated + content: + application/json: + schema: + "$ref": "#/components/schemas/PlanResponse" + '400': + description: validation failed + content: + application/json: + schema: + "$ref": "#/components/schemas/BadRequestError" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: payment link not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + "/api/v1/refunds": + post: + summary: Refund a payment + tags: + - Refunds + operationId: createRefund + description: Refunds all or part of a company payment through its processor. + Amount is expressed in the payment currency's major unit, cannot exceed the + unrefunded balance, and updates the payment to part_refund or full_refund. + security: + - BearerAuth: [] + - AccessToken: [] + requestBody: + required: true + content: + application/json: + schema: + "$ref": "#/components/schemas/RefundRequest" + examples: + partial_refund: + summary: Refund part of a payment + value: + payment_id: 101 + amount: 5 + reason: requested_by_customer + responses: + '204': + description: payment refunded + '400': + description: refund failed + content: + application/json: + schema: + "$ref": "#/components/schemas/BadRequestError" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: payment not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + "/api/v1/subscriptions": + get: + summary: List subscriptions + tags: + - Subscriptions + operationId: listSubscriptions + description: Returns provider-backed subscriptions for the authenticated company, + ordered by most recently updated. Active, pending, past-due, and trialing + subscriptions are returned by default; with_cancelled=true also includes terminal + statuses. + parameters: + - name: page + in: query + required: false + description: Page number to return. Blank values use the first page. + example: 1 + schema: + type: integer + minimum: 1 + default: 1 + - name: per_page + in: query + required: false + description: Number of records per page. Invalid or blank values use 20; values + above 100 are capped at 100. + example: 20 + schema: + type: integer + minimum: 1 + maximum: 100 + default: 20 + - name: with_cancelled + in: query + required: false + description: When true, includes cancelled, canceled, incomplete, incomplete_expired, + and unpaid subscriptions. Blank values behave as false. + example: true + schema: + type: boolean + default: false + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: subscriptions + content: + application/json: + schema: + "$ref": "#/components/schemas/SubscriptionListResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + "/api/v1/subscriptions/{id}": + parameters: + - name: id + in: path + required: true + description: Numeric subscription ID belonging to the authenticated company. + example: 77 + schema: + type: integer + minimum: 1 + get: + summary: Retrieve a subscription + tags: + - Subscriptions + operationId: getSubscription + description: Returns a company-scoped subscription with its customer, payment + link, and payments ordered newest first. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: subscription + content: + application/json: + schema: + "$ref": "#/components/schemas/SubscriptionResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: subscription not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + delete: + summary: Cancel a subscription + tags: + - Subscriptions + operationId: cancelSubscription + description: Immediately requests cancellation from Stripe or GoCardless and + marks the local subscription cancelled. It does not wait until the end of + the current billing period. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '204': + description: subscription cancelled + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" + '404': + description: subscription not found + content: + application/json: + schema: + "$ref": "#/components/schemas/NotFoundError" + "/api/v1/user": + get: + summary: Retrieve the current user + tags: + - User + operationId: getCurrentUser + description: Returns the authenticated user, their role in the active company, + and the companies available to them. API keys may be supplied as a bearer + token or the access_token query parameter. + security: + - BearerAuth: [] + - AccessToken: [] + responses: + '200': + description: current user + content: + application/json: + schema: + "$ref": "#/components/schemas/UserResponse" + '401': + description: authentication required + content: + application/json: + schema: + "$ref": "#/components/schemas/AuthenticationError" +servers: +- url: https://api.payhere.co + description: Production PayHere API +- url: https://sandbox.payhere.co + description: Sandbox PayHere API for test data and integrations +components: + schemas: + AuthenticationError: + type: object + description: Returned when the API key is missing, invalid, or expired. + required: + - error + properties: + error: + type: string + description: Human-readable explanation of the error. + example: The request could not be completed. + readOnly: true + additionalProperties: false + examples: + - error: You need to sign in or sign up before continuing. + title: AuthenticationError + BadRequestError: + description: A malformed request, business-rule failure, or validation failure. + oneOf: + - "$ref": "#/components/schemas/Error" + - "$ref": "#/components/schemas/ValidationError" + - "$ref": "#/components/schemas/MalformedRequestError" + examples: + - error: This feature is currently disabled on your account + - error: Plan validation failed + validation_errors: + - field: name + errors: + - can't be blank + full_errors: + - Name can't be blank + form_errors: + name: can't be blank + - status: 400 + error: Bad Request + title: BadRequestError + Company: + type: object + description: A PayHere merchant account. + required: + - id + - name + - legal_name + - slug + - ready + - country_code + - button_color + - button_text + - role + - stripe_connected + - gocardless_connected + - currency + - vat_registered + - vat_rate + - small_logo_url + - facebook_pixel_id + - ga_tracking_id + - recaptcha_enabled + - avatar_url + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique company ID. + example: 12 + readOnly: true + name: + type: string + description: Public company name. + example: Example Studio + readOnly: true + legal_name: + type: + - string + - 'null' + description: Registered legal name, when supplied. + example: Example Studio Ltd + readOnly: true + slug: + type: string + description: URL-safe company identifier. + example: example-studio + readOnly: true + ready: + type: boolean + description: Whether the company is ready to accept payments. + example: true + readOnly: true + country_code: + type: + - string + - 'null' + description: Two-letter country code. + example: GB + pattern: "^[A-Z]{2}$" + readOnly: true + button_color: + type: + - string + - 'null' + description: Checkout button colour. + example: "#2563EB" + readOnly: true + button_text: + type: + - string + - 'null' + description: Contrasting checkout button text colour. + example: white + readOnly: true + role: + type: string + description: Company feature-access role. + example: standard + enum: + - standard + - beta + - testing + readOnly: true + stripe_connected: + type: boolean + description: Whether a Stripe account is connected. + example: true + readOnly: true + gocardless_connected: + type: boolean + description: Whether a GoCardless account is connected. + example: false + readOnly: true + currency: + type: string + description: Default lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + vat_registered: + type: boolean + description: Whether VAT collection is enabled. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: Configured VAT percentage; historical values may be strings. + example: 20 + readOnly: true + small_logo_url: + type: + - string + - 'null' + description: Relative URL for the small company logo. + example: "/rails/active_storage/representations/example-logo.png" + readOnly: true + facebook_pixel_id: + type: + - string + - 'null' + description: Facebook Pixel ID used on checkout pages. + example: + readOnly: true + ga_tracking_id: + type: + - string + - 'null' + description: Google Analytics tracking ID used on checkout pages. + example: + readOnly: true + recaptcha_enabled: + type: boolean + description: Whether checkout forms require reCAPTCHA. + example: false + readOnly: true + avatar_url: + type: string + description: Generated company avatar URL. + example: https://example.com/avatar.png + format: uri + readOnly: true + created_at: + type: string + description: When the company was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the company was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: companies + const: companies + readOnly: true + testing_access: + type: boolean + description: Present only for companies with testing access. + example: true + readOnly: true + additionalProperties: false + title: Company + CompanyCustomer: + type: object + description: Company-specific details for a customer. + required: + - id + - card_brand + - card_last4 + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique company-customer relationship ID. + example: 31 + readOnly: true + card_brand: + type: + - string + - 'null' + description: Brand of the customer's saved card, when available. + example: visa + readOnly: true + card_last4: + type: + - string + - 'null' + description: Last four digits of the customer's saved card. + example: '4242' + pattern: "^[0-9]{4}$" + readOnly: true + created_at: + type: string + description: When the customer was attached to the company. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the company-specific details last changed. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: company_customers + const: company_customers + readOnly: true + additionalProperties: false + title: CompanyCustomer + CompanyDetailed: + type: object + description: A company with account, tax, domain, and user details. + required: + - id + - name + - legal_name + - slug + - ready + - country_code + - button_color + - button_text + - role + - stripe_connected + - gocardless_connected + - currency + - vat_registered + - vat_rate + - small_logo_url + - facebook_pixel_id + - ga_tracking_id + - recaptcha_enabled + - avatar_url + - created_at + - updated_at + - type + - plan + - plan_interval + - subscription_status + - active_until + - support_email + - website + - address + - vat_registration_number + - vat_mechanism + - custom_domain + - users + properties: + id: + type: integer + description: Unique company ID. + example: 12 + readOnly: true + name: + type: string + description: Public company name. + example: Example Studio + readOnly: true + legal_name: + type: + - string + - 'null' + description: Registered legal name, when supplied. + example: Example Studio Ltd + readOnly: true + slug: + type: string + description: URL-safe company identifier. + example: example-studio + readOnly: true + ready: + type: boolean + description: Whether the company is ready to accept payments. + example: true + readOnly: true + country_code: + type: + - string + - 'null' + description: Two-letter country code. + example: GB + pattern: "^[A-Z]{2}$" + readOnly: true + button_color: + type: + - string + - 'null' + description: Checkout button colour. + example: "#2563EB" + readOnly: true + button_text: + type: + - string + - 'null' + description: Contrasting checkout button text colour. + example: white + readOnly: true + role: + type: string + description: Company feature-access role. + example: standard + enum: + - standard + - beta + - testing + readOnly: true + stripe_connected: + type: boolean + description: Whether a Stripe account is connected. + example: true + readOnly: true + gocardless_connected: + type: boolean + description: Whether a GoCardless account is connected. + example: false + readOnly: true + currency: + type: string + description: Default lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + vat_registered: + type: boolean + description: Whether VAT collection is enabled. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: Configured VAT percentage; historical values may be strings. + example: 20 + readOnly: true + small_logo_url: + type: + - string + - 'null' + description: Relative URL for the small company logo. + example: "/rails/active_storage/representations/example-logo.png" + readOnly: true + facebook_pixel_id: + type: + - string + - 'null' + description: Facebook Pixel ID used on checkout pages. + example: + readOnly: true + ga_tracking_id: + type: + - string + - 'null' + description: Google Analytics tracking ID used on checkout pages. + example: + readOnly: true + recaptcha_enabled: + type: boolean + description: Whether checkout forms require reCAPTCHA. + example: false + readOnly: true + avatar_url: + type: string + description: Generated company avatar URL. + example: https://example.com/avatar.png + format: uri + readOnly: true + created_at: + type: string + description: When the company was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the company was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: companies + const: companies + readOnly: true + testing_access: + type: boolean + description: Present only for companies with testing access. + example: true + readOnly: true + plan: + type: + - string + - 'null' + description: PayHere account plan. + example: growth + readOnly: true + plan_interval: + type: + - string + - 'null' + description: Account billing interval. + example: month + enum: + - month + - year + - + readOnly: true + subscription_status: + type: + - string + - 'null' + description: PayHere account subscription status. + example: active + enum: + - trial + - active + - past_due + - requires_billing_details + - cancelled + - + readOnly: true + active_until: + type: + - string + - 'null' + description: End of the current account access period, when applicable. + example: + format: date-time + readOnly: true + support_email: + type: + - string + - 'null' + description: Customer-facing support email address. + example: support@example.com + format: email + readOnly: true + website: + type: + - string + - 'null' + description: Company website URL. + example: https://example.com + format: uri + readOnly: true + address: + type: + - string + - 'null' + description: Company postal address. + example: 1 Example Street, London + readOnly: true + vat_registration_number: + type: + - string + - 'null' + description: VAT registration number shown on receipts. + example: GB123456789 + readOnly: true + vat_mechanism: + type: + - string + - 'null' + description: How VAT is calculated. + example: flat_rate + enum: + - flat_rate + - based_on_customer + - always + - + readOnly: true + custom_domain: + type: + - string + - 'null' + description: Custom checkout domain, when configured. + example: + readOnly: true + users: + type: array + description: Users who can access the company. + items: + "$ref": "#/components/schemas/User" + readOnly: true + additionalProperties: false + title: CompanyDetailed + CompanyEmbeddedDetailed: + type: object + description: Company details embedded in another resource. + required: + - id + - name + - legal_name + - slug + - ready + - country_code + - button_color + - button_text + - role + - stripe_connected + - gocardless_connected + - currency + - vat_registered + - vat_rate + - small_logo_url + - facebook_pixel_id + - ga_tracking_id + - recaptcha_enabled + - avatar_url + - created_at + - updated_at + - type + - plan + - plan_interval + - subscription_status + - active_until + - support_email + - website + - address + - vat_registration_number + - vat_mechanism + - custom_domain + properties: + id: + type: integer + description: Unique company ID. + example: 12 + readOnly: true + name: + type: string + description: Public company name. + example: Example Studio + readOnly: true + legal_name: + type: + - string + - 'null' + description: Registered legal name, when supplied. + example: Example Studio Ltd + readOnly: true + slug: + type: string + description: URL-safe company identifier. + example: example-studio + readOnly: true + ready: + type: boolean + description: Whether the company is ready to accept payments. + example: true + readOnly: true + country_code: + type: + - string + - 'null' + description: Two-letter country code. + example: GB + pattern: "^[A-Z]{2}$" + readOnly: true + button_color: + type: + - string + - 'null' + description: Checkout button colour. + example: "#2563EB" + readOnly: true + button_text: + type: + - string + - 'null' + description: Contrasting checkout button text colour. + example: white + readOnly: true + role: + type: string + description: Company feature-access role. + example: standard + enum: + - standard + - beta + - testing + readOnly: true + stripe_connected: + type: boolean + description: Whether a Stripe account is connected. + example: true + readOnly: true + gocardless_connected: + type: boolean + description: Whether a GoCardless account is connected. + example: false + readOnly: true + currency: + type: string + description: Default lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + vat_registered: + type: boolean + description: Whether VAT collection is enabled. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: Configured VAT percentage; historical values may be strings. + example: 20 + readOnly: true + small_logo_url: + type: + - string + - 'null' + description: Relative URL for the small company logo. + example: "/rails/active_storage/representations/example-logo.png" + readOnly: true + facebook_pixel_id: + type: + - string + - 'null' + description: Facebook Pixel ID used on checkout pages. + example: + readOnly: true + ga_tracking_id: + type: + - string + - 'null' + description: Google Analytics tracking ID used on checkout pages. + example: + readOnly: true + recaptcha_enabled: + type: boolean + description: Whether checkout forms require reCAPTCHA. + example: false + readOnly: true + avatar_url: + type: string + description: Generated company avatar URL. + example: https://example.com/avatar.png + format: uri + readOnly: true + created_at: + type: string + description: When the company was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the company was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: companies + const: companies + readOnly: true + testing_access: + type: boolean + description: Present only for companies with testing access. + example: true + readOnly: true + plan: + type: + - string + - 'null' + description: PayHere account plan. + example: growth + readOnly: true + plan_interval: + type: + - string + - 'null' + description: Account billing interval. + example: month + enum: + - month + - year + - + readOnly: true + subscription_status: + type: + - string + - 'null' + description: PayHere account subscription status. + example: active + enum: + - trial + - active + - past_due + - requires_billing_details + - cancelled + - + readOnly: true + active_until: + type: + - string + - 'null' + description: End of the current account access period, when applicable. + example: + format: date-time + readOnly: true + support_email: + type: + - string + - 'null' + description: Customer-facing support email address. + example: support@example.com + format: email + readOnly: true + website: + type: + - string + - 'null' + description: Company website URL. + example: https://example.com + format: uri + readOnly: true + address: + type: + - string + - 'null' + description: Company postal address. + example: 1 Example Street, London + readOnly: true + vat_registration_number: + type: + - string + - 'null' + description: VAT registration number shown on receipts. + example: GB123456789 + readOnly: true + vat_mechanism: + type: + - string + - 'null' + description: How VAT is calculated. + example: flat_rate + enum: + - flat_rate + - based_on_customer + - always + - + readOnly: true + custom_domain: + type: + - string + - 'null' + description: Custom checkout domain, when configured. + example: + readOnly: true + additionalProperties: false + title: CompanyEmbeddedDetailed + CompanyResponse: + type: object + description: Company response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/CompanyDetailed" + description: The authenticated company. + readOnly: true + examples: + - data: + id: 12 + name: Example Studio + legal_name: Example Studio Ltd + slug: example-studio + ready: true + country_code: GB + button_color: "#2563EB" + button_text: white + role: standard + stripe_connected: true + gocardless_connected: false + currency: gbp + vat_registered: true + vat_rate: 20 + small_logo_url: "/rails/active_storage/representations/example-logo.png" + facebook_pixel_id: + ga_tracking_id: + recaptcha_enabled: false + avatar_url: https://example.com/avatar.png + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: companies + plan: growth + plan_interval: month + subscription_status: active + active_until: + support_email: support@example.com + website: https://example.com + address: 1 Example Street, London + vat_registration_number: GB123456789 + vat_mechanism: flat_rate + custom_domain: + users: + - id: 7 + display_name: Alex Morgan + email: alex@example.com + unconfirmed_email: + role: admin + email_verified: true + company_id: 12 + invitation_accepted: true + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: users + additionalProperties: false + title: CompanyResponse + CompanyUpdateMultipartRequest: + type: object + description: Company attributes submitted as multipart form data, including + an optional logo upload. + properties: + name: + type: string + description: Public company name. Blank values fail validation. + example: Example Studio + legal_name: + type: + - string + - 'null' + description: Registered legal name. + example: Example Studio Ltd + address: + type: + - string + - 'null' + description: Postal address shown on receipts. + example: 1 Example Street, London + support_email: + type: + - string + - 'null' + description: Customer-facing support email. + example: support@example.com + format: email + website: + type: + - string + - 'null' + description: Company website URL; blank clears the value. + example: https://example.com + format: uri + button_color: + type: + - string + - 'null' + description: Checkout button colour. + example: "#2563EB" + button_text: + type: + - string + - 'null' + description: Checkout button text colour. + example: white + vat_registered: + type: boolean + description: Whether VAT collection is enabled. + example: true + vat_rate: + type: + - string + - number + - 'null' + description: VAT percentage to apply. + example: 20 + vat_registration_number: + type: + - string + - 'null' + description: VAT registration number shown on receipts. + example: GB123456789 + vat_mechanism: + type: + - string + - 'null' + description: How VAT is calculated. + example: flat_rate + enum: + - flat_rate + - based_on_customer + - always + - + company_number_label: + type: + - string + - 'null' + description: Label used for the company registration number. + example: Company number + company_number: + type: + - string + - 'null' + description: Company registration number. + example: '12345678' + invoice_reference_prefix: + type: + - string + - 'null' + description: Prefix applied to generated invoice references. + example: INV + invoice_tax_label: + type: + - string + - 'null' + description: Tax label shown on invoices. + example: VAT + invoice_tax_rate: + type: + - number + - 'null' + description: Default invoice tax percentage. + example: 20 + minimum: 0 + invoice_manual_payment_details: + type: + - string + - 'null' + description: Manual payment instructions shown on invoices. + example: Pay by bank transfer using the invoice reference. + attribution_reason: + type: + - string + - 'null' + description: How the company heard about PayHere. + example: Google + how_can_we_help: + type: + - string + - 'null' + description: Optional request for help from the PayHere team. + example: Help configuring VAT + facebook_pixel_id: + type: + - string + - 'null' + description: Facebook Pixel ID used on checkout pages. + example: + ga_tracking_id: + type: + - string + - 'null' + description: Google Analytics tracking ID used on checkout pages. + example: + custom_css: + type: + - string + - 'null' + description: Custom checkout CSS for accounts with access to this feature. + example: + logo: + type: string + format: binary + description: Company logo image to upload. + examples: + - legal_name: Example Studio Ltd + support_email: support@example.com + - name: Example Studio + logo: "" + additionalProperties: false + title: CompanyUpdateMultipartRequest + CompanyUpdateRequest: + type: object + description: Company attributes to update. Omitted properties remain unchanged. + properties: + name: + type: string + description: Public company name. Blank values fail validation. + example: Example Studio + legal_name: + type: + - string + - 'null' + description: Registered legal name. + example: Example Studio Ltd + address: + type: + - string + - 'null' + description: Postal address shown on receipts. + example: 1 Example Street, London + support_email: + type: + - string + - 'null' + description: Customer-facing support email. + example: support@example.com + format: email + website: + type: + - string + - 'null' + description: Company website URL; blank clears the value. + example: https://example.com + format: uri + button_color: + type: + - string + - 'null' + description: Checkout button colour. + example: "#2563EB" + button_text: + type: + - string + - 'null' + description: Checkout button text colour. + example: white + vat_registered: + type: boolean + description: Whether VAT collection is enabled. + example: true + vat_rate: + type: + - string + - number + - 'null' + description: VAT percentage to apply. + example: 20 + vat_registration_number: + type: + - string + - 'null' + description: VAT registration number shown on receipts. + example: GB123456789 + vat_mechanism: + type: + - string + - 'null' + description: How VAT is calculated. + example: flat_rate + enum: + - flat_rate + - based_on_customer + - always + - + company_number_label: + type: + - string + - 'null' + description: Label used for the company registration number. + example: Company number + company_number: + type: + - string + - 'null' + description: Company registration number. + example: '12345678' + invoice_reference_prefix: + type: + - string + - 'null' + description: Prefix applied to generated invoice references. + example: INV + invoice_tax_label: + type: + - string + - 'null' + description: Tax label shown on invoices. + example: VAT + invoice_tax_rate: + type: + - number + - 'null' + description: Default invoice tax percentage. + example: 20 + minimum: 0 + invoice_manual_payment_details: + type: + - string + - 'null' + description: Manual payment instructions shown on invoices. + example: Pay by bank transfer using the invoice reference. + attribution_reason: + type: + - string + - 'null' + description: How the company heard about PayHere. + example: Google + how_can_we_help: + type: + - string + - 'null' + description: Optional request for help from the PayHere team. + example: Help configuring VAT + facebook_pixel_id: + type: + - string + - 'null' + description: Facebook Pixel ID used on checkout pages. + example: + ga_tracking_id: + type: + - string + - 'null' + description: Google Analytics tracking ID used on checkout pages. + example: + custom_css: + type: + - string + - 'null' + description: Custom checkout CSS for accounts with access to this feature. + example: + examples: + - legal_name: Example Studio Ltd + support_email: support@example.com + additionalProperties: false + title: CompanyUpdateRequest + CurrentUser: + type: object + description: The authenticated user with their available companies. + required: + - id + - display_name + - email + - unconfirmed_email + - role + - email_verified + - company_id + - invitation_accepted + - created_at + - updated_at + - type + - active_company_role + - available_companies + properties: + id: + type: integer + description: Unique user ID. + example: 7 + readOnly: true + display_name: + type: string + description: User's display name. + example: Alex Morgan + readOnly: true + email: + type: string + description: User's confirmed email address. + example: alex@example.com + format: email + readOnly: true + unconfirmed_email: + type: + - string + - 'null' + description: Pending replacement email address awaiting confirmation. + example: + format: email + readOnly: true + role: + type: string + description: Application-level access role. + example: admin + enum: + - user + - beta_user + - admin + - superadmin + readOnly: true + email_verified: + type: boolean + description: Whether the email address is confirmed. + example: true + readOnly: true + company_id: + type: + - integer + - 'null' + description: Currently active company ID. + example: 12 + readOnly: true + invitation_accepted: + type: boolean + description: Whether an invitation has been accepted or was not required. + example: true + readOnly: true + created_at: + type: string + description: When the user was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the user was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: users + const: users + readOnly: true + active_company_role: + type: + - string + - 'null' + description: Role within the active company. + example: owner + enum: + - member + - owner + - + readOnly: true + available_companies: + type: array + description: Companies the user can switch to. + readOnly: true + items: + type: object + required: + - id + - slug + - name + properties: + id: + type: integer + description: Company ID. + example: 12 + readOnly: true + slug: + type: string + description: URL-safe company identifier. + example: example-studio + readOnly: true + name: + type: string + description: Company name. + example: Example Studio + readOnly: true + additionalProperties: false + additionalProperties: false + title: CurrentUser + CustomField: + type: object + description: A merchant-defined field collected during checkout. + required: + - label + - type + properties: + label: + type: string + description: Label shown to the customer. + example: Company name + type: + type: string + description: Input control type. + example: text + enum: + - text + - textarea + - dropdown + - checkbox + - label + required: + type: boolean + description: Whether the customer must supply a value. + example: true + hidden: + type: boolean + description: Whether the field is hidden from the customer. + example: false + options: + type: + - string + - 'null' + description: Comma-separated choices for a dropdown field. + example: Small, Medium, Large + additionalProperties: false + title: CustomField + Customer: + type: object + description: A customer who has paid or subscribed through the company. + required: + - id + - display_name + - name + - email + - ip_address + - location + - company_name + - company_address + - phone_number + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique customer ID. + example: 24 + readOnly: true + display_name: + type: string + description: Company name when present, otherwise the customer's name. + example: Acme Consulting + readOnly: true + name: + type: string + description: Customer's full name. + example: Jamie Taylor + readOnly: true + email: + type: string + description: Customer's email address. + example: jamie@example.com + format: email + readOnly: true + ip_address: + type: + - string + - 'null' + description: IP address captured when the customer was created. + example: 203.0.113.10 + readOnly: true + location: + type: + - object + - 'null' + description: Geolocation data captured at checkout. Keys may vary by provider. + example: + city: London + country: United Kingdom + additionalProperties: true + readOnly: true + company_name: + type: + - string + - 'null' + description: Customer's organisation name. + example: Acme Consulting + readOnly: true + company_address: + type: + - string + - 'null' + description: Customer's organisation address. + example: 2 Example Road, London + readOnly: true + phone_number: + type: + - string + - 'null' + description: Customer's phone number. + example: "+44 20 7946 0958" + readOnly: true + created_at: + type: string + description: When the customer was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the customer was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: customers + const: customers + readOnly: true + additionalProperties: false + title: Customer + CustomerDetailed: + type: object + description: A customer with company-specific details, subscriptions, and payments. + required: + - id + - display_name + - name + - email + - ip_address + - location + - company_name + - company_address + - phone_number + - created_at + - updated_at + - type + - subscriptions + - payments + - company_customer + properties: + id: + type: integer + description: Unique customer ID. + example: 24 + readOnly: true + display_name: + type: string + description: Company name when present, otherwise the customer's name. + example: Acme Consulting + readOnly: true + name: + type: string + description: Customer's full name. + example: Jamie Taylor + readOnly: true + email: + type: string + description: Customer's email address. + example: jamie@example.com + format: email + readOnly: true + ip_address: + type: + - string + - 'null' + description: IP address captured when the customer was created. + example: 203.0.113.10 + readOnly: true + location: + type: + - object + - 'null' + description: Geolocation data captured at checkout. Keys may vary by provider. + example: + city: London + country: United Kingdom + additionalProperties: true + readOnly: true + company_name: + type: + - string + - 'null' + description: Customer's organisation name. + example: Acme Consulting + readOnly: true + company_address: + type: + - string + - 'null' + description: Customer's organisation address. + example: 2 Example Road, London + readOnly: true + phone_number: + type: + - string + - 'null' + description: Customer's phone number. + example: "+44 20 7946 0958" + readOnly: true + created_at: + type: string + description: When the customer was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the customer was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: customers + const: customers + readOnly: true + subscriptions: + type: array + description: Subscriptions belonging to this company, newest data first + as stored by the serializer. + items: + "$ref": "#/components/schemas/CustomerEmbeddedSubscription" + readOnly: true + payments: + type: array + description: Payments belonging to this company. + items: + "$ref": "#/components/schemas/CustomerEmbeddedPayment" + readOnly: true + company_customer: + description: Company-specific customer details, or null when no company + context was supplied. + anyOf: + - "$ref": "#/components/schemas/CompanyCustomer" + - type: 'null' + readOnly: true + additionalProperties: false + title: CustomerDetailed + CustomerEmbeddedPayment: + type: object + description: Raw payment details embedded in a detailed customer response. + required: + - id + - reference + - amount_in_cents + - stripe_charge_id + - company_id + - created_at + - updated_at + - card_brand + - card_country + - card_last4 + - secure_token + - application_fee_in_cents + - metadata + - subscription_id + - customer_id + - user_present + - products_purchased + - ip_address + - location + - status + - refunded_at + - refund_amount_in_cents + - currency + - stripe_card_token + - last_error + - object_type + - object_id + - usd_amount_in_cents + - stripe_payment_method + - purchased_qty + - provider + - custom_fields + - gocardless_payment_id + - failed_attempts + - vat_included + - vat_rate + - vat_amount_in_cents + - ex_vat_amount_in_cents + - country_code + - invoice_id + - coupon_code + - discount_percent + - temporary + - discount_amount_in_cents + - billing_engine_charge_attempt_id + - stripe_intent_id + - embed_origin + - gateway_fee_in_cents + - payment_request_method + - trial_signup + properties: + id: + type: integer + description: Unique payment ID. + example: 101 + readOnly: true + reference: + type: + - string + - 'null' + description: Merchant-provided payment reference. + example: ORDER-1001 + readOnly: true + amount_in_cents: + type: integer + description: Original payment amount in the currency's smallest unit. + example: 3000 + minimum: 0 + readOnly: true + stripe_charge_id: + type: + - string + - 'null' + description: Stripe charge ID, when processed by Stripe. + example: ch_example + readOnly: true + company_id: + type: integer + description: Company that received the payment. + example: 12 + readOnly: true + created_at: + type: string + description: When the payment was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + card_brand: + type: + - string + - 'null' + description: Payment card brand. + example: visa + readOnly: true + card_country: + type: + - string + - 'null' + description: Two-letter country code reported for the card. + example: GB + readOnly: true + card_last4: + type: + - string + - 'null' + description: Last four card digits. + example: '4242' + pattern: "^[0-9]{4}$" + readOnly: true + secure_token: + type: + - string + - 'null' + description: Opaque token used by customer-facing payment links. + example: example-payment-token + readOnly: true + application_fee_in_cents: + type: + - integer + - 'null' + description: PayHere application fee in the smallest currency unit. + example: 60 + readOnly: true + metadata: + type: object + description: Internal payment metadata whose keys vary by payment flow. + example: {} + additionalProperties: true + readOnly: true + subscription_id: + type: + - integer + - 'null' + description: Related subscription ID. + example: 77 + readOnly: true + customer_id: + type: + - integer + - 'null' + description: Related customer ID. + example: 24 + readOnly: true + user_present: + type: boolean + description: Whether a user session was present during checkout. + example: true + readOnly: true + products_purchased: + type: array + description: Identifiers of products purchased in the payment. + example: + - '42' + items: + type: string + readOnly: true + ip_address: + type: + - string + - 'null' + description: IP address captured at checkout. + example: 203.0.113.10 + readOnly: true + location: + type: object + description: Geolocation data captured at checkout; keys vary by provider. + example: + city: London + additionalProperties: true + readOnly: true + status: + type: string + description: Payment processing status. + example: success + enum: + - pending + - success + - part_refund + - full_refund + - future + - failed + readOnly: true + refunded_at: + type: + - string + - 'null' + description: When the payment was first refunded. + example: + format: date-time + readOnly: true + refund_amount_in_cents: + type: integer + description: Total refunded amount in the smallest currency unit. + example: 0 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + stripe_card_token: + type: + - string + - 'null' + description: Legacy Stripe card token. + example: + readOnly: true + last_error: + type: + - string + - 'null' + description: Stored payment processor error. + example: + readOnly: true + object_type: + type: + - string + - 'null' + description: Type of the purchased resource. + example: Plan + readOnly: true + object_id: + type: + - integer + - 'null' + description: ID of the purchased resource. + example: 42 + readOnly: true + usd_amount_in_cents: + type: integer + description: Payment value converted to US cents. + example: 3800 + readOnly: true + stripe_payment_method: + type: + - string + - 'null' + description: Stripe payment method ID. + example: pm_example + readOnly: true + purchased_qty: + type: integer + description: Quantity purchased. + example: 1 + minimum: 1 + readOnly: true + provider: + type: string + description: Payment provider. + example: stripe + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + gocardless_payment_id: + type: + - string + - 'null' + description: GoCardless payment ID. + example: + readOnly: true + failed_attempts: + type: integer + description: Number of failed collection attempts. + example: 0 + minimum: 0 + readOnly: true + vat_included: + type: + - boolean + - 'null' + description: Whether the amount includes VAT. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: VAT percentage; historical values may be strings. + example: 20 + readOnly: true + vat_amount_in_cents: + type: + - integer + - 'null' + description: VAT amount in the smallest currency unit. + example: 500 + readOnly: true + ex_vat_amount_in_cents: + type: + - integer + - 'null' + description: Amount before VAT in the smallest currency unit. + example: 2500 + readOnly: true + country_code: + type: + - string + - 'null' + description: Two-letter checkout country code. + example: GB + readOnly: true + invoice_id: + type: + - integer + - 'null' + description: Related invoice ID. + example: + readOnly: true + coupon_code: + type: + - string + - 'null' + description: Applied coupon code. + example: + readOnly: true + discount_percent: + type: + - string + - number + description: Applied percentage discount; historical values may be strings. + example: 0 + readOnly: true + temporary: + type: boolean + description: Whether this is an unfinished checkout payment. + example: false + readOnly: true + discount_amount_in_cents: + type: integer + description: Discount amount in the smallest currency unit. + example: 0 + minimum: 0 + readOnly: true + billing_engine_charge_attempt_id: + type: + - integer + - 'null' + description: Related PayHere billing attempt ID. + example: + readOnly: true + stripe_intent_id: + type: + - string + - 'null' + description: Stripe PaymentIntent or SetupIntent ID. + example: pi_example + readOnly: true + embed_origin: + type: + - string + - 'null' + description: Origin of the embedding site, when supplied. + example: https://example.com + readOnly: true + gateway_fee_in_cents: + type: + - integer + - 'null' + description: Processor fee in the smallest currency unit. + example: 60 + readOnly: true + payment_request_method: + type: + - string + - 'null' + description: Wallet or payment-request method used at checkout. + example: + readOnly: true + trial_signup: + type: boolean + description: Whether the payment represents a free-trial signup. + example: false + readOnly: true + additionalProperties: false + title: CustomerEmbeddedPayment + CustomerEmbeddedSubscription: + type: object + description: Raw subscription details embedded in a detailed customer response. + required: + - id + - customer_id + - company_id + - last_charged + - next_charge_at + - stripe_subscription_id + - stripe_plan_id + - billing_interval + - created_at + - updated_at + - status + - plan_id + - provider + - metadata + - billing_interval_count + - min_billing_cycles + - cancel_after + - trial_period_days + - custom_fields + - coupon_code + - discount_percent + - quantity + - discount_amount_in_cents + - billing_engine + - stripe_payment_method_id + - charge_retry_count + - unit_amount_in_cents + properties: + id: + type: integer + description: Unique subscription ID. + example: 77 + readOnly: true + customer_id: + type: + - integer + - 'null' + description: Related customer ID. + example: 24 + readOnly: true + company_id: + type: + - integer + - 'null' + description: Company that owns the subscription. + example: 12 + readOnly: true + last_charged: + type: + - string + - 'null' + description: When the subscription was most recently charged. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + next_charge_at: + type: + - string + - 'null' + description: Scheduled time of the next charge. + example: '2026-02-15T10:30:00Z' + format: date-time + readOnly: true + stripe_subscription_id: + type: + - string + - 'null' + description: Stripe subscription ID. + example: sub_example + readOnly: true + stripe_plan_id: + type: + - string + - 'null' + description: Legacy Stripe plan or price ID. + example: price_example + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + created_at: + type: string + description: When the subscription was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the subscription was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + status: + type: string + description: Subscription status. + example: active + enum: + - active + - past_due + - pending + - trialing + - cancelled + - canceled + - incomplete + - incomplete_expired + - unpaid + readOnly: true + plan_id: + type: + - integer + - 'null' + description: Related payment-link ID. + example: 42 + readOnly: true + provider: + type: string + description: Subscription payment provider. + example: stripe + readOnly: true + metadata: + type: object + description: Provider and billing metadata whose keys vary by subscription. + example: {} + additionalProperties: true + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + readOnly: true + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which the subscription ends. + example: + minimum: 1 + readOnly: true + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days. + example: + minimum: 1 + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + coupon_code: + type: + - string + - 'null' + description: Applied coupon code. + example: + readOnly: true + discount_percent: + type: + - string + - number + description: Applied percentage discount; historical values may be strings. + example: 0 + readOnly: true + quantity: + type: integer + description: Quantity billed each cycle. + example: 1 + minimum: 1 + readOnly: true + discount_amount_in_cents: + type: integer + description: Discount per cycle in the smallest currency unit. + example: 0 + minimum: 0 + readOnly: true + billing_engine: + type: string + description: System responsible for scheduling charges. + example: stripe + enum: + - stripe + - payhere + readOnly: true + stripe_payment_method_id: + type: + - string + - 'null' + description: Stripe payment method used for PayHere billing. + example: + readOnly: true + charge_retry_count: + type: integer + description: Number of charge retries attempted. + example: 0 + minimum: 0 + readOnly: true + unit_amount_in_cents: + type: + - integer + - 'null' + description: Per-unit recurring amount in the smallest currency unit. + example: 3000 + minimum: 0 + readOnly: true + additionalProperties: false + title: CustomerEmbeddedSubscription + CustomerListResponse: + type: object + description: Paginated customer response. Items include related records when + detailed=true. + required: + - data + - meta + properties: + data: + type: array + description: Customers in the requested page. + items: + oneOf: + - "$ref": "#/components/schemas/Customer" + - "$ref": "#/components/schemas/CustomerDetailed" + readOnly: true + meta: + "$ref": "#/components/schemas/Pagination" + description: Pagination details. + readOnly: true + examples: + - data: + - id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + meta: + current_page: 1 + next_page: 2 + prev_page: + total_pages: 3 + total_count: 42 + - data: + - id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + meta: + current_page: 1 + next_page: 2 + prev_page: + total_pages: 3 + total_count: 42 + additionalProperties: false + title: CustomerListResponse + CustomerResponse: + type: object + description: Detailed customer response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/CustomerDetailed" + description: The requested customer. + readOnly: true + examples: + - data: + id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + additionalProperties: false + title: CustomerResponse + Error: + type: object + description: An API error response. + required: + - error + properties: + error: + type: string + description: Human-readable explanation of the error. + example: The request could not be completed. + readOnly: true + additionalProperties: false + title: Error + MalformedRequestError: + type: object + description: Returned when Rails cannot parse the request. + required: + - error + - status + properties: + error: + type: string + description: Human-readable explanation of the error. + example: The request could not be completed. + readOnly: true + status: + type: integer + const: 400 + description: HTTP status code. + example: 400 + readOnly: true + additionalProperties: false + examples: + - status: 400 + error: Bad Request + title: MalformedRequestError + NotFoundError: + type: object + description: Returned when a company-scoped resource cannot be found. + required: + - error + - status + properties: + error: + type: string + description: Human-readable explanation of the error. + example: The request could not be completed. + readOnly: true + status: + type: integer + const: 404 + description: HTTP status code. + example: 404 + readOnly: true + additionalProperties: false + examples: + - status: 404 + error: Not Found + title: NotFoundError + Pagination: + type: object + description: Pagination metadata for a collection response. + required: + - current_page + - next_page + - prev_page + - total_pages + - total_count + properties: + current_page: + type: integer + minimum: 1 + description: Page represented by this response. + example: 1 + readOnly: true + next_page: + type: + - integer + - 'null' + description: Next page number, or null on the last page. + example: 2 + readOnly: true + prev_page: + type: + - integer + - 'null' + description: Previous page number, or null on the first page. + example: + readOnly: true + total_pages: + type: integer + minimum: 0 + description: Total number of pages available. + example: 3 + readOnly: true + total_count: + type: integer + minimum: 0 + description: Total number of matching records. + example: 42 + readOnly: true + additionalProperties: false + title: Pagination + Payment: + type: object + description: A payment received by the company. + required: + - id + - hashid + - reference + - formatted_amount + - amount + - currency + - refund_amount + - amount_paid + - amount_without_fees + - vat_included + - vat_rate + - vat_amount + - ex_vat_amount + - purchased_qty + - company_id + - card_brand + - card_last4 + - secure_token + - status + - success + - stripe_charge_id + - gateway_url + - gocardless_payment_id + - object_name + - failed_attempts + - usd_amount_in_cents + - custom_fields + - provider + - application_fee + - gateway_fee + - last_error_message + - coupon_code + - discount_percent + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique payment ID. + example: 101 + readOnly: true + hashid: + type: string + description: Public opaque payment identifier. + example: pay_7Yx2K9 + readOnly: true + reference: + type: + - string + - 'null' + description: Merchant-provided payment reference. + example: ORDER-1001 + readOnly: true + formatted_amount: + type: string + description: Localized display amount. + example: "£30.00" + readOnly: true + amount: + type: number + description: Original amount in major currency units. + example: 30.0 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + refund_amount: + type: number + description: Total amount refunded in major currency units. + example: 0.0 + minimum: 0 + readOnly: true + amount_paid: + type: number + description: Amount remaining after refunds. + example: 30.0 + readOnly: true + amount_without_fees: + type: number + description: Amount after processor and application fees. + example: 28.8 + readOnly: true + vat_included: + type: + - boolean + - 'null' + description: Whether the amount includes VAT. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: VAT percentage; historical values may be strings. + example: 20 + readOnly: true + vat_amount: + type: number + description: VAT amount in major currency units. + example: 5.0 + readOnly: true + ex_vat_amount: + type: number + description: Amount before VAT in major currency units. + example: 25.0 + readOnly: true + purchased_qty: + type: integer + description: Quantity purchased. + example: 1 + minimum: 1 + readOnly: true + company_id: + type: integer + description: Company that received the payment. + example: 12 + readOnly: true + card_brand: + type: + - string + - 'null' + description: Payment card brand. + example: visa + readOnly: true + card_last4: + type: + - string + - 'null' + description: Last four card digits. + example: '4242' + pattern: "^[0-9]{4}$" + readOnly: true + secure_token: + type: string + description: Opaque token for customer-facing payment access. + example: example-payment-token + readOnly: true + status: + type: string + description: Payment processing status. + example: success + enum: + - pending + - success + - part_refund + - full_refund + - future + - failed + readOnly: true + success: + type: boolean + description: Whether the payment is successful or partially refunded. + example: true + readOnly: true + stripe_charge_id: + type: + - string + - 'null' + description: Stripe charge ID. + example: ch_example + readOnly: true + gateway_url: + type: + - string + - 'null' + description: Provider-hosted payment URL, when applicable. + example: + readOnly: true + gocardless_payment_id: + type: + - string + - 'null' + description: GoCardless payment ID. + example: + readOnly: true + object_name: + type: + - string + - 'null' + description: Display name of the purchased resource. + example: Consulting session + readOnly: true + failed_attempts: + type: integer + description: Number of failed collection attempts. + example: 0 + minimum: 0 + readOnly: true + usd_amount_in_cents: + type: + - integer + - 'null' + description: Payment value converted to US cents. + example: 3800 + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + provider: + type: string + description: Payment provider. + example: stripe + readOnly: true + application_fee: + type: + - number + - 'null' + description: PayHere application fee in major currency units. + example: 0.6 + readOnly: true + gateway_fee: + type: + - number + - 'null' + description: Processor fee in major currency units. + example: 0.6 + readOnly: true + last_error_message: + type: + - string + - 'null' + description: Most recent processor error message. + example: + readOnly: true + coupon_code: + type: + - string + - 'null' + description: Applied coupon code. + example: + readOnly: true + discount_percent: + type: + - string + - number + - 'null' + description: Applied percentage discount; historical values may be strings. + example: + readOnly: true + created_at: + type: string + description: When the payment was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: payments + const: payments + readOnly: true + additionalProperties: false + title: Payment + PaymentDetailed: + type: object + description: A payment with its customer, purchased item, and subscription when + present. + required: + - id + - hashid + - reference + - formatted_amount + - amount + - currency + - refund_amount + - amount_paid + - amount_without_fees + - vat_included + - vat_rate + - vat_amount + - ex_vat_amount + - purchased_qty + - company_id + - card_brand + - card_last4 + - secure_token + - status + - success + - stripe_charge_id + - gateway_url + - gocardless_payment_id + - object_name + - failed_attempts + - usd_amount_in_cents + - custom_fields + - provider + - application_fee + - gateway_fee + - last_error_message + - coupon_code + - discount_percent + - created_at + - updated_at + - type + - customer + - item + properties: + id: + type: integer + description: Unique payment ID. + example: 101 + readOnly: true + hashid: + type: string + description: Public opaque payment identifier. + example: pay_7Yx2K9 + readOnly: true + reference: + type: + - string + - 'null' + description: Merchant-provided payment reference. + example: ORDER-1001 + readOnly: true + formatted_amount: + type: string + description: Localized display amount. + example: "£30.00" + readOnly: true + amount: + type: number + description: Original amount in major currency units. + example: 30.0 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + refund_amount: + type: number + description: Total amount refunded in major currency units. + example: 0.0 + minimum: 0 + readOnly: true + amount_paid: + type: number + description: Amount remaining after refunds. + example: 30.0 + readOnly: true + amount_without_fees: + type: number + description: Amount after processor and application fees. + example: 28.8 + readOnly: true + vat_included: + type: + - boolean + - 'null' + description: Whether the amount includes VAT. + example: true + readOnly: true + vat_rate: + type: + - string + - number + - 'null' + description: VAT percentage; historical values may be strings. + example: 20 + readOnly: true + vat_amount: + type: number + description: VAT amount in major currency units. + example: 5.0 + readOnly: true + ex_vat_amount: + type: number + description: Amount before VAT in major currency units. + example: 25.0 + readOnly: true + purchased_qty: + type: integer + description: Quantity purchased. + example: 1 + minimum: 1 + readOnly: true + company_id: + type: integer + description: Company that received the payment. + example: 12 + readOnly: true + card_brand: + type: + - string + - 'null' + description: Payment card brand. + example: visa + readOnly: true + card_last4: + type: + - string + - 'null' + description: Last four card digits. + example: '4242' + pattern: "^[0-9]{4}$" + readOnly: true + secure_token: + type: string + description: Opaque token for customer-facing payment access. + example: example-payment-token + readOnly: true + status: + type: string + description: Payment processing status. + example: success + enum: + - pending + - success + - part_refund + - full_refund + - future + - failed + readOnly: true + success: + type: boolean + description: Whether the payment is successful or partially refunded. + example: true + readOnly: true + stripe_charge_id: + type: + - string + - 'null' + description: Stripe charge ID. + example: ch_example + readOnly: true + gateway_url: + type: + - string + - 'null' + description: Provider-hosted payment URL, when applicable. + example: + readOnly: true + gocardless_payment_id: + type: + - string + - 'null' + description: GoCardless payment ID. + example: + readOnly: true + object_name: + type: + - string + - 'null' + description: Display name of the purchased resource. + example: Consulting session + readOnly: true + failed_attempts: + type: integer + description: Number of failed collection attempts. + example: 0 + minimum: 0 + readOnly: true + usd_amount_in_cents: + type: + - integer + - 'null' + description: Payment value converted to US cents. + example: 3800 + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + provider: + type: string + description: Payment provider. + example: stripe + readOnly: true + application_fee: + type: + - number + - 'null' + description: PayHere application fee in major currency units. + example: 0.6 + readOnly: true + gateway_fee: + type: + - number + - 'null' + description: Processor fee in major currency units. + example: 0.6 + readOnly: true + last_error_message: + type: + - string + - 'null' + description: Most recent processor error message. + example: + readOnly: true + coupon_code: + type: + - string + - 'null' + description: Applied coupon code. + example: + readOnly: true + discount_percent: + type: + - string + - number + - 'null' + description: Applied percentage discount; historical values may be strings. + example: + readOnly: true + created_at: + type: string + description: When the payment was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: payments + const: payments + readOnly: true + customer: + description: Customer who made the payment, or null when unavailable. + anyOf: + - "$ref": "#/components/schemas/CustomerDetailed" + - type: 'null' + readOnly: true + item: + type: + - object + - 'null' + description: Purchased resource. Its shape varies by resource type. + example: + id: 42 + type: plans + name: Consulting session + additionalProperties: true + readOnly: true + subscription: + description: Related subscription, or null/omitted for one-off payments. + anyOf: + - "$ref": "#/components/schemas/Subscription" + - type: 'null' + readOnly: true + additionalProperties: false + title: PaymentDetailed + PaymentListResponse: + type: object + description: Paginated detailed payment response. + required: + - data + - meta + properties: + data: + type: array + description: Payments in the requested page. + items: + "$ref": "#/components/schemas/PaymentDetailed" + readOnly: true + meta: + "$ref": "#/components/schemas/Pagination" + description: Pagination details. + readOnly: true + examples: + - data: + - id: 101 + hashid: pay_7Yx2K9 + reference: ORDER-1001 + formatted_amount: "£30.00" + amount: 30.0 + currency: gbp + refund_amount: 0.0 + amount_paid: 30.0 + amount_without_fees: 28.8 + vat_included: true + vat_rate: 20 + vat_amount: 5.0 + ex_vat_amount: 25.0 + purchased_qty: 1 + company_id: 12 + card_brand: visa + card_last4: '4242' + secure_token: example-payment-token + status: success + success: true + stripe_charge_id: ch_example + gateway_url: + gocardless_payment_id: + object_name: Consulting session + failed_attempts: 0 + usd_amount_in_cents: 3800 + custom_fields: + company_size: 10-20 + provider: stripe + application_fee: 0.6 + gateway_fee: 0.6 + last_error_message: + coupon_code: + discount_percent: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: payments + customer: + id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + item: + id: 42 + type: plans + name: Consulting session + subscription: + meta: + current_page: 1 + next_page: 2 + prev_page: + total_pages: 3 + total_count: 42 + additionalProperties: false + title: PaymentListResponse + PaymentResponse: + type: object + description: Detailed payment response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/PaymentDetailed" + description: The requested payment. + readOnly: true + examples: + - data: + id: 101 + hashid: pay_7Yx2K9 + reference: ORDER-1001 + formatted_amount: "£30.00" + amount: 30.0 + currency: gbp + refund_amount: 0.0 + amount_paid: 30.0 + amount_without_fees: 28.8 + vat_included: true + vat_rate: 20 + vat_amount: 5.0 + ex_vat_amount: 25.0 + purchased_qty: 1 + company_id: 12 + card_brand: visa + card_last4: '4242' + secure_token: example-payment-token + status: success + success: true + stripe_charge_id: ch_example + gateway_url: + gocardless_payment_id: + object_name: Consulting session + failed_attempts: 0 + usd_amount_in_cents: 3800 + custom_fields: + company_size: 10-20 + provider: stripe + application_fee: 0.6 + gateway_fee: 0.6 + last_error_message: + coupon_code: + discount_percent: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: payments + customer: + id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + item: + id: 42 + type: plans + name: Consulting session + subscription: + additionalProperties: false + title: PaymentResponse + Plan: + type: object + description: A reusable PayHere payment link. + required: + - id + - payment_type + - name + - description + - price + - price_in_cents + - currency + - slug + - billing_interval + - billing_interval_count + - hidden + - min_billing_cycles + - billing_day + - limited_qty + - qty + - cancel_after + - success_url + - trial_period_days + - show_qty + - custom_fields + - user_selects_amount + - pay_button_text + - setup_fee + - has_setup_fee + - allow_coupons + - plan_url + - donation_mode + - show_preset_amounts + - donation_preset_amounts_in_cents + - digital_download + - download_type + - download_url + - download_file_url + - download_file_name + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique payment-link ID. + example: 42 + readOnly: true + payment_type: + type: string + description: Default payment schedule. + example: recurring + enum: + - recurring + - one_off + readOnly: true + name: + type: string + description: Customer-facing payment-link name. + example: Consulting membership + readOnly: true + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + readOnly: true + price: + type: number + description: Price in major currency units; zero for pay-what-you-want links + without a fixed price. + example: 30.0 + minimum: 0 + readOnly: true + price_in_cents: + type: integer + description: Price in the currency's smallest unit. + example: 3000 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + slug: + type: string + description: URL-safe payment-link identifier. + example: consulting-membership + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval; null for one-off links. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of billing intervals between charges. + example: 1 + minimum: 1 + readOnly: true + hidden: + type: boolean + description: Whether the link is hidden from storefronts. + example: false + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful billing cycles before cancellation is allowed. + example: + minimum: 1 + readOnly: true + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: 1-7 for weeks, 1-28 for months and + derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + readOnly: true + limited_qty: + type: boolean + description: Whether stock is limited. + example: false + readOnly: true + qty: + type: integer + description: Remaining quantity when stock is limited. + example: 0 + minimum: 0 + readOnly: true + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which a payment plan ends. + example: + minimum: 1 + readOnly: true + success_url: + type: + - string + - 'null' + description: URL customers are sent to after successful checkout. + example: https://example.com/thanks + format: uri + readOnly: true + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days. + example: + minimum: 1 + readOnly: true + show_qty: + type: boolean + description: Whether customers can select a quantity. + example: false + readOnly: true + custom_fields: + type: array + description: Additional fields collected during checkout. + example: [] + items: + "$ref": "#/components/schemas/CustomField" + readOnly: true + user_selects_amount: + type: boolean + description: Whether the customer chooses the payment amount. + example: false + readOnly: true + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + readOnly: true + setup_fee: + type: number + description: One-time setup fee in major currency units. + example: 0.0 + minimum: 0 + readOnly: true + has_setup_fee: + type: boolean + description: Whether a positive setup fee is configured. + example: false + readOnly: true + allow_coupons: + type: boolean + description: Whether checkout accepts coupon codes. + example: true + readOnly: true + donation_mode: + type: + - string + - 'null' + description: Schedules offered by a pay-what-you-want link. + example: + enum: + - recurring + - one_off + - both + - + readOnly: true + show_preset_amounts: + type: boolean + description: Whether donation amount presets are shown. + example: false + readOnly: true + donation_preset_amounts_in_cents: + type: + - array + - 'null' + description: Three increasing donation presets in the currency's smallest + unit. + example: + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + readOnly: true + plan_url: + type: string + description: Public checkout URL. + example: https://payhere.co/example-studio/consulting-membership + format: uri + readOnly: true + digital_download: + type: boolean + description: Whether successful customers receive a digital download. + example: false + readOnly: true + download_type: + type: + - string + - 'null' + description: How the digital download is delivered. + example: upload + enum: + - upload + - url + - + readOnly: true + download_url: + type: + - string + - 'null' + description: External download URL for url-based downloads. + example: + format: uri + readOnly: true + download_file_url: + type: + - string + - 'null' + description: Relative URL for an uploaded download file. + example: + readOnly: true + download_file_name: + type: + - string + - 'null' + description: Original name of the uploaded download file. + example: + readOnly: true + created_at: + type: string + description: When the payment link was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment link was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: plans + const: plans + readOnly: true + additionalProperties: false + title: Plan + PlanCreateMultipartRequest: + type: object + description: Payment-link attributes submitted as multipart form data, including + an uploaded digital download. + required: + - name + properties: + payment_type: + type: string + description: Default payment schedule. + example: recurring + enum: + - recurring + - one_off + default: recurring + name: + type: string + description: Customer-facing name. + example: Consulting membership + minLength: 1 + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + receipt_text: + type: + - string + - 'null' + description: Custom text included on receipts. + example: Thank you for your payment. + price: + type: + - number + - 'null' + description: Price in major currency units. Required unless user_selects_amount + is true. + example: 30 + minimum: 1 + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + default: gbp + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + default: month + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + default: 1 + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which the plan ends. + example: + minimum: 1 + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days; used only when recurring payments + are offered. + example: + minimum: 1 + hidden: + type: boolean + description: Hide the link from storefronts. + example: false + default: false + limited_qty: + type: boolean + description: Enable stock limits. + example: false + default: false + qty: + type: + - integer + - 'null' + description: Available quantity when limited_qty is true. + example: 25 + minimum: 0 + show_qty: + type: boolean + description: Allow customers to choose a quantity. + example: false + default: false + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: use 1-7 for weeks, 1-28 for months + and derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + success_url: + type: + - string + - 'null' + description: URL used after successful checkout. + example: https://example.com/thanks + format: uri + user_selects_amount: + type: boolean + description: Allow the customer to choose the amount. + example: false + default: false + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + setup_fee: + type: + - number + - 'null' + description: One-time setup fee in major currency units. + example: 10 + minimum: 0 + allow_coupons: + type: boolean + description: Allow coupon codes at checkout. + example: true + default: false + digital_download: + type: boolean + description: Deliver digital content after successful payment. + example: false + default: false + download_type: + type: + - string + - 'null' + description: Use upload for an attached file or url for an external link. + example: url + enum: + - upload + - url + - + default: upload + download_url: + type: + - string + - 'null' + description: Required when digital_download is true and download_type is + url. + example: https://example.com/download.zip + format: uri + custom_fields: + description: Additional checkout fields. Multipart clients may submit the + array as JSON text. + anyOf: + - type: array + items: + "$ref": "#/components/schemas/CustomField" + - type: string + contentMediaType: application/json + example: + - label: Company name + type: text + required: true + hidden: false + donation_mode: + type: + - string + - 'null' + description: Payment schedules offered when user_selects_amount is true. + example: both + enum: + - recurring + - one_off + - both + - + show_preset_amounts: + type: boolean + description: Show three suggested donation amounts. + example: true + default: false + donation_preset_amounts_in_cents: + type: array + description: Three unique, increasing suggested amounts in the currency's + smallest unit. + example: + - 2000 + - 5000 + - 10000 + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + uniqueItems: true + download_file: + type: string + format: binary + description: File delivered after payment when digital_download is true + and download_type is upload. + anyOf: + - required: + - price + properties: + price: + type: number + - required: + - user_selects_amount + properties: + user_selects_amount: + const: true + examples: + - payment_type: recurring + name: Consulting membership + price: 30 + currency: gbp + billing_interval: month + - payment_type: one_off + name: Community appeal + currency: gbp + user_selects_amount: true + donation_mode: both + - payment_type: one_off + name: Example ebook + price: 15 + currency: gbp + digital_download: true + download_type: upload + download_file: "" + additionalProperties: false + title: PlanCreateMultipartRequest + PlanCreateRequest: + type: object + description: Attributes for a new payment link. Price is optional only when + the customer selects the amount. + required: + - name + properties: + payment_type: + type: string + description: Default payment schedule. + example: recurring + enum: + - recurring + - one_off + default: recurring + name: + type: string + description: Customer-facing name. + example: Consulting membership + minLength: 1 + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + receipt_text: + type: + - string + - 'null' + description: Custom text included on receipts. + example: Thank you for your payment. + price: + type: + - number + - 'null' + description: Price in major currency units. Required unless user_selects_amount + is true. + example: 30 + minimum: 1 + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + default: gbp + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + default: month + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + default: 1 + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which the plan ends. + example: + minimum: 1 + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days; used only when recurring payments + are offered. + example: + minimum: 1 + hidden: + type: boolean + description: Hide the link from storefronts. + example: false + default: false + limited_qty: + type: boolean + description: Enable stock limits. + example: false + default: false + qty: + type: + - integer + - 'null' + description: Available quantity when limited_qty is true. + example: 25 + minimum: 0 + show_qty: + type: boolean + description: Allow customers to choose a quantity. + example: false + default: false + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: use 1-7 for weeks, 1-28 for months + and derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + success_url: + type: + - string + - 'null' + description: URL used after successful checkout. + example: https://example.com/thanks + format: uri + user_selects_amount: + type: boolean + description: Allow the customer to choose the amount. + example: false + default: false + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + setup_fee: + type: + - number + - 'null' + description: One-time setup fee in major currency units. + example: 10 + minimum: 0 + allow_coupons: + type: boolean + description: Allow coupon codes at checkout. + example: true + default: false + digital_download: + type: boolean + description: Deliver digital content after successful payment. + example: false + default: false + download_type: + type: + - string + - 'null' + description: Use upload for an attached file or url for an external link. + example: url + enum: + - upload + - url + - + default: upload + download_url: + type: + - string + - 'null' + description: Required when digital_download is true and download_type is + url. + example: https://example.com/download.zip + format: uri + custom_fields: + description: Additional checkout fields. Multipart clients may submit the + array as JSON text. + anyOf: + - type: array + items: + "$ref": "#/components/schemas/CustomField" + - type: string + contentMediaType: application/json + example: + - label: Company name + type: text + required: true + hidden: false + donation_mode: + type: + - string + - 'null' + description: Payment schedules offered when user_selects_amount is true. + example: both + enum: + - recurring + - one_off + - both + - + show_preset_amounts: + type: boolean + description: Show three suggested donation amounts. + example: true + default: false + donation_preset_amounts_in_cents: + type: array + description: Three unique, increasing suggested amounts in the currency's + smallest unit. + example: + - 2000 + - 5000 + - 10000 + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + uniqueItems: true + anyOf: + - required: + - price + properties: + price: + type: number + - required: + - user_selects_amount + properties: + user_selects_amount: + const: true + examples: + - payment_type: recurring + name: Consulting membership + price: 30 + currency: gbp + billing_interval: month + - payment_type: one_off + name: Community appeal + currency: gbp + user_selects_amount: true + donation_mode: both + additionalProperties: false + title: PlanCreateRequest + PlanDetailed: + type: object + description: A payment link with merchant-only configuration and company details. + required: + - id + - payment_type + - name + - description + - price + - price_in_cents + - currency + - slug + - billing_interval + - billing_interval_count + - hidden + - min_billing_cycles + - billing_day + - limited_qty + - qty + - cancel_after + - success_url + - trial_period_days + - show_qty + - custom_fields + - user_selects_amount + - pay_button_text + - setup_fee + - has_setup_fee + - allow_coupons + - plan_url + - donation_mode + - show_preset_amounts + - donation_preset_amounts_in_cents + - digital_download + - download_type + - download_url + - download_file_url + - download_file_name + - created_at + - updated_at + - type + - receipt_text + - webhook_url + - company + properties: + id: + type: integer + description: Unique payment-link ID. + example: 42 + readOnly: true + payment_type: + type: string + description: Default payment schedule. + example: recurring + enum: + - recurring + - one_off + readOnly: true + name: + type: string + description: Customer-facing payment-link name. + example: Consulting membership + readOnly: true + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + readOnly: true + price: + type: number + description: Price in major currency units; zero for pay-what-you-want links + without a fixed price. + example: 30.0 + minimum: 0 + readOnly: true + price_in_cents: + type: integer + description: Price in the currency's smallest unit. + example: 3000 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + slug: + type: string + description: URL-safe payment-link identifier. + example: consulting-membership + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval; null for one-off links. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of billing intervals between charges. + example: 1 + minimum: 1 + readOnly: true + hidden: + type: boolean + description: Whether the link is hidden from storefronts. + example: false + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful billing cycles before cancellation is allowed. + example: + minimum: 1 + readOnly: true + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: 1-7 for weeks, 1-28 for months and + derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + readOnly: true + limited_qty: + type: boolean + description: Whether stock is limited. + example: false + readOnly: true + qty: + type: integer + description: Remaining quantity when stock is limited. + example: 0 + minimum: 0 + readOnly: true + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which a payment plan ends. + example: + minimum: 1 + readOnly: true + success_url: + type: + - string + - 'null' + description: URL customers are sent to after successful checkout. + example: https://example.com/thanks + format: uri + readOnly: true + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days. + example: + minimum: 1 + readOnly: true + show_qty: + type: boolean + description: Whether customers can select a quantity. + example: false + readOnly: true + custom_fields: + type: array + description: Additional fields collected during checkout. + example: [] + items: + "$ref": "#/components/schemas/CustomField" + readOnly: true + user_selects_amount: + type: boolean + description: Whether the customer chooses the payment amount. + example: false + readOnly: true + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + readOnly: true + setup_fee: + type: number + description: One-time setup fee in major currency units. + example: 0.0 + minimum: 0 + readOnly: true + has_setup_fee: + type: boolean + description: Whether a positive setup fee is configured. + example: false + readOnly: true + allow_coupons: + type: boolean + description: Whether checkout accepts coupon codes. + example: true + readOnly: true + donation_mode: + type: + - string + - 'null' + description: Schedules offered by a pay-what-you-want link. + example: + enum: + - recurring + - one_off + - both + - + readOnly: true + show_preset_amounts: + type: boolean + description: Whether donation amount presets are shown. + example: false + readOnly: true + donation_preset_amounts_in_cents: + type: + - array + - 'null' + description: Three increasing donation presets in the currency's smallest + unit. + example: + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + readOnly: true + plan_url: + type: string + description: Public checkout URL. + example: https://payhere.co/example-studio/consulting-membership + format: uri + readOnly: true + digital_download: + type: boolean + description: Whether successful customers receive a digital download. + example: false + readOnly: true + download_type: + type: + - string + - 'null' + description: How the digital download is delivered. + example: upload + enum: + - upload + - url + - + readOnly: true + download_url: + type: + - string + - 'null' + description: External download URL for url-based downloads. + example: + format: uri + readOnly: true + download_file_url: + type: + - string + - 'null' + description: Relative URL for an uploaded download file. + example: + readOnly: true + download_file_name: + type: + - string + - 'null' + description: Original name of the uploaded download file. + example: + readOnly: true + created_at: + type: string + description: When the payment link was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment link was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: plans + const: plans + readOnly: true + receipt_text: + type: + - string + - 'null' + description: Custom text included on payment receipts. + example: Thank you for your payment. + readOnly: true + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + readOnly: true + company: + "$ref": "#/components/schemas/CompanyEmbeddedDetailed" + description: Company that owns the payment link. + readOnly: true + additionalProperties: false + title: PlanDetailed + PlanEmbeddedDetailed: + type: object + description: Payment-link details embedded in another resource. + required: + - id + - payment_type + - name + - description + - price + - price_in_cents + - currency + - slug + - billing_interval + - billing_interval_count + - hidden + - min_billing_cycles + - billing_day + - limited_qty + - qty + - cancel_after + - success_url + - trial_period_days + - show_qty + - custom_fields + - user_selects_amount + - pay_button_text + - setup_fee + - has_setup_fee + - allow_coupons + - plan_url + - donation_mode + - show_preset_amounts + - donation_preset_amounts_in_cents + - digital_download + - download_type + - download_url + - download_file_url + - download_file_name + - created_at + - updated_at + - type + - receipt_text + - webhook_url + properties: + id: + type: integer + description: Unique payment-link ID. + example: 42 + readOnly: true + payment_type: + type: string + description: Default payment schedule. + example: recurring + enum: + - recurring + - one_off + readOnly: true + name: + type: string + description: Customer-facing payment-link name. + example: Consulting membership + readOnly: true + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + readOnly: true + price: + type: number + description: Price in major currency units; zero for pay-what-you-want links + without a fixed price. + example: 30.0 + minimum: 0 + readOnly: true + price_in_cents: + type: integer + description: Price in the currency's smallest unit. + example: 3000 + minimum: 0 + readOnly: true + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + slug: + type: string + description: URL-safe payment-link identifier. + example: consulting-membership + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval; null for one-off links. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of billing intervals between charges. + example: 1 + minimum: 1 + readOnly: true + hidden: + type: boolean + description: Whether the link is hidden from storefronts. + example: false + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful billing cycles before cancellation is allowed. + example: + minimum: 1 + readOnly: true + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: 1-7 for weeks, 1-28 for months and + derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + readOnly: true + limited_qty: + type: boolean + description: Whether stock is limited. + example: false + readOnly: true + qty: + type: integer + description: Remaining quantity when stock is limited. + example: 0 + minimum: 0 + readOnly: true + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which a payment plan ends. + example: + minimum: 1 + readOnly: true + success_url: + type: + - string + - 'null' + description: URL customers are sent to after successful checkout. + example: https://example.com/thanks + format: uri + readOnly: true + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days. + example: + minimum: 1 + readOnly: true + show_qty: + type: boolean + description: Whether customers can select a quantity. + example: false + readOnly: true + custom_fields: + type: array + description: Additional fields collected during checkout. + example: [] + items: + "$ref": "#/components/schemas/CustomField" + readOnly: true + user_selects_amount: + type: boolean + description: Whether the customer chooses the payment amount. + example: false + readOnly: true + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + readOnly: true + setup_fee: + type: number + description: One-time setup fee in major currency units. + example: 0.0 + minimum: 0 + readOnly: true + has_setup_fee: + type: boolean + description: Whether a positive setup fee is configured. + example: false + readOnly: true + allow_coupons: + type: boolean + description: Whether checkout accepts coupon codes. + example: true + readOnly: true + donation_mode: + type: + - string + - 'null' + description: Schedules offered by a pay-what-you-want link. + example: + enum: + - recurring + - one_off + - both + - + readOnly: true + show_preset_amounts: + type: boolean + description: Whether donation amount presets are shown. + example: false + readOnly: true + donation_preset_amounts_in_cents: + type: + - array + - 'null' + description: Three increasing donation presets in the currency's smallest + unit. + example: + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + readOnly: true + plan_url: + type: string + description: Public checkout URL. + example: https://payhere.co/example-studio/consulting-membership + format: uri + readOnly: true + digital_download: + type: boolean + description: Whether successful customers receive a digital download. + example: false + readOnly: true + download_type: + type: + - string + - 'null' + description: How the digital download is delivered. + example: upload + enum: + - upload + - url + - + readOnly: true + download_url: + type: + - string + - 'null' + description: External download URL for url-based downloads. + example: + format: uri + readOnly: true + download_file_url: + type: + - string + - 'null' + description: Relative URL for an uploaded download file. + example: + readOnly: true + download_file_name: + type: + - string + - 'null' + description: Original name of the uploaded download file. + example: + readOnly: true + created_at: + type: string + description: When the payment link was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the payment link was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: plans + const: plans + readOnly: true + receipt_text: + type: + - string + - 'null' + description: Custom text included on payment receipts. + example: Thank you for your payment. + readOnly: true + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + readOnly: true + additionalProperties: false + title: PlanEmbeddedDetailed + PlanListResponse: + type: object + description: Paginated detailed payment-link response. + required: + - data + - meta + properties: + data: + type: array + description: Payment links in the requested page. + items: + "$ref": "#/components/schemas/PlanDetailed" + readOnly: true + meta: + "$ref": "#/components/schemas/Pagination" + description: Pagination details. + readOnly: true + examples: + - data: + - id: 42 + payment_type: recurring + name: Consulting membership + description: Monthly access to consulting sessions. + price: 30.0 + price_in_cents: 3000 + currency: gbp + slug: consulting-membership + billing_interval: month + billing_interval_count: 1 + hidden: false + min_billing_cycles: + billing_day: + limited_qty: false + qty: 0 + cancel_after: + success_url: https://example.com/thanks + trial_period_days: + show_qty: false + custom_fields: [] + user_selects_amount: false + pay_button_text: Subscribe + setup_fee: 0.0 + has_setup_fee: false + allow_coupons: true + donation_mode: + show_preset_amounts: false + donation_preset_amounts_in_cents: + plan_url: https://payhere.co/example-studio/consulting-membership + digital_download: false + download_type: upload + download_url: + download_file_url: + download_file_name: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: plans + receipt_text: Thank you for your payment. + webhook_url: https://example.com/payhere-webhook + company: + id: 12 + name: Example Studio + legal_name: Example Studio Ltd + slug: example-studio + ready: true + country_code: GB + button_color: "#2563EB" + button_text: white + role: standard + stripe_connected: true + gocardless_connected: false + currency: gbp + vat_registered: true + vat_rate: 20 + small_logo_url: "/rails/active_storage/representations/example-logo.png" + facebook_pixel_id: + ga_tracking_id: + recaptcha_enabled: false + avatar_url: https://example.com/avatar.png + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: companies + plan: growth + plan_interval: month + subscription_status: active + active_until: + support_email: support@example.com + website: https://example.com + address: 1 Example Street, London + vat_registration_number: GB123456789 + vat_mechanism: flat_rate + custom_domain: + meta: + current_page: 1 + next_page: 2 + prev_page: + total_pages: 3 + total_count: 42 + additionalProperties: false + title: PlanListResponse + PlanResponse: + type: object + description: Payment-link response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/Plan" + description: The created or updated payment link. + readOnly: true + examples: + - data: + id: 42 + payment_type: recurring + name: Consulting membership + description: Monthly access to consulting sessions. + price: 30.0 + price_in_cents: 3000 + currency: gbp + slug: consulting-membership + billing_interval: month + billing_interval_count: 1 + hidden: false + min_billing_cycles: + billing_day: + limited_qty: false + qty: 0 + cancel_after: + success_url: https://example.com/thanks + trial_period_days: + show_qty: false + custom_fields: [] + user_selects_amount: false + pay_button_text: Subscribe + setup_fee: 0.0 + has_setup_fee: false + allow_coupons: true + donation_mode: + show_preset_amounts: false + donation_preset_amounts_in_cents: + plan_url: https://payhere.co/example-studio/consulting-membership + digital_download: false + download_type: upload + download_url: + download_file_url: + download_file_name: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: plans + additionalProperties: false + title: PlanResponse + PlanUpdateMultipartRequest: + type: object + description: Payment-link updates submitted as multipart form data, including + a replacement download file. + properties: + name: + type: string + description: Customer-facing name. + example: Consulting membership + minLength: 1 + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + receipt_text: + type: + - string + - 'null' + description: Custom text included on receipts. + example: Thank you for your payment. + price: + type: + - number + - 'null' + description: Price in major currency units. Required unless user_selects_amount + is true. + example: 30 + minimum: 1 + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + default: gbp + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + default: month + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + default: 1 + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which the plan ends. + example: + minimum: 1 + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days; used only when recurring payments + are offered. + example: + minimum: 1 + hidden: + type: boolean + description: Hide the link from storefronts. + example: false + default: false + limited_qty: + type: boolean + description: Enable stock limits. + example: false + default: false + qty: + type: + - integer + - 'null' + description: Available quantity when limited_qty is true. + example: 25 + minimum: 0 + show_qty: + type: boolean + description: Allow customers to choose a quantity. + example: false + default: false + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: use 1-7 for weeks, 1-28 for months + and derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + success_url: + type: + - string + - 'null' + description: URL used after successful checkout. + example: https://example.com/thanks + format: uri + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + setup_fee: + type: + - number + - 'null' + description: One-time setup fee in major currency units. + example: 10 + minimum: 0 + allow_coupons: + type: boolean + description: Allow coupon codes at checkout. + example: true + default: false + download_type: + type: + - string + - 'null' + description: Use upload for an attached file or url for an external link. + example: url + enum: + - upload + - url + - + default: upload + download_url: + type: + - string + - 'null' + description: Required when digital_download is true and download_type is + url. + example: https://example.com/download.zip + format: uri + custom_fields: + description: Additional checkout fields. Multipart clients may submit the + array as JSON text. + anyOf: + - type: array + items: + "$ref": "#/components/schemas/CustomField" + - type: string + contentMediaType: application/json + example: + - label: Company name + type: text + required: true + hidden: false + donation_mode: + type: + - string + - 'null' + description: Payment schedules offered when user_selects_amount is true. + example: both + enum: + - recurring + - one_off + - both + - + show_preset_amounts: + type: boolean + description: Show three suggested donation amounts. + example: true + default: false + donation_preset_amounts_in_cents: + type: array + description: Three unique, increasing suggested amounts in the currency's + smallest unit. + example: + - 2000 + - 5000 + - 10000 + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + uniqueItems: true + download_file: + type: string + format: binary + description: Replacement file for an upload-based digital download. + examples: + - name: Updated consulting membership + price: 35 + - download_type: upload + download_file: "" + additionalProperties: false + title: PlanUpdateMultipartRequest + PlanUpdateRequest: + type: object + description: Payment-link attributes to update. Price and currency are applied + only to existing one-off links; recurring schedule fields are applied only + when the existing link supports recurring payments. + properties: + name: + type: string + description: Customer-facing name. + example: Consulting membership + minLength: 1 + description: + type: + - string + - 'null' + description: Customer-facing description. + example: Monthly access to consulting sessions. + receipt_text: + type: + - string + - 'null' + description: Custom text included on receipts. + example: Thank you for your payment. + price: + type: + - number + - 'null' + description: Price in major currency units. Required unless user_selects_amount + is true. + example: 30 + minimum: 1 + currency: + type: string + description: Lowercase ISO 4217 currency code. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + default: gbp + billing_interval: + type: + - string + - 'null' + description: Recurring billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + default: month + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + default: 1 + cancel_after: + type: + - integer + - 'null' + description: Number of billing cycles after which the plan ends. + example: + minimum: 1 + trial_period_days: + type: + - integer + - 'null' + description: Free-trial duration in days; used only when recurring payments + are offered. + example: + minimum: 1 + hidden: + type: boolean + description: Hide the link from storefronts. + example: false + default: false + limited_qty: + type: boolean + description: Enable stock limits. + example: false + default: false + qty: + type: + - integer + - 'null' + description: Available quantity when limited_qty is true. + example: 25 + minimum: 0 + show_qty: + type: boolean + description: Allow customers to choose a quantity. + example: false + default: false + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + billing_day: + type: + - integer + - 'null' + description: 'Recurring billing anchor: use 1-7 for weeks, 1-28 for months + and derived month intervals, or 1-366 for years.' + example: + minimum: 1 + maximum: 366 + success_url: + type: + - string + - 'null' + description: URL used after successful checkout. + example: https://example.com/thanks + format: uri + webhook_url: + type: + - string + - 'null' + description: URL notified for payment-link events. + example: https://example.com/payhere-webhook + format: uri + pay_button_text: + type: + - string + - 'null' + description: Custom checkout button label. + example: Subscribe + setup_fee: + type: + - number + - 'null' + description: One-time setup fee in major currency units. + example: 10 + minimum: 0 + allow_coupons: + type: boolean + description: Allow coupon codes at checkout. + example: true + default: false + download_type: + type: + - string + - 'null' + description: Use upload for an attached file or url for an external link. + example: url + enum: + - upload + - url + - + default: upload + download_url: + type: + - string + - 'null' + description: Required when digital_download is true and download_type is + url. + example: https://example.com/download.zip + format: uri + custom_fields: + description: Additional checkout fields. Multipart clients may submit the + array as JSON text. + anyOf: + - type: array + items: + "$ref": "#/components/schemas/CustomField" + - type: string + contentMediaType: application/json + example: + - label: Company name + type: text + required: true + hidden: false + donation_mode: + type: + - string + - 'null' + description: Payment schedules offered when user_selects_amount is true. + example: both + enum: + - recurring + - one_off + - both + - + show_preset_amounts: + type: boolean + description: Show three suggested donation amounts. + example: true + default: false + donation_preset_amounts_in_cents: + type: array + description: Three unique, increasing suggested amounts in the currency's + smallest unit. + example: + - 2000 + - 5000 + - 10000 + items: + type: integer + minimum: 100 + minItems: 3 + maxItems: 3 + uniqueItems: true + examples: + - name: Updated consulting membership + price: 35 + additionalProperties: false + title: PlanUpdateRequest + RefundRequest: + type: object + description: A full or partial refund against an existing company payment. + required: + - payment_id + - amount + - reason + properties: + payment_id: + type: integer + description: Numeric ID of the payment to refund. + example: 101 + amount: + type: number + description: Amount to refund in major currency units. It cannot exceed + the payment's remaining paid amount. + example: 5.0 + exclusiveMinimum: 0 + reason: + type: string + description: Processor-compatible reason for the refund. + example: requested_by_customer + enum: + - requested_by_customer + - duplicate + - fraudulent + examples: + - payment_id: 101 + amount: 5.0 + reason: requested_by_customer + additionalProperties: false + title: RefundRequest + StatsResponse: + type: object + description: Payment and subscriber totals in the company's configured currency. + required: + - currency + - payments_last_30 + - payments_comparison + - subscribers_last_30 + - subscribers_comparison + - payments_all_time + properties: + currency: + type: string + description: Lowercase currency code used for payment totals. + example: gbp + enum: + - usd + - aed + - all + - amd + - ang + - aud + - awg + - azn + - bam + - bbd + - bdt + - bgn + - bif + - bmd + - bnd + - brl + - bsd + - bwp + - bzd + - cad + - cdf + - chf + - cny + - czk + - dkk + - dop + - dzd + - egp + - etb + - eur + - fjd + - gbp + - gel + - gip + - gmd + - gyd + - hkd + - hrk + - htg + - huf + - idr + - ils + - inr + - isk + - jmd + - jpy + - kes + - kgs + - khr + - kmf + - krw + - kyd + - kzt + - lbp + - lkr + - lrd + - lsl + - mad + - mdl + - mga + - mkd + - mmk + - mnt + - mop + - mro + - mvr + - mwk + - mxn + - myr + - mzn + - nad + - ngn + - nok + - npr + - nzd + - pgk + - php + - pkr + - pln + - qar + - ron + - rsd + - rub + - rwf + - sar + - sbd + - scr + - sek + - sgd + - sll + - sos + - std + - szl + - thb + - tjs + - top + - try + - ttd + - twd + - tzs + - uah + - ugx + - uzs + - vnd + - vuv + - wst + - xaf + - xcd + - yer + - zar + - zmw + readOnly: true + payments_last_30: + type: number + description: Successful payment volume from the last 30 days. + example: 1240.5 + readOnly: true + payments_comparison: + type: number + description: Successful payment volume from the preceding 30-day period. + example: 980.25 + readOnly: true + subscribers_last_30: + type: integer + description: Active subscriptions created in the last 30 days. + example: 18 + readOnly: true + subscribers_comparison: + type: integer + description: Active subscriptions created in the preceding 30-day period. + example: 14 + readOnly: true + payments_all_time: + type: number + description: All-time successful payment volume. + example: 52430.75 + readOnly: true + examples: + - currency: gbp + payments_last_30: 1240.5 + payments_comparison: 980.25 + subscribers_last_30: 18 + subscribers_comparison: 14 + payments_all_time: 52430.75 + additionalProperties: false + title: StatsResponse + Subscription: + type: object + description: A recurring customer subscription. + required: + - id + - customer_id + - last_charged + - next_charge_at + - status + - stripe_subscription_id + - stripe_plan_id + - billing_interval + - plan_id + - provider + - metadata + - custom_fields + - billing_interval_count + - unit_amount_in_cents + - min_billing_cycles + - quantity + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique subscription ID. + example: 77 + readOnly: true + customer_id: + type: + - integer + - 'null' + description: Related customer ID. + example: 24 + readOnly: true + last_charged: + type: + - string + - 'null' + description: When the subscription was most recently charged. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + next_charge_at: + type: + - string + - 'null' + description: Scheduled time of the next charge. + example: '2026-02-15T10:30:00Z' + format: date-time + readOnly: true + status: + type: string + description: Subscription status. + example: active + enum: + - active + - past_due + - pending + - trialing + - cancelled + - canceled + - incomplete + - incomplete_expired + - unpaid + readOnly: true + stripe_subscription_id: + type: + - string + - 'null' + description: Stripe subscription ID. + example: sub_example + readOnly: true + stripe_plan_id: + type: + - string + - 'null' + description: Legacy Stripe plan or price ID. + example: price_example + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + plan_id: + type: + - integer + - 'null' + description: Related payment-link ID. + example: 42 + readOnly: true + provider: + type: string + description: Subscription payment provider. + example: stripe + readOnly: true + metadata: + type: object + description: Provider and billing metadata whose keys vary by subscription. + example: {} + additionalProperties: true + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + readOnly: true + unit_amount_in_cents: + type: + - integer + - 'null' + description: Per-unit recurring amount in the smallest currency unit. + example: 3000 + minimum: 0 + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + readOnly: true + quantity: + type: integer + description: Quantity billed each cycle. + example: 1 + minimum: 1 + readOnly: true + created_at: + type: string + description: When the subscription was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the subscription was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: subscriptions + const: subscriptions + readOnly: true + additionalProperties: false + title: Subscription + SubscriptionDetailed: + type: object + description: A subscription with its customer and payment link. + required: + - id + - customer_id + - last_charged + - next_charge_at + - status + - stripe_subscription_id + - stripe_plan_id + - billing_interval + - plan_id + - provider + - metadata + - custom_fields + - billing_interval_count + - unit_amount_in_cents + - min_billing_cycles + - quantity + - created_at + - updated_at + - type + - customer + - plan + properties: + id: + type: integer + description: Unique subscription ID. + example: 77 + readOnly: true + customer_id: + type: + - integer + - 'null' + description: Related customer ID. + example: 24 + readOnly: true + last_charged: + type: + - string + - 'null' + description: When the subscription was most recently charged. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + next_charge_at: + type: + - string + - 'null' + description: Scheduled time of the next charge. + example: '2026-02-15T10:30:00Z' + format: date-time + readOnly: true + status: + type: string + description: Subscription status. + example: active + enum: + - active + - past_due + - pending + - trialing + - cancelled + - canceled + - incomplete + - incomplete_expired + - unpaid + readOnly: true + stripe_subscription_id: + type: + - string + - 'null' + description: Stripe subscription ID. + example: sub_example + readOnly: true + stripe_plan_id: + type: + - string + - 'null' + description: Legacy Stripe plan or price ID. + example: price_example + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + plan_id: + type: + - integer + - 'null' + description: Related payment-link ID. + example: 42 + readOnly: true + provider: + type: string + description: Subscription payment provider. + example: stripe + readOnly: true + metadata: + type: object + description: Provider and billing metadata whose keys vary by subscription. + example: {} + additionalProperties: true + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + readOnly: true + unit_amount_in_cents: + type: + - integer + - 'null' + description: Per-unit recurring amount in the smallest currency unit. + example: 3000 + minimum: 0 + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + readOnly: true + quantity: + type: integer + description: Quantity billed each cycle. + example: 1 + minimum: 1 + readOnly: true + created_at: + type: string + description: When the subscription was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the subscription was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: subscriptions + const: subscriptions + readOnly: true + customer: + description: Subscribed customer, or null for a deleted association. + anyOf: + - "$ref": "#/components/schemas/CustomerDetailed" + - type: 'null' + readOnly: true + plan: + description: Subscribed payment link, or null if it has been removed. + anyOf: + - "$ref": "#/components/schemas/PlanEmbeddedDetailed" + - type: 'null' + readOnly: true + additionalProperties: false + title: SubscriptionDetailed + SubscriptionListResponse: + type: object + description: Paginated detailed subscription response. + required: + - data + - meta + properties: + data: + type: array + description: Subscriptions in the requested page. + items: + "$ref": "#/components/schemas/SubscriptionDetailed" + readOnly: true + meta: + "$ref": "#/components/schemas/Pagination" + description: Pagination details. + readOnly: true + examples: + - data: + - id: 77 + customer_id: 24 + last_charged: '2026-01-15T10:30:00Z' + next_charge_at: '2026-02-15T10:30:00Z' + status: active + stripe_subscription_id: sub_example + stripe_plan_id: price_example + billing_interval: month + plan_id: 42 + provider: stripe + metadata: {} + custom_fields: + company_size: 10-20 + billing_interval_count: 1 + unit_amount_in_cents: 3000 + min_billing_cycles: + quantity: 1 + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: subscriptions + customer: + id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + plan: + id: 42 + payment_type: recurring + name: Consulting membership + description: Monthly access to consulting sessions. + price: 30.0 + price_in_cents: 3000 + currency: gbp + slug: consulting-membership + billing_interval: month + billing_interval_count: 1 + hidden: false + min_billing_cycles: + billing_day: + limited_qty: false + qty: 0 + cancel_after: + success_url: https://example.com/thanks + trial_period_days: + show_qty: false + custom_fields: [] + user_selects_amount: false + pay_button_text: Subscribe + setup_fee: 0.0 + has_setup_fee: false + allow_coupons: true + donation_mode: + show_preset_amounts: false + donation_preset_amounts_in_cents: + plan_url: https://payhere.co/example-studio/consulting-membership + digital_download: false + download_type: upload + download_url: + download_file_url: + download_file_name: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: plans + receipt_text: Thank you for your payment. + webhook_url: https://example.com/payhere-webhook + meta: + current_page: 1 + next_page: 2 + prev_page: + total_pages: 3 + total_count: 42 + additionalProperties: false + title: SubscriptionListResponse + SubscriptionResponse: + type: object + description: Detailed subscription response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/SubscriptionWithPayments" + description: The requested subscription. + readOnly: true + examples: + - data: + id: 77 + customer_id: 24 + last_charged: '2026-01-15T10:30:00Z' + next_charge_at: '2026-02-15T10:30:00Z' + status: active + stripe_subscription_id: sub_example + stripe_plan_id: price_example + billing_interval: month + plan_id: 42 + provider: stripe + metadata: {} + custom_fields: + company_size: 10-20 + billing_interval_count: 1 + unit_amount_in_cents: 3000 + min_billing_cycles: + quantity: 1 + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: subscriptions + customer: + id: 24 + display_name: Acme Consulting + name: Jamie Taylor + email: jamie@example.com + ip_address: 203.0.113.10 + location: + city: London + country: United Kingdom + company_name: Acme Consulting + company_address: 2 Example Road, London + phone_number: "+44 20 7946 0958" + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: customers + subscriptions: [] + payments: [] + company_customer: + id: 31 + card_brand: visa + card_last4: '4242' + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: company_customers + plan: + id: 42 + payment_type: recurring + name: Consulting membership + description: Monthly access to consulting sessions. + price: 30.0 + price_in_cents: 3000 + currency: gbp + slug: consulting-membership + billing_interval: month + billing_interval_count: 1 + hidden: false + min_billing_cycles: + billing_day: + limited_qty: false + qty: 0 + cancel_after: + success_url: https://example.com/thanks + trial_period_days: + show_qty: false + custom_fields: [] + user_selects_amount: false + pay_button_text: Subscribe + setup_fee: 0.0 + has_setup_fee: false + allow_coupons: true + donation_mode: + show_preset_amounts: false + donation_preset_amounts_in_cents: + plan_url: https://payhere.co/example-studio/consulting-membership + digital_download: false + download_type: upload + download_url: + download_file_url: + download_file_name: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: plans + receipt_text: Thank you for your payment. + webhook_url: https://example.com/payhere-webhook + payments: + - id: 101 + hashid: pay_7Yx2K9 + reference: ORDER-1001 + formatted_amount: "£30.00" + amount: 30.0 + currency: gbp + refund_amount: 0.0 + amount_paid: 30.0 + amount_without_fees: 28.8 + vat_included: true + vat_rate: 20 + vat_amount: 5.0 + ex_vat_amount: 25.0 + purchased_qty: 1 + company_id: 12 + card_brand: visa + card_last4: '4242' + secure_token: example-payment-token + status: success + success: true + stripe_charge_id: ch_example + gateway_url: + gocardless_payment_id: + object_name: Consulting session + failed_attempts: 0 + usd_amount_in_cents: 3800 + custom_fields: + company_size: 10-20 + provider: stripe + application_fee: 0.6 + gateway_fee: 0.6 + last_error_message: + coupon_code: + discount_percent: + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: payments + additionalProperties: false + title: SubscriptionResponse + SubscriptionWithPayments: + type: object + description: A subscription with its customer, payment link, and payment history. + required: + - id + - customer_id + - last_charged + - next_charge_at + - status + - stripe_subscription_id + - stripe_plan_id + - billing_interval + - plan_id + - provider + - metadata + - custom_fields + - billing_interval_count + - unit_amount_in_cents + - min_billing_cycles + - quantity + - created_at + - updated_at + - type + - customer + - plan + - payments + properties: + id: + type: integer + description: Unique subscription ID. + example: 77 + readOnly: true + customer_id: + type: + - integer + - 'null' + description: Related customer ID. + example: 24 + readOnly: true + last_charged: + type: + - string + - 'null' + description: When the subscription was most recently charged. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + next_charge_at: + type: + - string + - 'null' + description: Scheduled time of the next charge. + example: '2026-02-15T10:30:00Z' + format: date-time + readOnly: true + status: + type: string + description: Subscription status. + example: active + enum: + - active + - past_due + - pending + - trialing + - cancelled + - canceled + - incomplete + - incomplete_expired + - unpaid + readOnly: true + stripe_subscription_id: + type: + - string + - 'null' + description: Stripe subscription ID. + example: sub_example + readOnly: true + stripe_plan_id: + type: + - string + - 'null' + description: Legacy Stripe plan or price ID. + example: price_example + readOnly: true + billing_interval: + type: + - string + - 'null' + description: Billing interval. + example: month + enum: + - day + - week + - month + - quarter + - six-months + - year + - + readOnly: true + plan_id: + type: + - integer + - 'null' + description: Related payment-link ID. + example: 42 + readOnly: true + provider: + type: string + description: Subscription payment provider. + example: stripe + readOnly: true + metadata: + type: object + description: Provider and billing metadata whose keys vary by subscription. + example: {} + additionalProperties: true + readOnly: true + custom_fields: + type: object + description: Merchant-defined checkout answers. + example: + company_size: 10-20 + additionalProperties: true + readOnly: true + billing_interval_count: + type: + - integer + - 'null' + description: Number of intervals between charges. + example: 1 + minimum: 1 + readOnly: true + unit_amount_in_cents: + type: + - integer + - 'null' + description: Per-unit recurring amount in the smallest currency unit. + example: 3000 + minimum: 0 + readOnly: true + min_billing_cycles: + type: + - integer + - 'null' + description: Minimum successful cycles before cancellation. + example: + minimum: 1 + readOnly: true + quantity: + type: integer + description: Quantity billed each cycle. + example: 1 + minimum: 1 + readOnly: true + created_at: + type: string + description: When the subscription was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the subscription was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: subscriptions + const: subscriptions + readOnly: true + customer: + description: Subscribed customer, or null for a deleted association. + anyOf: + - "$ref": "#/components/schemas/CustomerDetailed" + - type: 'null' + readOnly: true + plan: + description: Subscribed payment link, or null if it has been removed. + anyOf: + - "$ref": "#/components/schemas/PlanEmbeddedDetailed" + - type: 'null' + readOnly: true + payments: + type: array + description: Payments ordered newest first. + items: + "$ref": "#/components/schemas/Payment" + readOnly: true + additionalProperties: false + title: SubscriptionWithPayments + User: + type: object + description: A PayHere account user. + required: + - id + - display_name + - email + - unconfirmed_email + - role + - email_verified + - company_id + - invitation_accepted + - created_at + - updated_at + - type + properties: + id: + type: integer + description: Unique user ID. + example: 7 + readOnly: true + display_name: + type: string + description: User's display name. + example: Alex Morgan + readOnly: true + email: + type: string + description: User's confirmed email address. + example: alex@example.com + format: email + readOnly: true + unconfirmed_email: + type: + - string + - 'null' + description: Pending replacement email address awaiting confirmation. + example: + format: email + readOnly: true + role: + type: string + description: Application-level access role. + example: admin + enum: + - user + - beta_user + - admin + - superadmin + readOnly: true + email_verified: + type: boolean + description: Whether the email address is confirmed. + example: true + readOnly: true + company_id: + type: + - integer + - 'null' + description: Currently active company ID. + example: 12 + readOnly: true + invitation_accepted: + type: boolean + description: Whether an invitation has been accepted or was not required. + example: true + readOnly: true + created_at: + type: string + description: When the user was created. + example: '2026-01-15T10:30:00Z' + format: date-time + readOnly: true + updated_at: + type: string + description: When the user was last updated. + example: '2026-01-16T09:15:00Z' + format: date-time + readOnly: true + type: + type: string + description: Resource type. + example: users + const: users + readOnly: true + additionalProperties: false + title: User + UserResponse: + type: object + description: Current-user response envelope. + required: + - data + properties: + data: + "$ref": "#/components/schemas/CurrentUser" + description: The authenticated user. + readOnly: true + examples: + - data: + id: 7 + display_name: Alex Morgan + email: alex@example.com + unconfirmed_email: + role: admin + email_verified: true + company_id: 12 + invitation_accepted: true + created_at: '2026-01-15T10:30:00Z' + updated_at: '2026-01-16T09:15:00Z' + type: users + active_company_role: owner + available_companies: + - id: 12 + slug: example-studio + name: Example Studio + additionalProperties: false + title: UserResponse + ValidationError: + type: object + description: Validation errors returned when submitted attributes are invalid. + required: + - error + - validation_errors + - full_errors + - form_errors + properties: + error: + type: string + description: Human-readable explanation of the error. + example: The request could not be completed. + readOnly: true + validation_errors: + type: array + description: Validation messages grouped by field. + readOnly: true + items: + type: object + required: + - field + - errors + properties: + field: + type: string + description: Attribute that failed validation. + example: name + readOnly: true + errors: + type: array + description: Validation messages for the attribute. + items: + type: string + example: + - can't be blank + readOnly: true + additionalProperties: false + full_errors: + type: array + description: Complete validation messages including field names. + items: + type: string + example: + - Name can't be blank + readOnly: true + form_errors: + type: object + description: Field names mapped to messages for displaying beside form inputs. + example: + name: can't be blank + readOnly: true + additionalProperties: + type: string + additionalProperties: false + examples: + - error: Plan validation failed + validation_errors: + - field: name + errors: + - can't be blank + full_errors: + - Name can't be blank + form_errors: + name: can't be blank + title: ValidationError + securitySchemes: + AccessToken: + type: apiKey + name: access_token + in: query + description: PayHere API key passed as a query parameter + BearerAuth: + type: http + scheme: bearer + description: PayHere API key passed as a bearer token +security: [] diff --git a/package.json b/package.json index d2b5e0c..cf447d3 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,13 @@ "version": "0.0.0", "private": true, "scripts": { + "api:clean": "docusaurus clean-api-docs publicV1", + "api:generate": "yarn api:clean && docusaurus gen-api-docs publicV1", + "api:lint": "redocly lint openapi/public_v1.yaml", + "api:sync": "node scripts/sync-openapi.mjs", "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", + "start": "yarn api:generate && docusaurus start", + "build": "yarn api:generate && docusaurus build", "swizzle": "docusaurus swizzle", "clear": "docusaurus clear", "serve": "docusaurus serve", @@ -17,13 +21,18 @@ "@docusaurus/preset-classic": "3.10.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", + "docusaurus-plugin-openapi-docs": "5.2.0", + "docusaurus-plugin-sass": "0.2.6", + "docusaurus-theme-openapi-docs": "5.2.0", "prism-react-renderer": "^2.3.0", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.10.2", - "@docusaurus/types": "3.10.2" + "@docusaurus/types": "3.10.2", + "@redocly/cli": "2.51.0", + "yaml": "2.9.0" }, "browserslist": { "production": [ @@ -38,6 +47,6 @@ ] }, "engines": { - "node": ">=18.0" + "node": "^20.19.0 || >=22.12.0" } } diff --git a/scripts/sync-openapi.mjs b/scripts/sync-openapi.mjs new file mode 100644 index 0000000..d0d7dd1 --- /dev/null +++ b/scripts/sync-openapi.mjs @@ -0,0 +1,91 @@ +import { existsSync } from "node:fs"; +import { mkdir, readFile, rename, writeFile } from "node:fs/promises"; +import path from "node:path"; +import process from "node:process"; +import { fileURLToPath } from "node:url"; + +import YAML from "yaml"; + +const DEFAULT_SPEC_URL = + "https://sandbox.payhere.co/openapi/public_v1.yaml"; +const specUrl = process.env.OPENAPI_SPEC_URL || DEFAULT_SPEC_URL; +const checkOnly = process.argv.includes("--check"); +const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)); +const snapshotPath = path.resolve( + scriptDirectory, + "../openapi/public_v1.yaml", +); + +function canonicalize(value) { + if (Array.isArray(value)) { + return value.map(canonicalize); + } + + if (value && typeof value === "object") { + return Object.fromEntries( + Object.keys(value) + .sort() + .map((key) => [key, canonicalize(value[key])]), + ); + } + + return value; +} + +function semanticSignature(source, label) { + let document; + + try { + document = YAML.parse(source); + } catch (error) { + throw new Error(`${label} is not valid YAML: ${error.message}`); + } + + if (document?.openapi !== "3.1.0") { + throw new Error( + `${label} declares OpenAPI ${document?.openapi ?? "unknown"}; expected 3.1.0`, + ); + } + + return JSON.stringify(canonicalize(document)); +} + +const response = await fetch(specUrl, { + headers: { Accept: "application/yaml, text/yaml;q=0.9" }, +}); + +if (!response.ok) { + throw new Error( + `Unable to download ${specUrl}: ${response.status} ${response.statusText}`, + ); +} + +const downloadedSource = await response.text(); +const downloadedSignature = semanticSignature(downloadedSource, specUrl); +let currentSignature; + +if (existsSync(snapshotPath)) { + const currentSource = await readFile(snapshotPath, "utf8"); + currentSignature = semanticSignature(currentSource, snapshotPath); +} + +if (downloadedSignature === currentSignature) { + console.log("OpenAPI snapshot is already current."); + process.exit(0); +} + +if (checkOnly) { + console.error("OpenAPI snapshot differs from the deployed sandbox contract."); + process.exit(1); +} + +await mkdir(path.dirname(snapshotPath), { recursive: true }); +const temporaryPath = `${snapshotPath}.${process.pid}.tmp`; +const normalizedSource = downloadedSource.endsWith("\n") + ? downloadedSource + : `${downloadedSource}\n`; + +await writeFile(temporaryPath, normalizedSource, "utf8"); +await rename(temporaryPath, snapshotPath); + +console.log(`Updated ${path.relative(process.cwd(), snapshotPath)} from ${specUrl}.`); diff --git a/sidebars.js b/sidebars.js index 6b162a1..6826091 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1,4 +1,6 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const apiReferenceSidebar = require("./docs/api-reference/sidebar.ts").default; + const sidebars = { docs: [ { @@ -22,52 +24,14 @@ const sidebars = { { type: "category", label: "API", - items: [ - "api-auth", - { - type: "category", - label: "/v1/current_company", - items: [ - "api-current-company-show", - "api-current-company-update", - "api-current-company-stats", - ], - }, - { - type: "category", - label: "/v1/customers", - items: ["api-customers", "api-customer-show"], - }, - { - type: "category", - label: "/v1/payments", - items: ["api-payments", "api-payment-show"], - }, - { - type: "category", - label: "/v1/plans", - items: ["api-plans", "api-plans-create", "api-plans-update"], - }, - { - type: "category", - label: "/v1/refunds", - items: ["api-refunds"], - }, - { - type: "category", - label: "/v1/subscriptions", - items: [ - "api-subscriptions", - "api-subscription-show", - "api-subscription-destroy", - ], - }, - { - type: "category", - label: "/v1/user", - items: ["api-user"], - }, - ], + link: { + type: "generated-index", + title: "PayHere REST API Reference", + description: + "Generated from the OpenAPI contract published by the PayHere API.", + slug: "/category/api-reference", + }, + items: apiReferenceSidebar, }, ], }; diff --git a/src/css/custom.css b/src/css/custom.css index 3352810..bb9fb05 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -382,3 +382,693 @@ table thead tr { grid-template-columns: 1fr; } } + +/* ============================================================ + Generated OpenAPI reference + + The OpenAPI theme uses the same generic `.tabs` classes as our dark + editor-style code samples. These scoped rules give API controls their own + treatment while preserving that editor styling in the hand-written docs. + ============================================================ */ + +.theme-api-markdown { + --openapi-card-background-color: var(--ph-gray-50); + --openapi-input-background: #fff; + --openapi-input-border: var(--ph-blue); + --openapi-tree-line-color: var(--ph-gray-300); + --openapi-code-tab-border-color: var(--ph-editor-border); + --openapi-explorer-border-color: var(--ph-gray-200); + --openapi-explorer-font-size-input: 0.8125rem; + --openapi-explorer-font-size-code: 0.78rem; + --openapi-explorer-padding-input: 0.65rem 0.75rem; + align-items: flex-start; +} + +[data-theme='dark'] .theme-api-markdown { + --openapi-card-background-color: #151b27; + --openapi-input-background: #0e131c; + --openapi-tree-line-color: #30394a; + --openapi-explorer-border-color: #2a3343; +} + +.theme-api-markdown .openapi-left-panel__container { + border-right: 0; + padding-right: 2rem !important; +} + +.theme-api-markdown .openapi-right-panel__container { + padding-left: 2rem !important; +} + +.theme-api-markdown .openapi__heading { + margin-bottom: 0.85rem !important; + font-size: clamp(2.25rem, 3vw, 3rem); + line-height: 1.08; + letter-spacing: -0.035em; +} + +.theme-api-markdown .openapi__method-endpoint { + width: 100%; + padding: 0.65rem 0.75rem; + background: var(--ph-gray-50); + border-color: var(--ph-gray-200); + border-radius: var(--ph-radius-lg); +} + +[data-theme='dark'] .theme-api-markdown .openapi__method-endpoint { + background: var(--ifm-background-surface-color); + border-color: var(--ifm-color-emphasis-300); +} + +.theme-api-markdown .openapi__method-endpoint-path { + overflow-wrap: anywhere; + font-size: 0.78rem; + color: var(--ifm-color-emphasis-700); +} + +.theme-api-markdown .openapi__divider { + margin: 1.35rem 0 1.65rem; +} + +.theme-api-markdown .openapi-left-panel__container > p { + font-size: 1rem; + line-height: 1.65; +} + +/* API response, content-type, and schema tabs are compact controls, not code + editor tabs. */ +.theme-api-markdown .openapi-tabs__response-list-container, +.theme-api-markdown .openapi-tabs__mime-list-container, +.theme-api-markdown .openapi-tabs__schema-list-container, +.theme-api-markdown .openapi-tabs__operation-list-container { + gap: 0.35rem; + padding: 0; + background: transparent; + border: 0; + border-radius: 0; +} + +.theme-api-markdown .openapi-tabs__response-code-item, +.theme-api-markdown .openapi-tabs__mime-item, +.theme-api-markdown .openapi-tabs__schema-item, +.theme-api-markdown .openapi-tabs__operation-item { + min-height: 30px; + margin-right: 0; + padding: 0.35rem 0.7rem; + background: transparent; + border: 1px solid var(--ph-gray-200); + border-radius: var(--ph-radius-md); + color: var(--ifm-color-emphasis-700); + font-size: 0.72rem; + line-height: 1; +} + +[data-theme='dark'] .theme-api-markdown .openapi-tabs__response-code-item, +[data-theme='dark'] .theme-api-markdown .openapi-tabs__mime-item, +[data-theme='dark'] .theme-api-markdown .openapi-tabs__schema-item, +[data-theme='dark'] .theme-api-markdown .openapi-tabs__operation-item { + border-color: var(--ifm-color-emphasis-300); +} + +.theme-api-markdown .openapi-tabs__response-code-item::before, +.theme-api-markdown .openapi-tabs__mime-item::before, +.theme-api-markdown .openapi-tabs__schema-item::before, +.theme-api-markdown .openapi-tabs__operation-item::before { + display: none; +} + +.theme-api-markdown .openapi-tabs__mime-item.active, +.theme-api-markdown .openapi-tabs__schema-item.active, +.theme-api-markdown .openapi-tabs__operation-item.active { + background: var(--ph-sidebar-active-bg); + border-color: rgba(0, 77, 201, 0.35); + color: var(--ifm-color-primary); +} + +[data-theme='dark'] .theme-api-markdown .openapi-tabs__mime-item.active, +[data-theme='dark'] .theme-api-markdown .openapi-tabs__schema-item.active, +[data-theme='dark'] .theme-api-markdown .openapi-tabs__operation-item.active { + border-color: rgba(77, 139, 255, 0.45); +} + +.theme-api-markdown .openapi-tabs__response-code-item.success.active { + background: #238636; + border-color: #238636; +} + +.theme-api-markdown .openapi-tabs__response-code-item.danger.active { + background: #cf3347; + border-color: #cf3347; +} + +.theme-api-markdown .openapi-tabs__response-code-item.info.active { + background: var(--ph-blue); + border-color: var(--ph-blue); +} + +.theme-api-markdown .openapi-tabs__response-schema-container, +.theme-api-markdown .openapi-tabs__operation-schema-container, +.theme-api-markdown .openapi-tabs__mime-schema-container { + max-width: none; +} + +/* Code samples retain the dark editor surface, but use the compact language + tabs already established in the hand-written API guides. */ +.theme-api-markdown + .openapi-tabs__code-container:not(.openapi-tabs__code-container-inner) { + padding: 0; + overflow: hidden; + background: var(--ph-editor-bg); + border: 1px solid var(--ph-editor-border); + border-radius: var(--ph-radius-lg); + box-shadow: none; +} + +.theme-api-markdown + .openapi-tabs__code-container:not(.openapi-tabs__code-container-inner):hover { + box-shadow: none; +} + +.theme-api-markdown + .openapi-tabs__code-container:not(.openapi-tabs__code-container-inner) + > .openapi-tabs__code-list-container { + gap: 0.25rem; + padding: 0.4rem; + background: var(--ph-editor-strip); + border: 0; + border-bottom: 1px solid var(--ph-editor-border); + border-radius: 0; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item { + flex: 0 0 auto; + flex-direction: row; + gap: 0.45rem; + min-height: 34px; + margin-right: 0; + padding: 0.45rem 0.7rem !important; + border: 1px solid transparent; + border-radius: var(--ph-radius-sm); + box-shadow: none !important; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item::after { + display: none; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item::before { + display: block; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item + > span { + padding: 0; + color: var(--ph-editor-muted); + font-size: 0.75rem; + line-height: 1; + text-transform: none; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item.active { + background: var(--ph-editor-active); + border-color: var(--ph-editor-border) !important; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item.active::before { + background: #34d399; +} + +.theme-api-markdown + .openapi-tabs__code-container + .openapi-tabs__code-item.active + > span { + color: var(--ph-editor-text); +} + +.theme-api-markdown + .openapi-tabs__code-container + > .margin-top--md { + margin-top: 0 !important; +} + +.theme-api-markdown .openapi-tabs__code-container-inner { + margin-bottom: 0; +} + +.theme-api-markdown + .openapi-tabs__code-container-inner + > .openapi-tabs__code-list-container { + gap: 0.25rem; + padding: 0.35rem 0.75rem 0; + background: #111722; + border: 0; + border-radius: 0; +} + +.theme-api-markdown + .openapi-tabs__code-container-inner + .openapi-tabs__code-item { + min-height: 26px; + padding: 0.3rem 0.55rem !important; +} + +.theme-api-markdown + .openapi-tabs__code-container-inner + .openapi-tabs__code-item::before { + display: none; +} + +.theme-api-markdown + .openapi-tabs__code-container-inner + > .openapi-tabs__code-list-container:has( + > .openapi-tabs__code-item:only-child + ) { + display: none; +} + +.theme-api-markdown .openapi-explorer__code-block-container { + box-shadow: none; +} + +/* Explorer cards and form fields use the same quiet borders and radii as the + rest of the docs instead of the plugin's elevated demo-card treatment. */ +.theme-api-markdown .openapi-security__details, +.theme-api-markdown .openapi-explorer__request-form { + overflow: hidden; + background: var(--ifm-background-surface-color); + border: 1px solid var(--openapi-explorer-border-color); + border-radius: var(--ph-radius-lg); + box-shadow: none; +} + +.theme-api-markdown .openapi-explorer__request-form:hover { + box-shadow: 0 8px 24px -20px rgba(3, 13, 29, 0.45); +} + +.theme-api-markdown .openapi-security__summary-container, +.theme-api-markdown .openapi-explorer__request-header-container { + padding: 0.8rem 1rem; + background: var(--ph-gray-50); + letter-spacing: 0.035em; +} + +[data-theme='dark'] .theme-api-markdown .openapi-security__summary-container, +[data-theme='dark'] + .theme-api-markdown + .openapi-explorer__request-header-container { + background: #151b27; +} + +.theme-api-markdown .openapi-security__summary-container:hover { + background: var(--ph-gray-100); +} + +[data-theme='dark'] + .theme-api-markdown + .openapi-security__summary-container:hover { + background: #1b2333; +} + +.theme-api-markdown .openapi-security__summary-header { + letter-spacing: 0.035em; +} + +.theme-api-markdown .openapi-explorer__details-outer-container { + padding: 0.75rem 1rem 1rem; +} + +.theme-api-markdown .openapi-explorer__form-item { + padding: 0.55rem 0; +} + +.theme-api-markdown .openapi-explorer__form-item-input, +.theme-api-markdown .openapi-explorer__select-input { + border: 1px solid var(--openapi-explorer-border-color); + border-radius: var(--ph-radius-md); + color: var(--ifm-font-color-base); +} + +.theme-api-markdown .openapi-explorer__form-item-input:hover { + border-color: var(--ifm-color-emphasis-400); +} + +.theme-api-markdown .openapi-explorer__form-item-input:focus, +.theme-api-markdown .openapi-explorer__select-input:focus { + border-color: var(--ifm-color-primary); + box-shadow: 0 0 0 3px rgba(0, 77, 201, 0.12); +} + +.theme-api-markdown .openapi-schema__list-item { + padding-top: 0.55rem; + padding-bottom: 0.55rem; +} + +.theme-api-markdown .openapi-schema__property { + font-size: 0.84rem; + font-weight: 600; +} + +.theme-api-markdown .openapi-schema__type, +.theme-api-markdown .openapi-schema__name { + font-size: 0.8rem; +} + +.theme-api-markdown .openapi-schema__required { + padding: 0.12rem 0.35rem; + background: rgba(207, 51, 71, 0.08); + border-radius: 999px; +} + +.theme-api-markdown .openapi-schema__divider { + margin-right: 0.6rem; + margin-left: 0.6rem; +} + +/* With the docs sidebar open, intermediate laptop widths leave too little + room for a useful split view. Stack the reference and explorer until both + columns can breathe. */ +@media (min-width: 997px) and (max-width: 1300px) { + .theme-api-markdown { + display: block; + } + + .theme-api-markdown .openapi-left-panel__container, + .theme-api-markdown .openapi-right-panel__container { + width: 100%; + max-width: 100%; + padding-right: 0 !important; + padding-left: 0 !important; + --ifm-col-width: 100%; + } + + .theme-api-markdown .openapi-right-panel__container { + position: static; + max-height: none; + margin-top: 2rem; + padding-top: 2rem !important; + overflow: visible; + border-top: 1px solid var(--ifm-toc-border-color); + } +} + +@media (max-width: 996px) { + .theme-api-markdown .openapi-left-panel__container, + .theme-api-markdown .openapi-right-panel__container { + padding-right: 0 !important; + padding-left: 0 !important; + } + + .theme-api-markdown .openapi-right-panel__container { + margin-top: 2rem; + } +} + +@media (max-width: 576px) { + .theme-api-markdown .openapi__heading { + font-size: 2rem; + } + + .theme-api-markdown .openapi-tabs__response-header-section { + gap: 0.75rem; + } + + .theme-api-markdown .openapi-tabs__response-container { + margin-top: 0; + } +} + +/* ============================================================ + Generated OpenAPI overview + + The generated information page does not use `.theme-api-markdown`, so it + needs a small page-specific layer for its version, export, and security + scheme components. + ============================================================ */ + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .theme-doc-version-badge { + padding: 0.28rem 0.55rem; + background: var(--ph-sidebar-active-bg); + border: 1px solid rgba(0, 77, 201, 0.2); + border-radius: 999px; + color: var(--ifm-color-primary); + font-family: var(--ifm-font-family-monospace); + font-size: 0.7rem; + font-weight: 600; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] .export-button { + padding: 0.42rem 0.8rem; + background: transparent; + border: 1px solid var(--ph-gray-300); + border-radius: var(--ph-radius-md); + color: var(--ifm-color-primary); + font-family: var(--ifm-font-family-monospace); + font-size: 0.72rem; + font-weight: 600; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .export-button:hover { + background: var(--ph-sidebar-active-bg); + border-color: rgba(0, 77, 201, 0.35); +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .export-button { + border-color: var(--ifm-color-emphasis-300); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi__heading { + margin-top: 0.75rem; + margin-bottom: 0.75rem !important; + font-size: clamp(2.5rem, 4vw, 3rem); + line-height: 1.08; + letter-spacing: -0.035em; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi__heading + + p { + max-width: 760px; + font-size: 1.05rem; + line-height: 1.65; + color: var(--ifm-color-emphasis-800); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__heading { + margin-top: 2.5rem; + margin-bottom: 1rem; + padding-top: 1.5rem; + border-top: 1px solid var(--ifm-toc-border-color); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container { + overflow: hidden; + background: var(--ifm-background-surface-color); + border: 1px solid var(--ph-gray-200); + border-radius: var(--ph-radius-lg); +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container { + border-color: var(--ifm-color-emphasis-300); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-tabs-container { + padding: 0.65rem; + background: var(--ph-gray-50); + border-bottom: 1px solid var(--ph-gray-200); +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-tabs-container { + background: #151b27; + border-color: var(--ifm-color-emphasis-300); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes { + width: 100%; + gap: 0.4rem; + padding: 0; + background: transparent; + border: 0; + border-radius: 0; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes + .openapi-tabs__schema-item { + min-height: 34px; + margin-right: 0; + padding: 0.5rem 0.75rem; + background: transparent; + border: 1px solid var(--ph-gray-200); + border-radius: var(--ph-radius-md); + color: var(--ifm-color-emphasis-700); + font-size: 0.74rem; +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes + .openapi-tabs__schema-item { + border-color: var(--ifm-color-emphasis-300); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes + .openapi-tabs__schema-item::before { + display: none; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes + .openapi-tabs__schema-item.active { + background: var(--ifm-background-surface-color); + border-color: rgba(0, 77, 201, 0.4); + color: var(--ifm-color-primary); + box-shadow: 0 1px 2px rgba(3, 13, 29, 0.06); +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes + .openapi-tabs__schema-item.active { + background: var(--ifm-background-color); + border-color: rgba(77, 139, 255, 0.5); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + > .margin-top--md { + margin-top: 0 !important; + padding: 1.25rem; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + table { + display: table; + width: 100%; + margin: 1rem 0 0; + table-layout: fixed; + border-color: var(--ph-gray-200); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + tbody { + display: table-row-group; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + tr { + background: transparent; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + th { + width: 42%; + background: var(--ph-gray-50); + color: var(--ifm-color-emphasis-800); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + th, +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + td { + padding: 0.8rem 1rem; + border-color: var(--ph-gray-200); + vertical-align: middle; +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + table, +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + th, +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + td { + border-color: var(--ifm-color-emphasis-300); +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + th { + background: #151b27; +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .col--12.markdown + > div:last-of-type { + margin-top: 2rem; + padding: 1.1rem 1.25rem; + background: var(--ph-gray-50); + border: 1px solid var(--ph-gray-200); + border-left: 3px solid var(--ifm-color-primary); + border-radius: var(--ph-radius-lg); +} + +html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .col--12.markdown + > div:last-of-type + h3 { + margin-top: 0; +} + +[data-theme='dark'][class*='docs-doc-id-api-reference/payhere-rest-api'] + .col--12.markdown + > div:last-of-type { + background: #151b27; + border-color: var(--ifm-color-emphasis-300); + border-left-color: var(--ifm-color-primary); +} + +@media (max-width: 576px) { + html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi__heading { + font-size: 2.25rem; + } + + html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-tabs-container { + overflow-x: auto; + } + + html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__security-schemes { + width: max-content; + } + + html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + th, + html[class*='docs-doc-id-api-reference/payhere-rest-api'] + .openapi-tabs__schema-container + td { + display: block; + width: 100%; + } +} diff --git a/src/pages/index.js b/src/pages/index.js index 5ca019d..b8167f8 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -93,7 +93,7 @@ const ROUTES = [ description: "Full control over payments, plans, subscriptions and refunds from your own backend.", effort: "Developer", - to: "/docs/api-auth", + to: "/docs/api-reference/payhere-rest-api", }, ]; @@ -135,7 +135,10 @@ function Hero() { Get started - + API reference diff --git a/vercel.json b/vercel.json index d46396d..e6e4deb 100644 --- a/vercel.json +++ b/vercel.json @@ -1,6 +1,89 @@ { + "$schema": "https://openapi.vercel.sh/vercel.json", "buildCommand": "yarn build", "outputDirectory": "build", "installCommand": "yarn install", - "framework": "docusaurus-2" + "framework": "docusaurus-2", + "redirects": [ + { + "source": "/docs/api-auth", + "destination": "/docs/api-reference/payhere-rest-api#authentication", + "statusCode": 301 + }, + { + "source": "/docs/api-current-company-show", + "destination": "/docs/api-reference/get-current-company", + "statusCode": 301 + }, + { + "source": "/docs/api-current-company-update", + "destination": "/docs/api-reference/update-current-company", + "statusCode": 301 + }, + { + "source": "/docs/api-current-company-stats", + "destination": "/docs/api-reference/get-current-company-stats", + "statusCode": 301 + }, + { + "source": "/docs/api-customers", + "destination": "/docs/api-reference/list-customers", + "statusCode": 301 + }, + { + "source": "/docs/api-customer-show", + "destination": "/docs/api-reference/get-customer", + "statusCode": 301 + }, + { + "source": "/docs/api-payments", + "destination": "/docs/api-reference/list-payments", + "statusCode": 301 + }, + { + "source": "/docs/api-payment-show", + "destination": "/docs/api-reference/get-payment", + "statusCode": 301 + }, + { + "source": "/docs/api-plans", + "destination": "/docs/api-reference/list-plans", + "statusCode": 301 + }, + { + "source": "/docs/api-plans-create", + "destination": "/docs/api-reference/create-plan", + "statusCode": 301 + }, + { + "source": "/docs/api-plans-update", + "destination": "/docs/api-reference/update-plan", + "statusCode": 301 + }, + { + "source": "/docs/api-refunds", + "destination": "/docs/api-reference/create-refund", + "statusCode": 301 + }, + { + "source": "/docs/api-subscriptions", + "destination": "/docs/api-reference/list-subscriptions", + "statusCode": 301 + }, + { + "source": "/docs/api-subscription-show", + "destination": "/docs/api-reference/get-subscription", + "statusCode": 301 + }, + { + "source": "/docs/api-subscription-destroy", + "destination": "/docs/api-reference/cancel-subscription", + "statusCode": 301 + }, + { + "source": "/docs/api-user", + "destination": "/docs/api-reference/get-current-user", + "statusCode": 301 + } + ] } diff --git a/yarn.lock b/yarn.lock index 7dbafe4..3837c36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -183,6 +183,14 @@ dependencies: "@algolia/client-common" "5.56.0" +"@apidevtools/json-schema-ref-parser@^15.3.3": + version "15.5.2" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.5.2.tgz#ecdf9aca202fa583dc18da07f7f47f7ea28bd677" + integrity sha512-B+C9Ok0DF/rjANIUHgwcV5/d4C72MB7f2IbKFL8jDGcGq2qn3yr893s8vAn2kbhmyaelAin0JK8EKF9P1+y7aQ== + dependencies: + js-yaml "^5.2.2" + undici "^6.28.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" @@ -1051,7 +1059,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.29.7" "@babel/plugin-transform-typescript" "^7.29.7" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.25.9": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.25.9": version "7.29.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== @@ -1980,6 +1988,16 @@ utility-types "^3.10.0" webpack "^5.88.1" +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + +"@faker-js/faker@5.5.3": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-5.5.3.tgz#18e3af6b8eae7984072bbeb0c0858474d7c4cefe" + integrity sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1992,6 +2010,11 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@hookform/error-message@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hookform/error-message/-/error-message-2.0.1.tgz#6a37419106e13664ad6a29c9dae699ae6cd276b8" + integrity sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg== + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2011,7 +2034,7 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== @@ -2283,6 +2306,89 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#99aaa3223d43807c9340af439cad7e9b6d26ada6" + integrity sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA== + +"@parcel/watcher-darwin-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz#024496e586b4744f09ce532bbe89fe38ef02a64e" + integrity sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw== + +"@parcel/watcher-darwin-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz#a4621df1359a93d39a332d9bab5ff09016a0608f" + integrity sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw== + +"@parcel/watcher-freebsd-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz#7f565ed1a5b3a5e604e6a4799121518265d62a3d" + integrity sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ== + +"@parcel/watcher-linux-arm-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz#ad7d3825e67b81999165da42593022045abc0889" + integrity sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg== + +"@parcel/watcher-linux-arm-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz#fe7d1cccb2c483215c090e938cf5cf404d2f9a8c" + integrity sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw== + +"@parcel/watcher-linux-arm64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz#7e239dcb4646c4c79f006a7131a48238249530da" + integrity sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g== + +"@parcel/watcher-linux-arm64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz#c58b8d9c6d8d81594be00dd83aab741c1aaf7e0e" + integrity sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA== + +"@parcel/watcher-linux-x64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz#5184fa9a770478d86e56875f4ee163a0abdc8791" + integrity sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A== + +"@parcel/watcher-linux-x64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz#2d1c55aa7246cbc7670e2612058a8a542c9cf246" + integrity sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw== + +"@parcel/watcher-win32-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz#15e09432040fee9e2213aa9c10ed589012526def" + integrity sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ== + +"@parcel/watcher-win32-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz#9bee199a2a4accd557b451ac2c1c793f305ae012" + integrity sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A== + +"@parcel/watcher@^2.4.1": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.6.0.tgz#99661f6220070b76a766aba6b7e313a087a1be4f" + integrity sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w== + dependencies: + detect-libc "^2.0.3" + is-glob "^4.0.3" + node-addon-api "^7.0.0" + picomatch "^4.0.4" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.6.0" + "@parcel/watcher-darwin-arm64" "2.6.0" + "@parcel/watcher-darwin-x64" "2.6.0" + "@parcel/watcher-freebsd-x64" "2.6.0" + "@parcel/watcher-linux-arm-glibc" "2.6.0" + "@parcel/watcher-linux-arm-musl" "2.6.0" + "@parcel/watcher-linux-arm64-glibc" "2.6.0" + "@parcel/watcher-linux-arm64-musl" "2.6.0" + "@parcel/watcher-linux-x64-glibc" "2.6.0" + "@parcel/watcher-linux-x64-musl" "2.6.0" + "@parcel/watcher-win32-arm64" "2.6.0" + "@parcel/watcher-win32-x64" "2.6.0" + "@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.9.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.9.0.tgz#3b7f6c02bc0d05bb742afe1c921b4cb62f87c9d0" @@ -2439,6 +2545,57 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== +"@redocly/ajv@^8.18.3": + version "8.18.3" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577" + integrity sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +"@redocly/cli@2.51.0": + version "2.51.0" + resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-2.51.0.tgz#b68ca981bb9dbd78b06d6012f7f77a9d187123ef" + integrity sha512-X4zaTTFA7V3T1s7CVdeqU2pcFVxZtQ5FKQDoW0eUurb6ntD+5XWqPr57gr55XaLYA1zrUCKvnZpN4Tr2VUBkBg== + +"@redocly/config@^0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.55.0.tgz#25e95cb71c8ebbc1a792076975dec1a03f4bea4b" + integrity sha512-PlaCpehzQoe6R9YksDI5gW4mfTA2UfnpCGldXXs7/axeyPdAK/T2UpfsSD9sOedKaq6VF9jtE9qXmnH71CAclg== + dependencies: + json-schema-to-ts "2.7.2" + +"@redocly/openapi-core@^2.25.2": + version "2.51.0" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-2.51.0.tgz#3b1c0881e176a99516f62ab5764c730aeacd3ef8" + integrity sha512-jriOoa3jbQSnP4jQ+nSpcttvH2A3YG5uDl1i9K57mfVEQdGn1QSf8o/076qAD2rCYMJ4S419H+zXE7RCS6bhtA== + dependencies: + "@redocly/ajv" "^8.18.3" + "@redocly/config" "^0.55.0" + ajv "npm:@redocly/ajv@^8.18.3" + ajv-formats "^3.0.1" + colorette "^1.2.0" + graphql "^16.14.1" + js-levenshtein "^1.1.6" + js-yaml "^5.2.2" + picomatch "^4.0.4" + pluralize "^8.0.0" + yaml-ast-parser "0.0.43" + +"@reduxjs/toolkit@^2.8.2": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.12.0.tgz#e62787503a38561e04bb8f39e29ca8db689590f9" + integrity sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@standard-schema/utils" "^0.3.0" + immer "^11.0.0" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" @@ -2480,6 +2637,16 @@ micromark-util-character "^1.1.0" micromark-util-symbol "^1.0.1" +"@standard-schema/spec@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + +"@standard-schema/utils@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b" + integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -2889,6 +3056,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== +"@types/use-sync-external-store@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" + integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== + "@types/ws@^8.5.10": version "8.18.1" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" @@ -3082,13 +3254,25 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1: +ajv-draft-04@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv-formats@2.1.1, ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -3111,7 +3295,7 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.11.0, ajv@^8.9.0: version "8.20.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== @@ -3121,6 +3305,16 @@ ajv@^8.0.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" +"ajv@npm:@redocly/ajv@^8.18.3": + version "8.18.3" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.18.3.tgz#a925753d9a33375219f1b2ba91aef320f9929577" + integrity sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + algoliasearch-helper@^3.26.0: version "3.29.3" resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz#dc21f119320acbdd5890a21021846b5730d11e03" @@ -3148,6 +3342,13 @@ algoliasearch@^5.37.0: "@algolia/requester-fetch" "5.56.0" "@algolia/requester-node-http" "5.56.0" +allof-merge@^0.6.6: + version "0.6.8" + resolved "https://registry.yarnpkg.com/allof-merge/-/allof-merge-0.6.8.tgz#5813a23c860407d279f85053ef541c8f946c5021" + integrity sha512-RJrHVDqITsU1kjE2L7s1hy4AYZSTlO1m9jTleYhVCEOfOpbbygRGfcEgrp+bW3oX/PcMUwVkt6MSJyXoyI6lRA== + dependencies: + json-crawl "^0.5.3" + ansi-align@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -3170,7 +3371,7 @@ ansi-regex@^6.2.2: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.3.0.tgz#247c8e7b70a1a43b10ce14c0226fcbf58e8815d5" integrity sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ== -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -3187,6 +3388,11 @@ ansis@^3.2.0: resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3229,6 +3435,11 @@ astring@^1.8.0: resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== +async@3.2.6, async@^3.2.2: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + autoprefixer@^10.4.19, autoprefixer@^10.4.23: version "10.5.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.4.tgz#3b7dd848b4155514a95ad1f6ce598844bea09697" @@ -3297,6 +3508,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + baseline-browser-mapping@^2.11.12: version "2.11.14" resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz#d51bb92285608b0e6356841a2eea76842a771d52" @@ -3407,6 +3623,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bundle-name@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" @@ -3473,6 +3697,11 @@ call-bound@^1.0.2, call-bound@^1.0.3: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3524,7 +3753,7 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1, chalk@^5.2.0: +chalk@^5.0.1, chalk@^5.2.0, chalk@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== @@ -3554,6 +3783,11 @@ character-reference-invalid@^2.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== +charset@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/charset/-/charset-1.0.1.tgz#8d59546c355be61049a8fa9164747793319852bd" + integrity sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg== + cheerio-select@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" @@ -3594,6 +3828,13 @@ chokidar@^3.5.3, chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-5.0.0.tgz#949c126a9238a80792be9a0265934f098af369a5" + integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== + dependencies: + readdirp "^5.0.0" + chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" @@ -3630,6 +3871,15 @@ cli-table3@^0.6.3: optionalDependencies: "@colors/colors" "1.5.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -3639,7 +3889,7 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clsx@^2.0.0: +clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== @@ -3666,6 +3916,11 @@ colord@^2.9.3: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== +colorette@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + colorette@^2.0.10: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -3681,15 +3936,20 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@2.20.3, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^5.1.0: version "5.1.0" @@ -3731,6 +3991,25 @@ compression@^1.8.1: safe-buffer "5.2.1" vary "~1.1.2" +compute-gcd@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" + integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + +compute-lcm@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" + integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== + dependencies: + compute-gcd "^1.2.1" + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + validate.io-integer-array "^1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -3850,6 +4129,11 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + crypto-random-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" @@ -4145,11 +4429,23 @@ destroy@1.2.0, destroy@~1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +detect-package-manager@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/detect-package-manager/-/detect-package-manager-3.0.2.tgz#ca34261ab84198072580e93ae86582c575428da9" + integrity sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ== + dependencies: + execa "^5.1.1" + detect-port@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-2.1.0.tgz#03d72644891fa451ca5609b83107a8a0ebd03f91" @@ -4178,6 +4474,68 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +docusaurus-plugin-openapi-docs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-5.2.0.tgz#8318ec90cd21fed023be57696211af7d72fd81db" + integrity sha512-MjrfRAMB64uvdxRVz6L9AXWe4QFjCdoBAzYs306yyI3nnXHsFj2lv2FnLA90JV9CAUZaGiYMvvkzBo2Nrkq/9w== + dependencies: + "@apidevtools/json-schema-ref-parser" "^15.3.3" + "@redocly/openapi-core" "^2.25.2" + allof-merge "^0.6.6" + chalk "^5.6.2" + clsx "^2.1.1" + fs-extra "^11.3.0" + json-pointer "^0.6.2" + json5 "^2.2.3" + lodash "^4.17.21" + mustache "^4.2.0" + openapi-to-postmanv2 "^6.0.0" + postman-collection "^5.0.2" + slugify "^1.6.6" + swagger2openapi "^7.0.8" + xml-formatter "^3.6.6" + +docusaurus-plugin-sass@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz#b4930a1fe1cc7bcead639bb1bee38bce0ffd073d" + integrity sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg== + dependencies: + sass-loader "^16.0.2" + +docusaurus-theme-openapi-docs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-5.2.0.tgz#6d93a74e2e3cf0ae77d24e1c4144bd2e74a52115" + integrity sha512-L0b80LzaMUfr76a9EQXRPCf8nxkEz8Xo6Aknnke1UeE2oXsgoiVki6U+RTE7GmJRjO8zSNKXyckGmGmqqWuHeA== + dependencies: + "@hookform/error-message" "^2.0.1" + "@reduxjs/toolkit" "^2.8.2" + allof-merge "^0.6.6" + buffer "^6.0.3" + clsx "^2.1.1" + copy-text-to-clipboard "^3.2.0" + crypto-js "^4.2.0" + file-saver "^2.0.5" + lodash "^4.17.21" + pako "^3.0.1" + path-browserify "^1.0.1" + postman-code-generators "^2.0.0" + postman-collection "^5.0.2" + prism-react-renderer "^2.4.1" + process "^0.11.10" + react-hook-form "^7.59.0" + react-live "^4.1.8" + react-magic-dropzone "^1.0.1" + react-markdown "^10.1.0" + react-modal "^3.16.3" + react-redux "^9.2.0" + rehype-raw "^7.0.0" + remark-gfm "4.0.1" + sass "^1.89.2" + sass-loader "^17.0.0" + unist-util-visit "^5.0.0" + url "^0.11.4" + xml-formatter "^3.6.6" + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -4366,6 +4724,11 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + esast-util-from-estree@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" @@ -4545,6 +4908,11 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + express@^4.22.1: version "4.22.2" resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" @@ -4615,6 +4983,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fast-uri@^3.0.1: version "3.1.5" resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.5.tgz#610f37419a030270430cecd68d74e3d4d96725d0" @@ -4641,6 +5014,11 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -4656,6 +5034,16 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-type@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -4702,6 +5090,11 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== +foreach@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + form-data-encoder@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" @@ -4727,7 +5120,7 @@ fresh@~0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^11.1.1, fs-extra@^11.2.0: +fs-extra@^11.1.1, fs-extra@^11.2.0, fs-extra@^11.3.0: version "11.4.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730" integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA== @@ -4736,6 +5129,11 @@ fs-extra@^11.1.1, fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -4751,6 +5149,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" @@ -4809,6 +5212,18 @@ glob-to-regex.js@^1.0.0, glob-to-regex.js@^1.0.1: resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== +glob@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -4871,6 +5286,18 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphlib@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== + dependencies: + lodash "^4.17.15" + +graphql@^16.14.1: + version "16.14.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.14.2.tgz#83faf25869e3df727cc855161db5da85b0e5b2c0" + integrity sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -5096,6 +5523,11 @@ html-tags@^3.3.1: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== +html-url-attributes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== + html-void-elements@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" @@ -5189,6 +5621,16 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-reasons@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/http-reasons/-/http-reasons-0.1.0.tgz#a953ca670078669dde142ce899401b9d6e85d3b4" + integrity sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ== + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + http2-wrapper@^2.1.10: version "2.2.1" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" @@ -5207,6 +5649,13 @@ hyperdyperid@^1.2.0: resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5219,6 +5668,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -5229,6 +5683,16 @@ image-size@^2.0.2: resolved "https://registry.yarnpkg.com/image-size/-/image-size-2.0.2.tgz#84a7b43704db5736f364bf0d1b029821299b4bdc" integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== +immer@^11.0.0: + version "11.1.18" + resolved "https://registry.yarnpkg.com/immer/-/immer-11.1.18.tgz#87d9bced1e25157dc23bced66811de89460ec8f3" + integrity sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ== + +immutable@^5.1.5: + version "5.1.9" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.9.tgz#ac23c3a01992ab665e14ac9ffff298f28cd74a0c" + integrity sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg== + import-fresh@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" @@ -5257,7 +5721,15 @@ infima@0.2.0-alpha.45: resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== -inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5277,6 +5749,11 @@ inline-style-parser@0.2.7: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -5538,11 +6015,23 @@ joi@^17.9.2: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" + integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== + dependencies: + argparse "^2.0.1" + js-yaml@^4.1.0: version "4.3.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.1.tgz#01216c001d67f48e2cd560d708c7af21090a3848" @@ -5550,6 +6039,13 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js-yaml@^5.2.2: + version "5.4.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-5.4.1.tgz#4629d91d4b4551f300435f0e4127899710f816fb" + integrity sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ== + dependencies: + argparse "^2.0.1" + jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -5560,11 +6056,48 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-crawl@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/json-crawl/-/json-crawl-0.5.3.tgz#3a2e1d308d4fc5a444902f1f94f4a9e03d584c6b" + integrity sha512-BEjjCw8c7SxzNK4orhlWD5cXQh8vCk2LqDr4WgQq4CV+5dvopeYwt1Tskg67SuSLKvoFH5g0yuYtg7rcfKV6YA== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-pointer@0.6.2, json-pointer@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" + integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== + dependencies: + foreach "^2.0.4" + +json-schema-compare@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" + integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== + dependencies: + lodash "^4.17.4" + +json-schema-merge-allof@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz#ed2828cdd958616ff74f932830a26291789eaaf2" + integrity sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w== + dependencies: + compute-lcm "^1.1.2" + json-schema-compare "^0.2.2" + lodash "^4.17.20" + +json-schema-to-ts@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/json-schema-to-ts/-/json-schema-to-ts-2.7.2.tgz#e8df41d7153e5517f0e68dbe57be12bb3609d6d5" + integrity sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ== + dependencies: + "@babel/runtime" "^7.18.3" + "@types/json-schema" "^7.0.9" + ts-algebra "^1.2.0" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -5636,6 +6169,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +liquid-json@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/liquid-json/-/liquid-json-0.3.1.tgz#9155a18136d8a6b2615e5f16f9a2448ab6b50eea" + integrity sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ== + loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -5667,7 +6205,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.20, lodash@^4.17.21: +lodash@4.18.1, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.18.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== @@ -6430,6 +6968,13 @@ mime-db@~1.33.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== +mime-format@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.2.tgz#77fa304b9aedb21439c4db010305146edbd8a912" + integrity sha512-Y5ERWVcyh3sby9Fx2U5F1yatiTFjNsqF5NltihTWI9QgNtr5o3dbCZdcKa1l2wyfhnwwoP9HGNxga7LqZLA6gw== + dependencies: + charset "^1.0.0" + mime-types@2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" @@ -6456,6 +7001,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -6484,7 +7034,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.5: +minimatch@3.1.5, minimatch@^3.1.1: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -6529,6 +7079,20 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@^3.3.17: version "3.3.18" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" @@ -6549,6 +7113,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +neotraverse@0.6.15: + version "0.6.15" + resolved "https://registry.yarnpkg.com/neotraverse/-/neotraverse-0.6.15.tgz#dc4abb64700c52440f13bc53635b559862420360" + integrity sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -6557,6 +7126,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-emoji@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" @@ -6567,6 +7141,27 @@ node-emoji@^2.1.0: emojilib "^2.4.0" skin-tone "^2.0.0" +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + node-releases@^2.0.53: version "2.0.53" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.53.tgz#0fe5ad8a7935e075172f574e56f0c20f07fa41af" @@ -6609,11 +7204,74 @@ null-loader@^4.0.1: loader-utils "^2.0.0" schema-utils "^3.0.0" -object-assign@^4.1.1: +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver-browser@2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz#1974db66d594fa8c67d3aa866b46b9e2156a8b55" + integrity sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + path-browserify "^1.0.1" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" @@ -6653,6 +7311,13 @@ on-headers@~1.1.0: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -6679,6 +7344,35 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openapi-to-postmanv2@^6.0.0: + version "6.3.3" + resolved "https://registry.yarnpkg.com/openapi-to-postmanv2/-/openapi-to-postmanv2-6.3.3.tgz#b249c923a3093f316bc0e191d92abf49bb3736b9" + integrity sha512-o0u6qqMMRLt7eAyFBpL/lCresQ1VqQFGe6/iPMBvNkWDXrpgGo5jo+YnP1e0MwF3tdUKLfkHssufGWMdojpPLg== + dependencies: + ajv "^8.11.0" + ajv-draft-04 "1.0.0" + ajv-formats "2.1.1" + async "3.2.6" + commander "2.20.3" + graphlib "2.1.8" + js-yaml "4.3.0" + json-pointer "0.6.2" + json-schema-merge-allof "0.8.1" + lodash "4.18.1" + neotraverse "0.6.15" + oas-resolver-browser "2.5.6" + object-hash "3.0.0" + openapi-types "^12.1.3" + path-browserify "1.0.1" + postman-collection "^5.0.0" + swagger2openapi "7.0.8" + yaml "1.10.2" + +openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -6749,6 +7443,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +pako@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pako/-/pako-3.0.1.tgz#3156f8fa86e3cc2ae5a36369475b14d4f05696ce" + integrity sha512-GupotUUI0mlhugKjUs4bjOwLt3nrehy9Ys2dxC0GtgVef5cnKggkDMmf2bq2poCCuVXopWPmqsc9VDT2iJUy+w== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -6820,11 +7519,21 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-browserify@1.0.1, path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-is-inside@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -6872,6 +7581,16 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== +picomatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.7.tgz#6313360034ccb36b3dc61ecbdff78121f90fe21f" + integrity sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA== + +pirates@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + pkg-dir@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" @@ -6891,6 +7610,11 @@ pkijs@^3.3.3: pvutils "^1.1.3" tslib "^2.8.1" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + postcss-attribute-case-insensitive@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" @@ -7455,6 +8179,41 @@ postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: picocolors "^1.1.1" source-map-js "^1.2.1" +postman-code-generators@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postman-code-generators/-/postman-code-generators-2.1.1.tgz#37d1d612b103d96997a7d0698737d4b006d53e97" + integrity sha512-+egQK1Jf9a92QP23vRTKcDLOthIQmI7WI4czEsZq/wgguLMnVHJ26KlT8AVtpAdVw28hqUbHwicerYxRWCfjoA== + dependencies: + async "^3.2.2" + detect-package-manager "^3.0.2" + lodash "^4.17.21" + postman-collection "^5.0.0" + shelljs "^0.8.5" + +postman-collection@^5.0.0, postman-collection@^5.0.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postman-collection/-/postman-collection-5.3.1.tgz#0848518f763b88377404c95e67662ba3cd0eef4e" + integrity sha512-+ixY4KEGerw3I5dE6obXgXx31na8URU5ODNIA6Rjkbt3/BUpNRk03pxUAZFHr5dDXwCikJSa7pt5o0x1QXT77w== + dependencies: + "@faker-js/faker" "5.5.3" + file-type "3.9.0" + http-reasons "0.1.0" + iconv-lite "0.6.3" + liquid-json "0.3.1" + lodash "4.18.1" + mime "3.0.0" + mime-format "2.0.2" + postman-url-encoder "3.0.8" + semver "7.7.1" + uuid "8.3.2" + +postman-url-encoder@3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-3.0.8.tgz#f4f40c1858301fadc466f0a7825f9bb638857367" + integrity sha512-EOgUMBazo7JNP4TDrd64TsooCiWzzo4143Ws8E8WYGEpn2PKpq+S4XRTDhuRTYHm3VKOpUZs7ZYZq7zSDuesqA== + dependencies: + punycode "^2.3.1" + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -7468,7 +8227,7 @@ pretty-time@^1.1.0: resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^2.3.0: +prism-react-renderer@^2.3.0, prism-react-renderer@^2.4.0, prism-react-renderer@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz#ac63b7f78e56c8f2b5e76e823a976d5ede77e35f" integrity sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig== @@ -7486,6 +8245,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -7521,7 +8285,12 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -punycode@^2.1.0: +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -7545,6 +8314,14 @@ pvutils@^1.1.3, pvutils@^1.1.5: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.2.0.tgz#4b5487a9cccd52d275b0538775790a3ca982bc22" integrity sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg== +qs@^6.12.3: + version "6.16.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.16.0.tgz#c22c723a28a920f3aacdce8289fabd43eccb79fd" + integrity sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA== + dependencies: + es-define-property "^1.0.1" + side-channel "^1.1.1" + qs@~6.15.1: version "6.15.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" @@ -7628,6 +8405,11 @@ react-fast-compare@^3.2.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-hook-form@^7.59.0: + version "7.87.0" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.87.0.tgz#a9dde90aa71f1e303842d2b8de942160de618b61" + integrity sha512-zhFzWvLxNHH+8839OnZcUxgMZw88ah2jZWDWvKWgF3Tpbnd0vKL+dlcuU3nZVWESZQjd81EW8K+wU+cYfYAc0w== + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -7638,6 +8420,20 @@ react-json-view-lite@^2.3.0: resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz#c7ff011c7cc80e9900abc7aa4916c6a5c6d6c1c6" integrity sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g== +react-lifecycles-compat@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-live@^4.1.8: + version "4.1.8" + resolved "https://registry.yarnpkg.com/react-live/-/react-live-4.1.8.tgz#287fb6c5127c2d89a6fe39380278d95cc8e661b6" + integrity sha512-B2SgNqwPuS2ekqj4lcxi5TibEcjWkdVyYykBEUBshPAPDQ527x2zPEZg560n8egNtAjUpwXFQm7pcXV65aAYmg== + dependencies: + prism-react-renderer "^2.4.0" + sucrase "^3.35.0" + use-editable "^2.3.3" + react-loadable-ssr-addon-v5-slorber@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz#bb3791bf481222c63a5bc6b96ee23f68cb5614b9" @@ -7652,6 +8448,46 @@ react-loadable-ssr-addon-v5-slorber@^1.0.3: dependencies: "@types/react" "*" +react-magic-dropzone@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz#bfd25b77b57e7a04aaef0a28910563b707ee54df" + integrity sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA== + +react-markdown@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-10.1.0.tgz#e22bc20faddbc07605c15284255653c0f3bad5ca" + integrity sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +react-modal@^3.16.3: + version "3.16.3" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.3.tgz#c412d41915782e3c261253435d01468e2439b11b" + integrity sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + +react-redux@^9.2.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.3.0.tgz#a30113bb6d95c0a715d54dda4308d450fca6ce09" + integrity sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g== + dependencies: + "@types/use-sync-external-store" "^0.0.6" + use-sync-external-store "^1.4.0" + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" @@ -7714,6 +8550,11 @@ readable-stream@^3.0.6: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-5.1.1.tgz#520bca06f9d1ae1b96cc0800dbe84b983d19422c" + integrity sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7721,6 +8562,13 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + recma-build-jsx@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" @@ -7761,11 +8609,26 @@ recma-stringify@^1.0.0: unified "^11.0.0" vfile "^6.0.0" +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + reflect-metadata@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + regenerate-unicode-properties@^10.2.2: version "10.2.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" @@ -7870,7 +8733,7 @@ remark-frontmatter@^5.0.0: micromark-extension-frontmatter "^2.0.0" unified "^11.0.0" -remark-gfm@^4.0.0: +remark-gfm@4.0.1, remark-gfm@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== @@ -7931,6 +8794,11 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -7946,6 +8814,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.3.0.tgz#0a3e3ed4436bdf2ab7c5e0f392dab2c062595d61" + integrity sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg== + resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -7961,7 +8834,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.22.11: +resolve@^1.1.6, resolve@^1.22.11: version "1.22.12" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== @@ -8020,11 +8893,34 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass-loader@^16.0.2: + version "16.0.8" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.8.tgz#b7eef3b7947b32e2988dd760a2f7f0d547838e6b" + integrity sha512-hcov4ZwZJIGbEuyNr9EmiTmZueyrxSToE6GOzoZnq5JM7ecRO7ttyvilPn+VmRsqiP16+VYZzVnGZj/hzZgKBA== + dependencies: + neo-async "^2.6.2" + +sass-loader@^17.0.0: + version "17.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-17.0.1.tgz#4e89d8028b313d713584ac90f6f25fc1256449f7" + integrity sha512-pgJMwCuLjVTSIWsv/2luVRXKlCeaViUGcgSe8dx95zMG4hUwqIMFmjbhq29ypFLflJU0GyiJZeLM9iI1n3KYAA== + +sass@^1.89.2: + version "1.103.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.103.1.tgz#13b70f5ff69288db956dc27d27c8fb79f3a27c61" + integrity sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw== + dependencies: + chokidar "^5.0.0" + immutable "^5.1.5" + source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" + sax@^1.2.4, sax@^1.5.0: version "1.6.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" @@ -8087,6 +8983,11 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" +semver@7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -8205,6 +9106,59 @@ shell-quote@^1.8.4: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + side-channel-list@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" @@ -8291,6 +9245,11 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slugify@^1.6.6: + version "1.6.9" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.9.tgz#610957dea21e56b65e3a153215ef7b265715c8e8" + integrity sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg== + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" @@ -8313,7 +9272,7 @@ sort-css-media-queries@2.2.0: resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== -source-map-js@^1.0.1, source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== @@ -8384,7 +9343,7 @@ std-env@^3.7.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8433,7 +9392,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8489,6 +9448,19 @@ stylehacks@^6.1.1: browserslist "^4.23.0" postcss-selector-parser "^6.0.16" +sucrase@^3.35.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -8526,6 +9498,23 @@ svgo@^3.0.2, svgo@^3.2.0: picocolors "^1.0.0" sax "^1.5.0" +swagger2openapi@7.0.8, swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" @@ -8551,6 +9540,20 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: commander "^2.20.0" source-map-support "~0.5.20" +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thingies@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f" @@ -8571,6 +9574,14 @@ tiny-warning@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyglobby@^0.2.11: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tinypool@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" @@ -8593,6 +9604,11 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tree-dump@^1.0.3, tree-dump@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" @@ -8608,6 +9624,16 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== +ts-algebra@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ts-algebra/-/ts-algebra-1.2.2.tgz#b75d301c28cd4126cd344760a47b43e48e2872e0" + integrity sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -8655,6 +9681,11 @@ undici-types@~8.3.0: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== +undici@^6.28.0: + version "6.28.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.28.0.tgz#9f0e385744fef5021d6596c5bccd783f61193c1c" + integrity sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" @@ -8802,6 +9833,24 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== + dependencies: + punycode "^1.4.1" + qs "^6.12.3" + +use-editable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f" + integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA== + +use-sync-external-store@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" + integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -8822,11 +9871,41 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: +uuid@8.3.2, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +validate.io-array@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== + +validate.io-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== + +validate.io-integer-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" + integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== + dependencies: + validate.io-array "^1.0.3" + validate.io-integer "^1.0.4" + +validate.io-integer@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== + dependencies: + validate.io-number "^1.0.3" + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -8861,6 +9940,13 @@ vfile@^6.0.0, vfile@^6.0.1: "@types/unist" "^3.0.0" vfile-message "^4.0.0" +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec" @@ -8880,6 +9966,11 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webpack-bundle-analyzer@^4.10.2: version "4.10.2" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" @@ -9017,6 +10108,14 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -9036,6 +10135,15 @@ wildcard@^2.0.0, wildcard@^2.0.1: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9045,6 +10153,11 @@ wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + write-file-atomic@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" @@ -9077,6 +10190,13 @@ xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== +xml-formatter@^3.6.6: + version "3.7.0" + resolved "https://registry.yarnpkg.com/xml-formatter/-/xml-formatter-3.7.0.tgz#ac6f8c02e2388759652e9d0c8a4b5b3dfc0694e5" + integrity sha512-+8qTc3zv2UcJ1v9IsSIce37Dl4MQG14Cp7tWrwmy202UaI1wqRukw5QMX1JHsV+DX64yw77EgGsj2s5wGvuMbQ== + dependencies: + xml-parser-xo "^4.1.5" + xml-js@^1.6.11: version "1.6.11" resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" @@ -9084,11 +10204,59 @@ xml-js@^1.6.11: dependencies: sax "^1.2.4" +xml-parser-xo@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/xml-parser-xo/-/xml-parser-xo-4.1.6.tgz#22bb2d0e1f651f92de04c7b79433a9df6f1490f2" + integrity sha512-mXbSNSM+rIwndoxSwmFa83bOdeP8G/cOGr7XvxA67X7ebCzoAuVez9JYDCDub3zRDNBZxIbfjuXLSsamr7NfwQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml-ast-parser@0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + +yaml@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== + +yaml@^1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" + integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.1: + version "17.7.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" + integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00"