From 97cde5f71eb16c10b5ff1b95475fa644dcd996b9 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Tue, 2 Jun 2026 03:31:23 +0300 Subject: [PATCH 01/18] docs(api): add curl example to Retrieve Payment Transaction MCP response Added a description_append to the retrieve_payment_transaction_checkout enrichment overlay so a static curl block is baked into the page at build time and picked up by the MCP indexer. Previously the curl snippet was rendered client-side by ApiExplorer and never appeared in docs_fetch responses from docs.ottu.com/mcp. --- .../apis/retrieve-payment-transaction-checkout.api.mdx | 9 ++++++++- static/api-enrichments/operations/checkout-api.yaml | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx index 12938a1..8c4a65e 100644 --- a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx +++ b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx @@ -5,7 +5,7 @@ description: "Retrieve an existing Payment Transaction by session_id" sidebar_label: "Retrieve Payment Transaction" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "get api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -45,6 +45,13 @@ Retrieve an existing Payment Transaction by session_id | [API Key](/developers/getting-started/authentication/#api-key-auth) | All permissions (admin access) | | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can view payment requests` or `Can view e-commerce payments` (also implied by `Can add` or `Can change` permissions) | +**Example request** + +```bash +curl -X GET "https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/" \ + -H "Authorization: Api-Key YOUR_API_KEY" +``` + Date: Wed, 3 Jun 2026 14:38:28 +0300 Subject: [PATCH 02/18] Revert "docs(api): add curl example to Retrieve Payment Transaction MCP response" This reverts commit 97cde5f71eb16c10b5ff1b95475fa644dcd996b9. --- .../apis/retrieve-payment-transaction-checkout.api.mdx | 9 +-------- static/api-enrichments/operations/checkout-api.yaml | 7 ------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx index 8c4a65e..12938a1 100644 --- a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx +++ b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx @@ -5,7 +5,7 @@ description: "Retrieve an existing Payment Transaction by session_id" sidebar_label: "Retrieve Payment Transaction" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "get api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -45,13 +45,6 @@ Retrieve an existing Payment Transaction by session_id | [API Key](/developers/getting-started/authentication/#api-key-auth) | All permissions (admin access) | | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can view payment requests` or `Can view e-commerce payments` (also implied by `Can add` or `Can change` permissions) | -**Example request** - -```bash -curl -X GET "https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/" \ - -H "Authorization: Api-Key YOUR_API_KEY" -``` - Date: Sun, 7 Jun 2026 22:52:36 +0300 Subject: [PATCH 03/18] feat(api-docs): inject hidden MCP hints into generated API reference pages The MCP server indexes the static HTML of generated .api.mdx pages so AI tools (via docs_fetch) can retrieve usable request examples. The OpenAPI plugin's interactive ApiExplorer already renders a curl example for human readers, so duplicating it visibly in the page body would be redundant and hurt the reading experience. This adds a clean two-stage pipeline to thread per-operation MCP hints through without surfacing them to users: - enrich-api-spec.ts: support an optional `mcp_hint` field on operation enrichment overlays, copied verbatim onto the operation in the enriched spec (alongside permissions/description enrichments already supported) - inject-mcp-hints.ts (new): reads `mcp_hint` back out of the enriched spec after gen-api-docs runs, and patches the matching .api.mdx with a visually-hidden just before the Request heading, so the MCP's static-HTML indexer picks up the text while it stays invisible in the rendered page - package.json: wire `inject-mcp-hints` as the final step of `gen-api`, after extract-schemas, so generated docs always carry their hints Keeping enrichment (write mcp_hint to the enriched spec) and injection (read mcp_hint, patch .mdx) as separate scripts mirrors the existing fetch -> enrich -> generate separation of concerns in this pipeline. --- package.json | 3 +- scripts/enrich-api-spec.ts | 5 ++ scripts/inject-mcp-hints.ts | 98 +++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 scripts/inject-mcp-hints.ts diff --git a/package.json b/package.json index d72cd44..5e46fa6 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "fetch-api": "tsx scripts/fetch-api-schema.ts", "enrich-api": "tsx scripts/enrich-api-spec.ts", "extract-schemas": "tsx scripts/extract-schema.ts SchemaWebhook PaymentOperationResponses", - "gen-api": "npm run enrich-api && npx docusaurus clean-api-docs ottuApi && npx docusaurus gen-api-docs ottuApi && npm run extract-schemas", + "inject-mcp-hints": "tsx scripts/inject-mcp-hints.ts", + "gen-api": "npm run enrich-api && npx docusaurus clean-api-docs ottuApi && npx docusaurus gen-api-docs ottuApi && npm run extract-schemas && npm run inject-mcp-hints", "update-api": "npm run fetch-api && npm run gen-api", "start": "docusaurus start", "build": "docusaurus build && cp -r build/mcp build/_mcp-data", diff --git a/scripts/enrich-api-spec.ts b/scripts/enrich-api-spec.ts index bcb6b55..2f61ae8 100644 --- a/scripts/enrich-api-spec.ts +++ b/scripts/enrich-api-spec.ts @@ -85,6 +85,7 @@ interface OperationEnrichment { description_prepend?: string; description_replace?: string; parameters?: Record; + mcp_hint?: string; } interface OperationsFile { @@ -320,6 +321,10 @@ function enrichOperations( operation.description = description; + if (enrichment.mcp_hint) { + operation["mcp_hint"] = enrichment.mcp_hint; + } + // Apply parameter overrides (example, description) if (enrichment.parameters && Array.isArray(operation.parameters)) { for (const [paramName, override] of Object.entries(enrichment.parameters)) { diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts new file mode 100644 index 0000000..96a4403 --- /dev/null +++ b/scripts/inject-mcp-hints.ts @@ -0,0 +1,98 @@ +/** + * MCP Hint Injector + * + * Reads mcp_hint fields from the enriched OpenAPI spec and injects hidden JSX + * spans into the corresponding generated .api.mdx files so the MCP server + * indexes the hint text without it being visible to users. + * + * Runs after docusaurus gen-api-docs as part of npm run gen-api. + * Reads from: static/Ottu_API_enriched.yaml (written by npm run enrich-api) + * Patches: docs/developers/apis/*.api.mdx (written by docusaurus gen-api-docs) + */ + +import * as fs from "node:fs"; +import * as path from "node:path"; +import * as yaml from "js-yaml"; + +const ROOT = path.resolve(__dirname, ".."); +const SOURCES_FILE = path.join(ROOT, "static", "api-sources.yaml"); +const API_DOCS_DIR = path.join(ROOT, "docs", "developers", "apis"); + +const INJECTION_ANCHOR = /^; +} + +function operationIdToFilename(operationId: string): string { + return operationId.replace(/_/g, "-") + ".api.mdx"; +} + +function injectHint(mdxContent: string, hint: string): string { + const span = `${hint}\n\n`; + const match = INJECTION_ANCHOR.exec(mdxContent); + if (!match) return mdxContent; + return mdxContent.slice(0, match.index) + span + mdxContent.slice(match.index); +} + +function processSource(enrichedSpecPath: string): number { + if (!fs.existsSync(enrichedSpecPath)) { + console.error(` ERROR: Enriched spec not found: ${enrichedSpecPath}`); + console.error(` Run "npm run enrich-api" first.`); + process.exit(1); + } + + const spec = yaml.load(fs.readFileSync(enrichedSpecPath, "utf-8")) as any; + const paths = spec.paths || {}; + let injected = 0; + + for (const pathItem of Object.values(paths)) { + for (const method of ["get", "post", "put", "patch", "delete", "options", "head"]) { + const op = pathItem[method]; + if (!op?.mcp_hint || !op?.operationId) continue; + + const filename = operationIdToFilename(op.operationId); + const mdxPath = path.join(API_DOCS_DIR, filename); + + if (!fs.existsSync(mdxPath)) { + console.warn(` WARN: No .api.mdx found for ${op.operationId} (expected ${filename})`); + continue; + } + + const original = fs.readFileSync(mdxPath, "utf-8"); + const patched = injectHint(original, op.mcp_hint); + + if (patched === original) { + console.warn(` WARN: Injection anchor not found in ${filename}`); + continue; + } + + fs.writeFileSync(mdxPath, patched, "utf-8"); + console.log(` Injected hint into ${filename}`); + injected++; + } + } + + return injected; +} + +function main(): void { + console.log("\nMCP Hint Injector"); + + const config = yaml.load(fs.readFileSync(SOURCES_FILE, "utf-8")) as ApiSourcesConfig; + let total = 0; + + for (const [name, source] of Object.entries(config.sources)) { + console.log(`\n ── ${name} ──`); + const enrichedSpecPath = path.resolve(ROOT, source.enrichedOutput); + total += processSource(enrichedSpecPath); + } + + console.log(`\n Done — ${total} file(s) patched\n`); +} + +main(); From c98c34aa32c830980b45b46f317d29709812b6e1 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Mon, 8 Jun 2026 00:34:11 +0300 Subject: [PATCH 04/18] docs(api): add MCP hint for Retrieve Payment Transaction and regenerate page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Populates the mcp_hint overlay field (added in the previous commit's enrichment-engine support) for retrieve_payment_transaction_checkout — the first operation to carry one — with a runnable curl example pointing at the sandbox host: curl -X GET "{{sandboxUrl}}/b/checkout/v1/pymt-txn/{session_id}/" \ -H "Authorization: Api-Key YOUR_API_KEY" Regenerating via `npm run gen-api` resolves the {{sandboxUrl}} template variable to the real sandbox host, threads the hint through to the enriched spec's operation object, and lets inject-mcp-hints.ts patch it into retrieve-payment-transaction-checkout.api.mdx as a visually-hidden span — giving the MCP server's docs_fetch a concrete request example for this operation without changing what human readers see on the page. --- .../apis/retrieve-payment-transaction-checkout.api.mdx | 4 +++- static/api-enrichments/operations/checkout-api.yaml | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx index 12938a1..234a41c 100644 --- a/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx +++ b/docs/developers/apis/retrieve-payment-transaction-checkout.api.mdx @@ -5,7 +5,7 @@ description: "Retrieve an existing Payment Transaction by session_id" sidebar_label: "Retrieve Payment Transaction" hide_title: true hide_table_of_contents: true -api: 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 +api: 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 sidebar_class_name: "get api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -46,6 +46,8 @@ Retrieve an existing Payment Transaction by session_id | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can view payment requests` or `Can view e-commerce payments` (also implied by `Can add` or `Can change` permissions) | +curl -X GET "https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/" -H "Authorization: Api-Key YOUR_API_KEY" + Date: Mon, 8 Jun 2026 00:34:42 +0300 Subject: [PATCH 05/18] refactor(mcp): upgrade hint injector to auto-generate curl for every operation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hand-curated mcp_hint approach doesn't scale — it requires an overlay author to write and maintain a runnable curl string per operation, and only the one operation that gets a hint shows up in docs_fetch results. Every other operation's MCP example would stay missing indefinitely. Rewrites inject-mcp-hints.ts to auto-generate a curl example for ALL operations in the enriched spec, using the exact same conversion and snippet-rendering pipeline the interactive ApiExplorer uses client-side: - openapi-to-postmanv2 (SchemaPack) converts the spec into a Postman collection, mirroring the plugin's own createPostmanCollection step - postman-code-generators renders the curl snippet, with the same default cURL variant options the ApiExplorer uses (mirrored from docusaurus-theme-openapi-docs's CodeSnippets/languages.json) - the openapi-docs plugin's own sampleRequestFromSchema builds the JSON request body example for write endpoints, so the body in the generated curl matches the example already shown in the page's request schema instead of a garbled schema-faker dump - @apidevtools/json-schema-ref-parser dereferences the spec first, since sampleRequestFromSchema can't fake a bare unresolved $ref The generated curl is injected as a JSON.stringify-wrapped JS string expression inside the hidden span — {${JSON.stringify(curl)}} rather than raw text — because the curl text contains literal `{`/`}` (path templates, JSON bodies) that MDX's acorn-based expression parser would otherwise choke on ("Could not parse expression with acorn"). Operation matching reuses the plugin's own path-to-regex templating (bindCollectionToApiItems / pathTemplateToRegex) to bind each Postman collection item back to its OpenAPI operation by method + path shape. --- scripts/inject-mcp-hints.ts | 221 ++++++++++++++++++++++++++++++------ 1 file changed, 188 insertions(+), 33 deletions(-) diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts index 96a4403..99fe535 100644 --- a/scripts/inject-mcp-hints.ts +++ b/scripts/inject-mcp-hints.ts @@ -1,9 +1,18 @@ /** - * MCP Hint Injector + * MCP Curl Example Injector * - * Reads mcp_hint fields from the enriched OpenAPI spec and injects hidden JSX - * spans into the corresponding generated .api.mdx files so the MCP server - * indexes the hint text without it being visible to users. + * Auto-generates a runnable curl example for every API operation in the + * enriched OpenAPI spec — using the same conversion and snippet-generation + * pipeline the interactive ApiExplorer uses under the hood (openapi-to-postmanv2 + * to build a Postman collection, postman-code-generators to render the curl, + * and the openapi-docs plugin's own sampleRequestFromSchema for body examples) + * — and injects each one as a visually-hidden into the matching + * generated .api.mdx file. + * + * The ApiExplorer already renders an interactive curl example for human + * readers, so this hidden copy exists purely so the MCP server's static-HTML + * indexer can return a usable request example via docs_fetch, without + * duplicating it visibly on the page. * * Runs after docusaurus gen-api-docs as part of npm run gen-api. * Reads from: static/Ottu_API_enriched.yaml (written by npm run enrich-api) @@ -13,6 +22,13 @@ import * as fs from "node:fs"; import * as path from "node:path"; import * as yaml from "js-yaml"; +import RefParser from "@apidevtools/json-schema-ref-parser"; +import openapiToPostman from "openapi-to-postmanv2"; +// @ts-expect-error — no published type declarations +import sdk from "postman-collection"; +// @ts-expect-error — no published type declarations +import codegen from "postman-code-generators"; +import { sampleRequestFromSchema } from "docusaurus-plugin-openapi-docs/lib/openapi/createRequestExample.js"; const ROOT = path.resolve(__dirname, ".."); const SOURCES_FILE = path.join(ROOT, "static", "api-sources.yaml"); @@ -20,6 +36,21 @@ const API_DOCS_DIR = path.join(ROOT, "docs", "developers", "apis"); const INJECTION_ANCHOR = /^; } +interface OperationMatcher { + operationId: string; + method: string; + pathRegex: RegExp; + operation: any; +} + function operationIdToFilename(operationId: string): string { return operationId.replace(/_/g, "-") + ".api.mdx"; } -function injectHint(mdxContent: string, hint: string): string { - const span = `${hint}\n\n`; +// Same templating as the openapi-docs plugin's bindCollectionToApiItems — +// turns "/foo/{id}/bar" into a regex that matches "/foo//bar". +function pathTemplateToRegex(pathTemplate: string): RegExp { + const withTokens = pathTemplate.replace(/\{[^}]+\}/g, "__OPENAPI_PATH_PARAM__"); + const escaped = withTokens.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const pattern = escaped.replace(/__OPENAPI_PATH_PARAM__/g, "[^/]+"); + return new RegExp(`^${pattern}$`); +} + +function buildOperationMatchers(spec: any): OperationMatcher[] { + const matchers: OperationMatcher[] = []; + for (const [pathTemplate, pathItem] of Object.entries(spec.paths || {})) { + for (const method of HTTP_METHODS) { + const operation = pathItem[method]; + if (operation?.operationId) { + matchers.push({ + operationId: operation.operationId, + method, + pathRegex: pathTemplateToRegex(pathTemplate), + operation, + }); + } + } + } + return matchers; +} + +// Mirrors the openapi-docs plugin's createPostmanCollection: strip servers +// (they break the conversion) and run the spec through openapi-to-postmanv2. +async function buildPostmanCollection(spec: any): Promise { + const data = JSON.parse(JSON.stringify(spec)); + delete data.servers; + for (const pathItem of Object.values(data.paths || {})) { + delete pathItem.servers; + for (const method of HTTP_METHODS) delete pathItem[method]?.servers; + } + return new Promise((resolve, reject) => { + const schemaPack = new openapiToPostman.SchemaPack({ type: "json", data }, { schemaFaker: false }); + schemaPack.convert((err: any, result: any) => { + if (err || !result?.result) return reject(err || result?.reason); + resolve(new sdk.Collection(result.output[0].data)); + }); + }); +} + +function collectionItems(collection: any): any[] { + const items: any[] = []; + collection.forEachItem((item: any) => items.push(item)); + return items; +} + +// Point the request at the real sandbox host, turn placeholder path/query +// values into readable {param} templates, and attach the API key header — +// the same masked-credential placeholder shape the ApiExplorer shows. +function applyServerAndAuth(request: any, baseUrl: string): void { + request.url.protocol = undefined; + request.url.host = [baseUrl]; + request.url.variables.each((variable: any) => { + variable.value = `{${variable.key}}`; + }); + request.url.query.each((param: any) => { + param.value = `{${param.key}}`; + }); + request.headers.add({ key: "Authorization", value: "Api-Key YOUR_API_KEY" }); +} + +// Reuse the plugin's own example generator so the body in the curl matches +// the example shown in the page's request schema — only handles JSON bodies, +// which covers every write endpoint that matters for an MCP example. +function applyJsonBody(request: any, operation: any): void { + const jsonContent = operation.requestBody?.content?.["application/json"]; + if (!jsonContent?.schema) return; + const example = sampleRequestFromSchema(jsonContent.schema); + if (example === undefined) return; + request.body = new sdk.RequestBody({ + mode: "raw", + raw: JSON.stringify(example, null, 2), + options: { raw: { language: "json" } }, + }); + request.headers.upsert({ key: "Content-Type", value: "application/json" }); +} + +function generateCurl(request: any): Promise { + return new Promise((resolve, reject) => { + codegen.convert("curl", "cURL", request, CURL_OPTIONS, (err: any, snippet: string) => { + if (err) return reject(err); + resolve(snippet); + }); + }); +} + +function injectSpan(mdxContent: string, curl: string): string | null { + // Curl text contains literal `{`/`}` (path templates, JSON bodies), which + // MDX would otherwise try to parse as JS expressions in raw text. Wrapping + // it as a JS string expression — {"..."} — sidesteps that entirely. + const span = `{${JSON.stringify(curl)}}\n\n`; const match = INJECTION_ANCHOR.exec(mdxContent); - if (!match) return mdxContent; + if (!match) return null; return mdxContent.slice(0, match.index) + span + mdxContent.slice(match.index); } -function processSource(enrichedSpecPath: string): number { +async function processSource(enrichedSpecPath: string): Promise { if (!fs.existsSync(enrichedSpecPath)) { console.error(` ERROR: Enriched spec not found: ${enrichedSpecPath}`); console.error(` Run "npm run enrich-api" first.`); @@ -47,41 +179,64 @@ function processSource(enrichedSpecPath: string): number { } const spec = yaml.load(fs.readFileSync(enrichedSpecPath, "utf-8")) as any; - const paths = spec.paths || {}; - let injected = 0; - - for (const pathItem of Object.values(paths)) { - for (const method of ["get", "post", "put", "patch", "delete", "options", "head"]) { - const op = pathItem[method]; - if (!op?.mcp_hint || !op?.operationId) continue; + const baseUrl = spec.servers?.[0]?.url; + if (!baseUrl) { + console.warn(` WARN: Spec has no servers[0].url — skipping curl generation`); + return 0; + } - const filename = operationIdToFilename(op.operationId); - const mdxPath = path.join(API_DOCS_DIR, filename); + // Dereferenced copy: operation matching and body example generation both + // need resolved $refs (sampleRequestFromSchema can't fake a bare $ref). + const dereferenced = await RefParser.dereference(JSON.parse(JSON.stringify(spec)), { + mutateInputSchema: false, + }); + const matchers = buildOperationMatchers(dereferenced); + const collection = await buildPostmanCollection(spec); - if (!fs.existsSync(mdxPath)) { - console.warn(` WARN: No .api.mdx found for ${op.operationId} (expected ${filename})`); - continue; - } + let injected = 0; - const original = fs.readFileSync(mdxPath, "utf-8"); - const patched = injectHint(original, op.mcp_hint); + for (const item of collectionItems(collection)) { + const request = item.request; + const method = request.method.toLowerCase(); + const requestPath = request.url.getPath({ unresolved: true }); + const matcher = matchers.find((m) => m.method === method && m.pathRegex.test(requestPath)); + if (!matcher) continue; + + applyServerAndAuth(request, baseUrl); + applyJsonBody(request, matcher.operation); + + let curl: string; + try { + curl = await generateCurl(request); + } catch (err) { + console.warn(` WARN: Failed to generate curl for ${matcher.operationId}: ${err}`); + continue; + } - if (patched === original) { - console.warn(` WARN: Injection anchor not found in ${filename}`); - continue; - } + const filename = operationIdToFilename(matcher.operationId); + const mdxPath = path.join(API_DOCS_DIR, filename); + if (!fs.existsSync(mdxPath)) { + console.warn(` WARN: No .api.mdx found for ${matcher.operationId} (expected ${filename})`); + continue; + } - fs.writeFileSync(mdxPath, patched, "utf-8"); - console.log(` Injected hint into ${filename}`); - injected++; + const original = fs.readFileSync(mdxPath, "utf-8"); + const patched = injectSpan(original, curl); + if (patched === null) { + console.warn(` WARN: Injection anchor not found in ${filename}`); + continue; } + + fs.writeFileSync(mdxPath, patched, "utf-8"); + console.log(` Injected curl example into ${filename}`); + injected++; } return injected; } -function main(): void { - console.log("\nMCP Hint Injector"); +async function main(): Promise { + console.log("\nMCP Curl Example Injector"); const config = yaml.load(fs.readFileSync(SOURCES_FILE, "utf-8")) as ApiSourcesConfig; let total = 0; @@ -89,7 +244,7 @@ function main(): void { for (const [name, source] of Object.entries(config.sources)) { console.log(`\n ── ${name} ──`); const enrichedSpecPath = path.resolve(ROOT, source.enrichedOutput); - total += processSource(enrichedSpecPath); + total += await processSource(enrichedSpecPath); } console.log(`\n Done — ${total} file(s) patched\n`); From 646e8bfcae0702fc830982f23991272e4c74980f Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Mon, 8 Jun 2026 00:36:38 +0300 Subject: [PATCH 06/18] revert: drop mcp_hint overlay support now that curl is auto-generated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new auto-generation injector (previous commit) produces a curl example for every operation directly from the spec — it no longer reads mcp_hint. The hand-curated overlay field and the enrichment-engine support that wrote it through to the spec are now dead weight that would only mislead future overlay authors into thinking they need to write one per operation. Removes: - the mcp_hint value from the retrieve_payment_transaction_checkout overlay - the mcp_hint?: string field from OperationEnrichment and the block in enrichOperations() that copied it onto the operation Net effect on enrich-api-spec.ts and checkout-api.yaml is a clean revert to their pre-mcp_hint state; the stale hint span left behind in retrieve-payment-transaction-checkout.api.mdx gets replaced by the auto-generated one in the next commit's full regeneration. --- scripts/enrich-api-spec.ts | 5 ----- static/api-enrichments/operations/checkout-api.yaml | 1 - 2 files changed, 6 deletions(-) diff --git a/scripts/enrich-api-spec.ts b/scripts/enrich-api-spec.ts index 2f61ae8..bcb6b55 100644 --- a/scripts/enrich-api-spec.ts +++ b/scripts/enrich-api-spec.ts @@ -85,7 +85,6 @@ interface OperationEnrichment { description_prepend?: string; description_replace?: string; parameters?: Record; - mcp_hint?: string; } interface OperationsFile { @@ -321,10 +320,6 @@ function enrichOperations( operation.description = description; - if (enrichment.mcp_hint) { - operation["mcp_hint"] = enrichment.mcp_hint; - } - // Apply parameter overrides (example, description) if (enrichment.parameters && Array.isArray(operation.parameters)) { for (const [paramName, override] of Object.entries(enrichment.parameters)) { diff --git a/static/api-enrichments/operations/checkout-api.yaml b/static/api-enrichments/operations/checkout-api.yaml index f1c314e..7c8066a 100644 --- a/static/api-enrichments/operations/checkout-api.yaml +++ b/static/api-enrichments/operations/checkout-api.yaml @@ -16,7 +16,6 @@ operations: permissions: - $perm:api_key_admin - $perm:basic_auth_view_checkout - mcp_hint: 'curl -X GET "{{sandboxUrl}}/b/checkout/v1/pymt-txn/{session_id}/" -H "Authorization: Api-Key YOUR_API_KEY"' full_update_payment_transaction_checkout: permissions: From 6e1081b0faff8c4b120fcae709eaaa8077a9aaf5 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Mon, 8 Jun 2026 00:37:39 +0300 Subject: [PATCH 07/18] docs(apis): regenerate all pages with auto-generated MCP curl examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runs the upgraded inject-mcp-hints.ts (two commits back) across a fresh gen-api-docs build, so every one of the 28 operations now carries a hidden, auto-generated curl example — not just the single operation that previously had a hand-written mcp_hint. For read endpoints this is a plain authenticated request against the sandbox host (e.g. retrieve-payment-transaction-checkout's GET on /b/checkout/v1/pymt-txn/{session_id}/); for write endpoints (create/full-update/partial-update-payment-transaction-checkout, etc.) the curl now also carries a clean JSON body generated by the same sampleRequestFromSchema function the page's own request-schema example uses — e.g. {"type": "e_commerce", "amount": "10.000", "currency_code": "KWD", "pg_codes": ["knet"]} — instead of the garbled schema-faker dumps a naive conversion would produce. Each example is invisible to human readers (display:none) but gets indexed by the MCP server's static-HTML crawler, so docs_fetch now returns a copy-paste-ready request example for every endpoint in the API reference, matching what the interactive ApiExplorer shows on the page. --- docs/developers/apis/apple-native-payment.api.mdx | 2 ++ docs/developers/apis/auto-debit-2.api.mdx | 2 ++ docs/developers/apis/auto-debit.api.mdx | 2 ++ docs/developers/apis/cash-payment-acknowledgement-2.api.mdx | 2 ++ docs/developers/apis/cash-payment-acknowledgement.api.mdx | 2 ++ docs/developers/apis/create-invoice.api.mdx | 2 ++ .../apis/create-payment-transaction-checkout.api.mdx | 2 ++ docs/developers/apis/delete-user-cards.api.mdx | 2 ++ docs/developers/apis/download-report.api.mdx | 2 ++ .../apis/full-update-payment-transaction-checkout.api.mdx | 2 ++ docs/developers/apis/get-payment-methods.api.mdx | 2 ++ docs/developers/apis/get-pre-payment-option.api.mdx | 2 ++ docs/developers/apis/get-user-cards.api.mdx | 2 ++ docs/developers/apis/google-native-payment.api.mdx | 2 ++ docs/developers/apis/inquiry.api.mdx | 2 ++ docs/developers/apis/list-reports.api.mdx | 2 ++ docs/developers/apis/message-notifications.api.mdx | 2 ++ .../apis/partial-update-payment-transaction-checkout.api.mdx | 2 ++ docs/developers/apis/public-operations.api.mdx | 2 ++ .../apis/retrieve-payment-transaction-checkout.api.mdx | 4 ++-- docs/developers/apis/send-notification.api.mdx | 2 ++ docs/developers/apis/send-specific-notification.api.mdx | 2 ++ docs/developers/apis/upload-attachment.api.mdx | 2 ++ docs/developers/apis/wallet-accounts.api.mdx | 2 ++ docs/developers/apis/wallet-entries.api.mdx | 2 ++ docs/developers/apis/wallet-finalization-status.api.mdx | 2 ++ docs/developers/apis/wallet-native-payment.api.mdx | 2 ++ docs/developers/apis/wallet-operation-details.api.mdx | 2 ++ 28 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/developers/apis/apple-native-payment.api.mdx b/docs/developers/apis/apple-native-payment.api.mdx index 7e9290e..aaef174 100644 --- a/docs/developers/apis/apple-native-payment.api.mdx +++ b/docs/developers/apis/apple-native-payment.api.mdx @@ -48,6 +48,8 @@ Typical use case: The merchant collects the Apple Pay token on their frontend an | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can add payment requests` or `Can add e-commerce payments` | +{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/apple-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"wrappedKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n },\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/cash/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/cash-payment/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"} + **Gateway permission**: `Can use pg_code` for the target [payment gateway](/developers/payments/payment-methods/) +{"curl --location 'https://ksa.ottu.dev/b/invoice/v1/invoice/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"payment_request\",\n \"invoice_number\": \"INV-001\",\n \"due_date\": \"2030-12-31\",\n \"currency_code\": \"KWD\",\n \"pg_codes\": [\n \"knet\"\n ],\n \"invoice_items\": [\n {\n \"sku\": \"ITEM-001\",\n \"description\": \"Product description\",\n \"unit_price\": \"10.000\",\n \"quantity\": \"1\"\n }\n ]\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"e_commerce\",\n \"amount\": \"10.000\",\n \"currency_code\": \"KWD\",\n \"pg_codes\": [\n \"knet\"\n ]\n}'"} + {"curl --location --globoff --request DELETE 'https://ksa.ottu.dev/b/pbl/v2/card/{token}/?customer_id={customer_id}&type={type}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} + {"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/{token}/download/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} + {"curl --location --globoff --request PUT 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} + **Gateway permission**: `Can use pg_code` — grants access to the specific [payment gateway](/developers/payments/payment-methods/) (e.g., "Can use Credit Card") +{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment-methods/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"plugin\": \"payment_request\",\n \"operation\": \"purchase\",\n \"currencies\": [\n \"KWD\"\n ],\n \"type\": \"sandbox\",\n \"tags\": [\n \"demo\"\n ]\n}'"} + {"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/api/sdk/v1/pre-payment-option-check/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"pg_code\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/card/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"sandbox\",\n \"customer_id\": \"sandbox\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/google-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"payload\": {\n \"apiVersion\": 0,\n \"apiVersionMinor\": 0,\n \"paymentMethodData\": {\n \"type\": \"string\",\n \"description\": \"string\",\n \"info\": {},\n \"tokenizationData\": {}\n },\n \"email\": \"user@example.com\",\n \"shippingAddress\": {}\n },\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/inquiry/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\"\n}'"} + {"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/?created_after={created_after}&created_before={created_before}&interval={interval}&limit={limit}&offset={offset}&source={source}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/message-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"order_no\": \"string\",\n \"channels\": [\n \"sms\",\n \"email\"\n ]\n}'"} + {"curl --location --globoff --request PATCH 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/operation/' \\\n--header 'Tracking-Key: Tracking-Key: your_operation_tracking_key' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\",\n \"operation\": \"delete\",\n \"amount\": \"string\",\n \"extra\": {},\n \"destination\": \"pg\"\n}'"} + curl -X GET "https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/" -H "Authorization: Api-Key YOUR_API_KEY" +{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/send-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"channel\": \"email\",\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} + {"curl --location --globoff 'https://ksa.ottu.dev/b/pbl/v2/notifications/send/{channel}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/checkout/v1/upload-attachment/' \\\n--header 'Content-Type: multipart/form-data' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--form 'file=@\"/path/to/file\"' \\\n--form 'shortify_attachment_url=\"false\"' \\\n--form 'order_no=\"\"' \\\n--form 'session_id=\"\"'"} + {"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/accounts/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/entries/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} + {"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/wallet/payment-sessions/{session_id}/finalization-status/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} + {"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/wallet/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"payload\": {},\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} + {"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"operation_id\": 0\n}'"} + Date: Wed, 10 Jun 2026 02:09:29 +0300 Subject: [PATCH 08/18] build(mcp): declare inject-mcp-hints.ts dependencies explicitly @apidevtools/json-schema-ref-parser, openapi-to-postmanv2, postman-collection, and postman-code-generators are imported directly by scripts/inject-mcp-hints.ts but were only present as transitive dependencies of docusaurus-plugin-openapi-docs. That's fragile: a future major bump of docusaurus-plugin-openapi-docs could drop or replace any of them, silently breaking curl generation at gen-api time with no build failure (the script just stops finding any operations to inject). Adds all four as explicit devDependencies, pinned to the versions already resolved in package-lock.json. No transitive resolution changes. --- package-lock.json | 4 ++++ package.json | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/package-lock.json b/package-lock.json index 20fd7fd..f0aca98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,12 +25,16 @@ "sass": "^1.98.0" }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^15.3.5", "@docusaurus/module-type-aliases": "^3.10.0", "@docusaurus/tsconfig": "^3.10.0", "@docusaurus/types": "^3.10.0", "@types/js-yaml": "^4.0.9", "docusaurus-plugin-openapi-docs": "^5.0.0", "docusaurus-theme-openapi-docs": "^5.0.0", + "openapi-to-postmanv2": "^6.0.0", + "postman-code-generators": "^2.1.0", + "postman-collection": "^5.2.0", "tsx": "^4.21.0", "typescript": "^6.0.2" }, diff --git a/package.json b/package.json index 5e46fa6..221921b 100644 --- a/package.json +++ b/package.json @@ -39,12 +39,16 @@ "sass": "^1.98.0" }, "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^15.3.5", "@docusaurus/module-type-aliases": "^3.10.0", "@docusaurus/tsconfig": "^3.10.0", "@docusaurus/types": "^3.10.0", "@types/js-yaml": "^4.0.9", "docusaurus-plugin-openapi-docs": "^5.0.0", "docusaurus-theme-openapi-docs": "^5.0.0", + "openapi-to-postmanv2": "^6.0.0", + "postman-code-generators": "^2.1.0", + "postman-collection": "^5.2.0", "tsx": "^4.21.0", "typescript": "^6.0.2" }, From 5e3289d5c1cc554189c337a567f0186d1524a525 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Wed, 10 Jun 2026 03:58:59 +0300 Subject: [PATCH 09/18] fix(mcp): set Postman URL host/protocol via canonical SDK shape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit applyServerAndAuth previously stuffed the full base URL (including scheme) into a single-element host array and cleared protocol, which works but isn't how postman-collection's Url model expects host/protocol to be structured. Parse the base URL and set protocol and host (as dot-separated segments) the canonical way instead. No change in generated output: regenerated all 28 .api.mdx files and diffed against the committed versions — byte-identical. --- scripts/inject-mcp-hints.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts index 99fe535..a51ac59 100644 --- a/scripts/inject-mcp-hints.ts +++ b/scripts/inject-mcp-hints.ts @@ -125,8 +125,9 @@ function collectionItems(collection: any): any[] { // values into readable {param} templates, and attach the API key header — // the same masked-credential placeholder shape the ApiExplorer shows. function applyServerAndAuth(request: any, baseUrl: string): void { - request.url.protocol = undefined; - request.url.host = [baseUrl]; + const parsed = new URL(`https://${baseUrl.replace(/^https?:\/\//, "")}`); + request.url.protocol = parsed.protocol.replace(":", ""); + request.url.host = parsed.hostname.split("."); request.url.variables.each((variable: any) => { variable.value = `{${variable.key}}`; }); From f9ab673504e3085c9c6d3b90637032d68a3d0884 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Wed, 10 Jun 2026 04:11:21 +0300 Subject: [PATCH 10/18] fix(mcp): inject curl examples as
 to keep
 markdown unescaped

The MCP plugin converts page HTML to Markdown via rehype-remark and
remark-stringify, which escape `_` and `:` in plain text nodes per
CommonMark rules. Since the hidden curl example was a , its text
content came out of docs_fetch with stray backslashes (https\://,
session\_id, YOUR\_API\_KEY), making it unsafe to copy-paste directly.

Code blocks aren't escaped by remark-stringify, so switching to 
makes rehype-remark emit a fenced code block instead, preserving the
curl verbatim with real line breaks.
---
 scripts/inject-mcp-hints.ts | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts
index a51ac59..f51ffc6 100644
--- a/scripts/inject-mcp-hints.ts
+++ b/scripts/inject-mcp-hints.ts
@@ -166,7 +166,13 @@ function injectSpan(mdxContent: string, curl: string): string | null {
   // Curl text contains literal `{`/`}` (path templates, JSON bodies), which
   // MDX would otherwise try to parse as JS expressions in raw text. Wrapping
   // it as a JS string expression — {"..."} — sidesteps that entirely.
-  const span = `{${JSON.stringify(curl)}}\n\n`;
+  //
+  // 
, not : the MCP plugin converts page HTML to Markdown via
+  // rehype-remark/remark-stringify, which escapes `_` and `:` in plain text
+  // nodes (CommonMark rules) — turning `session_id` and `https://` into
+  // `session\_id` and `https\://` in the docs_fetch output. Code blocks are
+  // emitted verbatim, so 
 keeps the curl copy-paste-safe.
+  const span = `
{${JSON.stringify(curl)}}
\n\n`; const match = INJECTION_ANCHOR.exec(mdxContent); if (!match) return null; return mdxContent.slice(0, match.index) + span + mdxContent.slice(match.index); From 17762db7697516749b6f026f7b104a4eb074b008 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Wed, 10 Jun 2026 04:11:27 +0300 Subject: [PATCH 11/18] docs(apis): regenerate all pages with
-wrapped
 curl examples
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Output of npm run gen-api after the 
 injection fix — every hidden
curl example switches from  to 
 so docs_fetch returns a
clean, copy-paste-ready command instead of one with stray markdown
escape backslashes.
---
 docs/developers/apis/apple-native-payment.api.mdx               | 2 +-
 docs/developers/apis/auto-debit-2.api.mdx                       | 2 +-
 docs/developers/apis/auto-debit.api.mdx                         | 2 +-
 docs/developers/apis/cash-payment-acknowledgement-2.api.mdx     | 2 +-
 docs/developers/apis/cash-payment-acknowledgement.api.mdx       | 2 +-
 docs/developers/apis/create-invoice.api.mdx                     | 2 +-
 .../developers/apis/create-payment-transaction-checkout.api.mdx | 2 +-
 docs/developers/apis/delete-user-cards.api.mdx                  | 2 +-
 docs/developers/apis/download-report.api.mdx                    | 2 +-
 .../apis/full-update-payment-transaction-checkout.api.mdx       | 2 +-
 docs/developers/apis/get-payment-methods.api.mdx                | 2 +-
 docs/developers/apis/get-pre-payment-option.api.mdx             | 2 +-
 docs/developers/apis/get-user-cards.api.mdx                     | 2 +-
 docs/developers/apis/google-native-payment.api.mdx              | 2 +-
 docs/developers/apis/inquiry.api.mdx                            | 2 +-
 docs/developers/apis/list-reports.api.mdx                       | 2 +-
 docs/developers/apis/message-notifications.api.mdx              | 2 +-
 .../apis/partial-update-payment-transaction-checkout.api.mdx    | 2 +-
 docs/developers/apis/public-operations.api.mdx                  | 2 +-
 .../apis/retrieve-payment-transaction-checkout.api.mdx          | 2 +-
 docs/developers/apis/send-notification.api.mdx                  | 2 +-
 docs/developers/apis/send-specific-notification.api.mdx         | 2 +-
 docs/developers/apis/upload-attachment.api.mdx                  | 2 +-
 docs/developers/apis/wallet-accounts.api.mdx                    | 2 +-
 docs/developers/apis/wallet-entries.api.mdx                     | 2 +-
 docs/developers/apis/wallet-finalization-status.api.mdx         | 2 +-
 docs/developers/apis/wallet-native-payment.api.mdx              | 2 +-
 docs/developers/apis/wallet-operation-details.api.mdx           | 2 +-
 28 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/docs/developers/apis/apple-native-payment.api.mdx b/docs/developers/apis/apple-native-payment.api.mdx
index aaef174..49319a0 100644
--- a/docs/developers/apis/apple-native-payment.api.mdx
+++ b/docs/developers/apis/apple-native-payment.api.mdx
@@ -48,7 +48,7 @@ Typical use case: The merchant collects the Apple Pay token on their frontend an
 | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can add payment requests` or `Can add e-commerce payments` |
 
 
-{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/apple-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {\n    \"paymentData\": {\n      \"version\": \"string\",\n      \"data\": \"string\",\n      \"signature\": \"string\",\n      \"header\": {\n        \"ephemeralPublicKey\": \"string\",\n        \"wrappedKey\": \"string\",\n        \"publicKeyHash\": \"string\",\n        \"transactionId\": \"string\"\n      }\n    },\n    \"paymentMethod\": {\n      \"displayName\": \"string\",\n      \"network\": \"string\",\n      \"type\": \"string\"\n    },\n    \"transactionIdentifier\": \"string\"\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
+
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/apple-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {\n    \"paymentData\": {\n      \"version\": \"string\",\n      \"data\": \"string\",\n      \"signature\": \"string\",\n      \"header\": {\n        \"ephemeralPublicKey\": \"string\",\n        \"wrappedKey\": \"string\",\n        \"publicKeyHash\": \"string\",\n        \"transactionId\": \"string\"\n      }\n    },\n    \"paymentMethod\": {\n      \"displayName\": \"string\",\n      \"network\": \"string\",\n      \"type\": \"string\"\n    },\n    \"transactionIdentifier\": \"string\"\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"token\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"token\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/cash/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/cash/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/cash-payment/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/cash-payment/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\"\n}'"}
**Gateway permission**: `Can use pg_code` for the target [payment gateway](/developers/payments/payment-methods/) -{"curl --location 'https://ksa.ottu.dev/b/invoice/v1/invoice/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"payment_request\",\n \"invoice_number\": \"INV-001\",\n \"due_date\": \"2030-12-31\",\n \"currency_code\": \"KWD\",\n \"pg_codes\": [\n \"knet\"\n ],\n \"invoice_items\": [\n {\n \"sku\": \"ITEM-001\",\n \"description\": \"Product description\",\n \"unit_price\": \"10.000\",\n \"quantity\": \"1\"\n }\n ]\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/invoice/v1/invoice/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"payment_request\",\n  \"invoice_number\": \"INV-001\",\n  \"due_date\": \"2030-12-31\",\n  \"currency_code\": \"KWD\",\n  \"pg_codes\": [\n    \"knet\"\n  ],\n  \"invoice_items\": [\n    {\n      \"sku\": \"ITEM-001\",\n      \"description\": \"Product description\",\n      \"unit_price\": \"10.000\",\n      \"quantity\": \"1\"\n    }\n  ]\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"e_commerce\",\n \"amount\": \"10.000\",\n \"currency_code\": \"KWD\",\n \"pg_codes\": [\n \"knet\"\n ]\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"e_commerce\",\n  \"amount\": \"10.000\",\n  \"currency_code\": \"KWD\",\n  \"pg_codes\": [\n    \"knet\"\n  ]\n}'"}
{"curl --location --globoff --request DELETE 'https://ksa.ottu.dev/b/pbl/v2/card/{token}/?customer_id={customer_id}&type={type}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff --request DELETE 'https://ksa.ottu.dev/b/pbl/v2/card/{token}/?customer_id={customer_id}&type={type}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/{token}/download/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/{token}/download/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location --globoff --request PUT 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} +
{"curl --location --globoff --request PUT 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"amount\": \"string\",\n  \"currency_code\": \"string\",\n  \"pg_codes\": [\n    \"string\"\n  ],\n  \"type\": \"e_commerce\",\n  \"billing_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\"\n  },\n  \"branding_options\": {\n    \"payment_methods\": {}\n  },\n  \"loyalty\": {\n    \"enabled\": true,\n    \"reference\": \"string\",\n    \"metadata\": {}\n  },\n  \"shipping_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\",\n    \"email\": \"user@example.com\",\n    \"phone\": \"string\"\n  },\n  \"agreement\": {\n    \"id\": \"string\",\n    \"amount_variability\": \"fixed\",\n    \"start_date\": \"2024-07-29\",\n    \"expiry_date\": \"2024-07-29\",\n    \"max_amount_per_cycle\": \"string\",\n    \"cycle_interval_days\": 0,\n    \"total_cycles\": 0,\n    \"frequency\": \"irregular\",\n    \"type\": \"recurring\",\n    \"seller\": {\n      \"name\": \"string\",\n      \"short_name\": \"string\",\n      \"category_code\": \"string\"\n    }\n  },\n  \"attachment\": \"string\",\n  \"attachment_upload_url\": \"string\",\n  \"card_acceptance_criteria\": {\n    \"min_expiry_time\": 0\n  },\n  \"customer_birthdate\": \"2024-07-29\",\n  \"customer_email\": \"user@example.com\",\n  \"customer_first_name\": \"string\",\n  \"customer_id\": \"string\",\n  \"customer_last_name\": \"string\",\n  \"customer_phone\": \"string\",\n  \"customer_phone_2\": \"string\",\n  \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n  \"email_recipients\": [\n    \"user@example.com\"\n  ],\n  \"expiration_time\": \"string\",\n  \"generate_qr_code\": false,\n  \"include_sdk_setup_preload\": false,\n  \"initiator_id\": 0,\n  \"language\": \"en\",\n  \"notifications\": {\n    \"email\": [\n      \"created\"\n    ],\n    \"sms\": [\n      \"created\"\n    ],\n    \"whatsapp\": [\n      \"created\"\n    ]\n  },\n  \"order_no\": \"string\",\n  \"payment_instrument\": {\n    \"instrument_type\": \"apple_pay\",\n    \"payload\": {\n      \"paymentData\": {\n        \"version\": \"string\",\n        \"data\": \"string\",\n        \"signature\": \"string\",\n        \"header\": {\n          \"ephemeralPublicKey\": \"string\",\n          \"publicKeyHash\": \"string\",\n          \"transactionId\": \"string\"\n        }\n      },\n      \"paymentMethod\": {\n        \"displayName\": \"string\",\n        \"network\": \"string\",\n        \"type\": \"string\"\n      },\n      \"transactionIdentifier\": \"string\"\n    }\n  },\n  \"payment_type\": \"one_off\",\n  \"preload_checkout_page\": false,\n  \"product_type\": \"string\",\n  \"redirect_url\": \"string\",\n  \"shortify_attachment_url\": false,\n  \"shortify_checkout_url\": false,\n  \"unit_code\": \"string\",\n  \"vendor_name\": \"string\",\n  \"webhook_url\": \"string\"\n}'"}
**Gateway permission**: `Can use pg_code` — grants access to the specific [payment gateway](/developers/payments/payment-methods/) (e.g., "Can use Credit Card") -{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment-methods/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"plugin\": \"payment_request\",\n \"operation\": \"purchase\",\n \"currencies\": [\n \"KWD\"\n ],\n \"type\": \"sandbox\",\n \"tags\": [\n \"demo\"\n ]\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment-methods/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"plugin\": \"payment_request\",\n  \"operation\": \"purchase\",\n  \"currencies\": [\n    \"KWD\"\n  ],\n  \"type\": \"sandbox\",\n  \"tags\": [\n    \"demo\"\n  ]\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/api/sdk/v1/pre-payment-option-check/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"pg_code\": \"string\"\n}'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/api/sdk/v1/pre-payment-option-check/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"pg_code\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/card/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"sandbox\",\n \"customer_id\": \"sandbox\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/card/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"sandbox\",\n  \"customer_id\": \"sandbox\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/google-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"payload\": {\n \"apiVersion\": 0,\n \"apiVersionMinor\": 0,\n \"paymentMethodData\": {\n \"type\": \"string\",\n \"description\": \"string\",\n \"info\": {},\n \"tokenizationData\": {}\n },\n \"email\": \"user@example.com\",\n \"shippingAddress\": {}\n },\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/google-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"payload\": {\n    \"apiVersion\": 0,\n    \"apiVersionMinor\": 0,\n    \"paymentMethodData\": {\n      \"type\": \"string\",\n      \"description\": \"string\",\n      \"info\": {},\n      \"tokenizationData\": {}\n    },\n    \"email\": \"user@example.com\",\n    \"shippingAddress\": {}\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/inquiry/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/inquiry/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"order_no\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/?created_after={created_after}&created_before={created_before}&interval={interval}&limit={limit}&offset={offset}&source={source}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/?created_after={created_after}&created_before={created_before}&interval={interval}&limit={limit}&offset={offset}&source={source}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/message-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"order_no\": \"string\",\n \"channels\": [\n \"sms\",\n \"email\"\n ]\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/message-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"order_no\": \"string\",\n  \"channels\": [\n    \"sms\",\n    \"email\"\n  ]\n}'"}
{"curl --location --globoff --request PATCH 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} +
{"curl --location --globoff --request PATCH 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"amount\": \"string\",\n  \"currency_code\": \"string\",\n  \"pg_codes\": [\n    \"string\"\n  ],\n  \"type\": \"e_commerce\",\n  \"billing_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\"\n  },\n  \"branding_options\": {\n    \"payment_methods\": {}\n  },\n  \"loyalty\": {\n    \"enabled\": true,\n    \"reference\": \"string\",\n    \"metadata\": {}\n  },\n  \"shipping_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\",\n    \"email\": \"user@example.com\",\n    \"phone\": \"string\"\n  },\n  \"agreement\": {\n    \"id\": \"string\",\n    \"amount_variability\": \"fixed\",\n    \"start_date\": \"2024-07-29\",\n    \"expiry_date\": \"2024-07-29\",\n    \"max_amount_per_cycle\": \"string\",\n    \"cycle_interval_days\": 0,\n    \"total_cycles\": 0,\n    \"frequency\": \"irregular\",\n    \"type\": \"recurring\",\n    \"seller\": {\n      \"name\": \"string\",\n      \"short_name\": \"string\",\n      \"category_code\": \"string\"\n    }\n  },\n  \"attachment\": \"string\",\n  \"attachment_upload_url\": \"string\",\n  \"card_acceptance_criteria\": {\n    \"min_expiry_time\": 0\n  },\n  \"customer_birthdate\": \"2024-07-29\",\n  \"customer_email\": \"user@example.com\",\n  \"customer_first_name\": \"string\",\n  \"customer_id\": \"string\",\n  \"customer_last_name\": \"string\",\n  \"customer_phone\": \"string\",\n  \"customer_phone_2\": \"string\",\n  \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n  \"email_recipients\": [\n    \"user@example.com\"\n  ],\n  \"expiration_time\": \"string\",\n  \"generate_qr_code\": false,\n  \"include_sdk_setup_preload\": false,\n  \"initiator_id\": 0,\n  \"language\": \"en\",\n  \"notifications\": {\n    \"email\": [\n      \"created\"\n    ],\n    \"sms\": [\n      \"created\"\n    ],\n    \"whatsapp\": [\n      \"created\"\n    ]\n  },\n  \"order_no\": \"string\",\n  \"payment_instrument\": {\n    \"instrument_type\": \"apple_pay\",\n    \"payload\": {\n      \"paymentData\": {\n        \"version\": \"string\",\n        \"data\": \"string\",\n        \"signature\": \"string\",\n        \"header\": {\n          \"ephemeralPublicKey\": \"string\",\n          \"publicKeyHash\": \"string\",\n          \"transactionId\": \"string\"\n        }\n      },\n      \"paymentMethod\": {\n        \"displayName\": \"string\",\n        \"network\": \"string\",\n        \"type\": \"string\"\n      },\n      \"transactionIdentifier\": \"string\"\n    }\n  },\n  \"payment_type\": \"one_off\",\n  \"preload_checkout_page\": false,\n  \"product_type\": \"string\",\n  \"redirect_url\": \"string\",\n  \"shortify_attachment_url\": false,\n  \"shortify_checkout_url\": false,\n  \"unit_code\": \"string\",\n  \"vendor_name\": \"string\",\n  \"webhook_url\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/operation/' \\\n--header 'Tracking-Key: Tracking-Key: your_operation_tracking_key' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\",\n \"operation\": \"delete\",\n \"amount\": \"string\",\n \"extra\": {},\n \"destination\": \"pg\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/operation/' \\\n--header 'Tracking-Key: Tracking-Key: your_operation_tracking_key' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"order_no\": \"string\",\n  \"session_id\": \"string\",\n  \"operation\": \"delete\",\n  \"amount\": \"string\",\n  \"extra\": {},\n  \"destination\": \"pg\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/send-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"channel\": \"email\",\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/send-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"channel\": \"email\",\n  \"template_id\": \"payment-request-mail\",\n  \"to\": \"customer@example.com\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/pbl/v2/notifications/send/{channel}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/pbl/v2/notifications/send/{channel}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"template_id\": \"payment-request-mail\",\n  \"to\": \"customer@example.com\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/upload-attachment/' \\\n--header 'Content-Type: multipart/form-data' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--form 'file=@\"/path/to/file\"' \\\n--form 'shortify_attachment_url=\"false\"' \\\n--form 'order_no=\"\"' \\\n--form 'session_id=\"\"'"} +
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/upload-attachment/' \\\n--header 'Content-Type: multipart/form-data' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--form 'file=@\"/path/to/file\"' \\\n--form 'shortify_attachment_url=\"false\"' \\\n--form 'order_no=\"\"' \\\n--form 'session_id=\"\"'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/accounts/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/accounts/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"customer_id\": \"sandbox-usd\",\n  \"currency\": \"USD\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/entries/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/entries/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"customer_id\": \"sandbox-usd\",\n  \"currency\": \"USD\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/wallet/payment-sessions/{session_id}/finalization-status/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/wallet/payment-sessions/{session_id}/finalization-status/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/wallet/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"payload\": {},\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/wallet/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {},\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"operation_id\": 0\n}'"} +
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"operation_id\": 0\n}'"}
Date: Wed, 10 Jun 2026 04:52:28 +0300 Subject: [PATCH 12/18] fix(mcp): make injection anchor regex whitespace-agnostic INJECTION_ANCHOR required Date: Wed, 10 Jun 2026 05:30:13 +0300 Subject: [PATCH 13/18] fix(mcp): fail hard and report source-level vs per-operation injection failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously a missing servers[0].url silently returned {injected: 0, failures: []} from processSource, which main() treated as success even though every operation in that source was skipped. Add an optional SourceResult.error field for source-level failures (distinct from per-operation failures) and report both separately. Either kind of failure now exits with code 1, and the "Done — N file(s) patched" summary only prints on a fully clean run. --- scripts/inject-mcp-hints.ts | 44 ++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts index b97ace0..5eb69c6 100644 --- a/scripts/inject-mcp-hints.ts +++ b/scripts/inject-mcp-hints.ts @@ -180,7 +180,16 @@ function injectSpan(mdxContent: string, curl: string): string | null { return mdxContent.slice(0, match.index) + span + mdxContent.slice(match.index); } -async function processSource(enrichedSpecPath: string): Promise { +interface SourceResult { + injected: number; + failures: string[]; + // Set when the whole source couldn't be processed at all — distinct from + // `failures`, which are per-operation. One bad source means every + // operation in it was skipped, not "N operations failed." + error?: string; +} + +async function processSource(enrichedSpecPath: string): Promise { if (!fs.existsSync(enrichedSpecPath)) { console.error(` ERROR: Enriched spec not found: ${enrichedSpecPath}`); console.error(` Run "npm run enrich-api" first.`); @@ -190,8 +199,7 @@ async function processSource(enrichedSpecPath: string): Promise { const spec = yaml.load(fs.readFileSync(enrichedSpecPath, "utf-8")) as any; const baseUrl = spec.servers?.[0]?.url; if (!baseUrl) { - console.warn(` WARN: Spec has no servers[0].url — skipping curl generation`); - return 0; + return { injected: 0, failures: [], error: "Spec has no servers[0].url — skipping curl generation for all operations" }; } // Dereferenced copy: operation matching and body example generation both @@ -203,6 +211,7 @@ async function processSource(enrichedSpecPath: string): Promise { const collection = await buildPostmanCollection(spec); let injected = 0; + const failures: string[] = []; for (const item of collectionItems(collection)) { const request = item.request; @@ -218,21 +227,21 @@ async function processSource(enrichedSpecPath: string): Promise { try { curl = await generateCurl(request); } catch (err) { - console.warn(` WARN: Failed to generate curl for ${matcher.operationId}: ${err}`); + failures.push(`Failed to generate curl for ${matcher.operationId}: ${err}`); continue; } const filename = operationIdToFilename(matcher.operationId); const mdxPath = path.join(API_DOCS_DIR, filename); if (!fs.existsSync(mdxPath)) { - console.warn(` WARN: No .api.mdx found for ${matcher.operationId} (expected ${filename})`); + failures.push(`No .api.mdx found for ${matcher.operationId} (expected ${filename})`); continue; } const original = fs.readFileSync(mdxPath, "utf-8"); const patched = injectSpan(original, curl); if (patched === null) { - console.warn(` WARN: Injection anchor not found in ${filename}`); + failures.push(`Injection anchor not found in ${filename}`); continue; } @@ -241,7 +250,7 @@ async function processSource(enrichedSpecPath: string): Promise { injected++; } - return injected; + return { injected, failures }; } async function main(): Promise { @@ -249,11 +258,30 @@ async function main(): Promise { const config = yaml.load(fs.readFileSync(SOURCES_FILE, "utf-8")) as ApiSourcesConfig; let total = 0; + const failures: string[] = []; + const sourceErrors: string[] = []; for (const [name, source] of Object.entries(config.sources)) { console.log(`\n ── ${name} ──`); const enrichedSpecPath = path.resolve(ROOT, source.enrichedOutput); - total += await processSource(enrichedSpecPath); + const result = await processSource(enrichedSpecPath); + total += result.injected; + failures.push(...result.failures); + if (result.error) sourceErrors.push(`${name}: ${result.error}`); + } + + if (sourceErrors.length > 0) { + console.error(`\n ${sourceErrors.length} source(s) could not be processed:`); + for (const error of sourceErrors) console.error(` - ${error}`); + } + + if (failures.length > 0) { + console.error(`\n ${failures.length} curl example(s) failed to inject:`); + for (const failure of failures) console.error(` - ${failure}`); + } + + if (sourceErrors.length > 0 || failures.length > 0) { + process.exit(1); } console.log(`\n Done — ${total} file(s) patched\n`); From 6afecc0c2b7e56c2908c04a03c1b4f5ff908ba02 Mon Sep 17 00:00:00 2001 From: Dacian Popute Date: Wed, 10 Jun 2026 10:26:42 +0300 Subject: [PATCH 14/18] docs: display sandbox.ottu.net (not ksa.ottu.dev) in all code samples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Policy: docs.ottu.com must advertise only the public sandbox merchant sandbox.ottu.net. This switches every DISPLAYED host to sandbox.ottu.net: - checkout-sdk/web.mdx: merchant_id x11 -> sandbox.ottu.net - src/constants/api.ts: OTTU_CONNECT_BASE_URL -> sandbox.ottu.net (flows into the reports / psq / invoices / wallet curl + response samples) - getting-started/api-fundamentals.md: "shared sandbox" prose -> sandbox.ottu.net NOT changed here (the LIVE surfaces): the interactive demos (ACTIVE_CONNECT), the API-explorer "try it", and the wallet-seed backend still run on ksa.ottu.dev. They can only move once wallet exists on sandbox.ottu.net — verified today it does NOT (0 wallet gateways on sandbox.ottu.net vs 15 on ksa.ottu.dev). See the ACTIVE_CONNECT comment in src/utils/sandbox.ts. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../getting-started/api-fundamentals.md | 4 ++-- docs/developers/payments/checkout-sdk/web.mdx | 22 +++++++++---------- src/constants/api.ts | 7 +++--- src/utils/sandbox.ts | 18 +++++++-------- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/docs/developers/getting-started/api-fundamentals.md b/docs/developers/getting-started/api-fundamentals.md index e73ff7a..e8489dc 100644 --- a/docs/developers/getting-started/api-fundamentals.md +++ b/docs/developers/getting-started/api-fundamentals.md @@ -20,7 +20,7 @@ POST https://.ottu.net/b/checkout/v1/pymt-txn/ There are no separate sandbox and production URLs. The **MID (Merchant Identification Number)** configuration in the Ottu admin panel determines whether a payment gateway runs in sandbox or production mode. You can test with: - **Your own instance** — configure a MID as sandbox in the admin panel. Recommended for testing your specific gateway configuration. -- **Shared sandbox** — `ksa.ottu.dev` has all payment gateways active in sandbox mode. Useful for quick tests without configuring your own instance. +- **Shared sandbox** — `sandbox.ottu.net` has all payment gateways active in sandbox mode. Useful for quick tests without configuring your own instance. ::: ## API Endpoints @@ -197,7 +197,7 @@ When you exceed the limit, the API returns `429 Too Many Requests`. Implement ex | Option | URL | Best for | |--------|-----|----------| -| **Shared sandbox** | `ksa.ottu.dev` | Quick tests — all gateways active, public credentials available | +| **Shared sandbox** | `sandbox.ottu.net` | Quick tests — all gateways active, public credentials available | | **Your own instance** | `.ottu.net` | Integration testing — verify your specific MID and gateway configuration | **Recommended workflow:** Start with the shared sandbox for rapid prototyping, then switch to your own instance to test with your actual gateway configuration before going live. diff --git a/docs/developers/payments/checkout-sdk/web.mdx b/docs/developers/payments/checkout-sdk/web.mdx index 2113432..2052925 100644 --- a/docs/developers/payments/checkout-sdk/web.mdx +++ b/docs/developers/payments/checkout-sdk/web.mdx @@ -251,7 +251,7 @@ Checkout.init({ ```javascript Checkout.init({ selector: "checkout", - merchant_id: 'ksa.ottu.dev', // use your merchant id + merchant_id: 'sandbox.ottu.net', // use your merchant id session_id: 'session_id', apiKey: 'apiKey', theme: { @@ -338,7 +338,7 @@ Checkout.init({ ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", theme: { @@ -379,7 +379,7 @@ Checkout.init({ ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", googlePayInit: { @@ -447,7 +447,7 @@ Checkout.init({ ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", theme: { @@ -480,7 +480,7 @@ However, Google Pay supports an additional property `buttonSizeMode` property, w ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", theme: { @@ -559,7 +559,7 @@ However, `stcPay` and `urPay` can supported any `css` collor in `buttonColor.` ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", lang: "en", @@ -617,7 +617,7 @@ In addition to above properties, users have the capability to customize the Appl ```javascript Checkout.init({ selector: "checkout", - merchant_id: 'ksa.ottu.dev', // use your merchant id + merchant_id: 'sandbox.ottu.net', // use your merchant id session_id: 'session_id', apiKey: 'apiKey', // Default values configured for Apple Pay @@ -958,7 +958,7 @@ Onsite Checkout is loaded when `'jazz'` is part of the [`formsOfPayment`](#forms ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id apiKey: "", session_id: "", formsOfPayment: ["jazz", "tokenPay", "applePay"], @@ -1238,7 +1238,7 @@ window.successCallback = (data) => { }; Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", }); @@ -1588,7 +1588,7 @@ function unfreezeBasket() { Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", lang: "en", @@ -1694,7 +1694,7 @@ Checkout init function ```javascript Checkout.init({ selector: "checkout", - merchant_id: "ksa.ottu.dev", // use your merchant id + merchant_id: "sandbox.ottu.net", // use your merchant id session_id: "session_id", apiKey: "apiKey", lang: "en", // en or ar default en diff --git a/src/constants/api.ts b/src/constants/api.ts index 2fe1b15..b7494b5 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -1,7 +1,6 @@ -// Base URL for all API code samples and interactive demos. -// Points at Ottu's KSA dev environment (`ksa.ottu.dev`), which currently -// hosts the full public API surface including wallet endpoints. -export const OTTU_CONNECT_BASE_URL = "https://ksa.ottu.dev"; +// Base URL shown in all API code samples — the host developers copy. +// docs.ottu.com advertises the public sandbox `sandbox.ottu.net` only. +export const OTTU_CONNECT_BASE_URL = "https://sandbox.ottu.net"; // Backwards-compatible alias. Historically `OTTU_DEV_BASE_URL` pointed at // `ksa.ottu.dev` for APIs not yet on the public sandbox; both constants now diff --git a/src/utils/sandbox.ts b/src/utils/sandbox.ts index d2bf9ef..9864815 100644 --- a/src/utils/sandbox.ts +++ b/src/utils/sandbox.ts @@ -30,16 +30,14 @@ export const KSA: ConnectEnv = { sdkApiKey: "88a460b42a0f8bec4011da23ce1d547bd04e8afc", }; -// ⬇️ THE GLOBAL SWITCH — change this one line to retarget every demo on the site. -// Both branches (dev → docs.ottu.dev, main → docs.ottu.com) currently use KSA: -// it is the only environment that hosts the full public API surface + wallet, -// so every demo and every code sample (via OTTU_CONNECT_BASE_URL) resolves the -// host through here. -// -// Do NOT point main at SANDBOX — sandbox.ottu.net has no wallet PG, so the -// WalletDemo and every wallet code sample would break in production. Move to a -// per-branch ConnectEnv (or a build-time env override) only once a -// production-grade sandbox also hosts wallet. +// ⬇️ THE GLOBAL SWITCH for the LIVE interactive demos (Checkout / Recurring / +// PaymentJourney / Wallet) + the API-explorer "try it". docs.ottu.com must +// advertise only sandbox.ottu.net; the static code samples already do +// (OTTU_CONNECT_BASE_URL). These LIVE surfaces stay on KSA for now ONLY because +// the wallet demo needs a wallet-enabled gateway — present on ksa.ottu.dev, +// absent on sandbox.ottu.net (verified: 0 wallet PGs vs 15 on KSA). Flip to +// SANDBOX once a wallet-enabled sandbox.ottu.net merchant + the sandbox wallet +// service/Keycloak (mcp-server/config.mjs) exist. export const ACTIVE_CONNECT: ConnectEnv = KSA; export interface CreateSessionOptions { From d70775c1338104734aa8edb5085000fdad0096dc Mon Sep 17 00:00:00 2001 From: Dacian Popute Date: Wed, 10 Jun 2026 10:48:45 +0300 Subject: [PATCH 15/18] fix(wallet-demo): correct stale error tag "docs" -> "demo" The WalletDemo filters wallet gateways with tags: ["demo"] (WALLET_DEMO.pgFilter), but the "no wallet gateway" error message told users to tag the PG "docs". The API rejects tags: ["docs"] outright (HTTP 400, "docs" is not a valid choice), so the guidance was actively wrong. Align the message with the actual filter + the working KSA config. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/components/WalletDemo/WalletDemoInner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/WalletDemo/WalletDemoInner.tsx b/src/components/WalletDemo/WalletDemoInner.tsx index 8711e94..5396ef5 100644 --- a/src/components/WalletDemo/WalletDemoInner.tsx +++ b/src/components/WalletDemo/WalletDemoInner.tsx @@ -111,7 +111,7 @@ export default function WalletDemoInner() { if (pgCodes.length === 0) { dispatch({ type: "ERROR", - message: `No wallet-capable gateways for ${WALLET_DEMO.currency} on the active merchant. Enable a PG with payment_services: ["wallet"] tagged "docs".`, + message: `No wallet-capable gateways for ${WALLET_DEMO.currency} on the active merchant. Enable a PG with payment_services: ["wallet"] tagged "demo".`, }); return; } From a4f716a76bf1d573025f23ac73356a0e4c139337 Mon Sep 17 00:00:00 2001 From: Suliman Awad Date: Wed, 10 Jun 2026 13:07:17 +0300 Subject: [PATCH 16/18] fix(mcp): make curl injection idempotent on already-patched files injectSpan had no way to detect an existing injection, so re-running inject-mcp-hints standalone (without a clean-api-docs pass first) would prepend a second hidden curl block into every already-patched .api.mdx file. Skip files that already contain the injection marker. --- scripts/inject-mcp-hints.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/inject-mcp-hints.ts b/scripts/inject-mcp-hints.ts index 5eb69c6..032a5a8 100644 --- a/scripts/inject-mcp-hints.ts +++ b/scripts/inject-mcp-hints.ts @@ -38,6 +38,11 @@ const API_DOCS_DIR = path.join(ROOT, "docs", "developers", "apis"); // regardless of how docusaurus-plugin-openapi-docs formats the JSX between them. const INJECTION_ANCHOR = / keeps the curl copy-paste-safe. - const span = `
{${JSON.stringify(curl)}}
\n\n`; + const span = `${INJECTED_MARKER}{${JSON.stringify(curl)}}
\n\n`; const match = INJECTION_ANCHOR.exec(mdxContent); if (!match) return null; return mdxContent.slice(0, match.index) + span + mdxContent.slice(match.index); @@ -239,6 +244,8 @@ async function processSource(enrichedSpecPath: string): Promise { } const original = fs.readFileSync(mdxPath, "utf-8"); + if (original.includes(INJECTED_MARKER)) continue; + const patched = injectSpan(original, curl); if (patched === null) { failures.push(`Injection anchor not found in ${filename}`); From bac96a9b4de9c4f96c012cfd1ba45b560c55998f Mon Sep 17 00:00:00 2001 From: Dacian Popute Date: Wed, 10 Jun 2026 19:41:59 +0300 Subject: [PATCH 17/18] feat(sandbox): run live demos + API reference on sandbox.ottu.net Wallet is now live on sandbox.ottu.net (PG `ottu-sandbox-usd`, USD), so the last KSA-pinned surfaces move to the public sandbox merchant: - ACTIVE_CONNECT -> SANDBOX: Checkout / Recurring / PaymentJourney / Wallet demos now run against sandbox.ottu.net - WALLET_DEMO currency KWD -> USD (the sandbox wallet PG is USD-only) - API-explorer "try it" + auto-generated MCP curls: base URL -> sandbox.ottu.net. The enrich script now forces `servers` from `_variables.yaml` sandboxUrl, so gen-api (incl. inject-mcp-hints) stays correct after a raw-spec re-fetch; the explorer's demo key now tracks ACTIVE_CONNECT instead of a hardcoded KSA key - regenerated docs/developers/apis/ (servers + MCP curls now sandbox.ottu.net) - raw static/Ottu_API.yaml servers URL -> sandbox.ottu.net NOTE: the wallet SEED backend (mcp-server/server.mjs -> KSA_OTTU_DEV) still mints on KSA's wallet service. The wallet demo's seed->pay flow needs sandbox.ottu.net's wallet service URL + Keycloak realm/clientId + secret before it works end-to-end. Discovery + session + display are already on sandbox.ottu.net. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/developers/apis/apple-native-payment.api.mdx | 4 ++-- docs/developers/apis/auto-debit-2.api.mdx | 4 ++-- docs/developers/apis/auto-debit.api.mdx | 4 ++-- .../apis/cash-payment-acknowledgement-2.api.mdx | 4 ++-- .../apis/cash-payment-acknowledgement.api.mdx | 4 ++-- docs/developers/apis/create-invoice.api.mdx | 4 ++-- .../create-payment-transaction-checkout.api.mdx | 4 ++-- docs/developers/apis/delete-user-cards.api.mdx | 4 ++-- docs/developers/apis/download-report.api.mdx | 4 ++-- ...ull-update-payment-transaction-checkout.api.mdx | 4 ++-- docs/developers/apis/get-payment-methods.api.mdx | 4 ++-- .../developers/apis/get-pre-payment-option.api.mdx | 4 ++-- docs/developers/apis/get-user-cards.api.mdx | 4 ++-- docs/developers/apis/google-native-payment.api.mdx | 4 ++-- docs/developers/apis/inquiry.api.mdx | 4 ++-- docs/developers/apis/list-reports.api.mdx | 4 ++-- docs/developers/apis/message-notifications.api.mdx | 4 ++-- ...ial-update-payment-transaction-checkout.api.mdx | 4 ++-- docs/developers/apis/public-operations.api.mdx | 4 ++-- .../retrieve-payment-transaction-checkout.api.mdx | 4 ++-- docs/developers/apis/send-notification.api.mdx | 4 ++-- .../apis/send-specific-notification.api.mdx | 4 ++-- docs/developers/apis/upload-attachment.api.mdx | 4 ++-- docs/developers/apis/wallet-accounts.api.mdx | 4 ++-- docs/developers/apis/wallet-entries.api.mdx | 4 ++-- .../apis/wallet-finalization-status.api.mdx | 4 ++-- docs/developers/apis/wallet-native-payment.api.mdx | 4 ++-- .../apis/wallet-operation-details.api.mdx | 4 ++-- scripts/enrich-api-spec.ts | 8 ++++++++ src/theme/ApiExplorer/Authorization/index.tsx | 7 ++++--- src/utils/sandbox.ts | 14 ++++++-------- src/utils/walletDemoConfig.ts | 7 ++++--- static/Ottu_API.yaml | 2 +- static/api-enrichments/_variables.yaml | 2 +- 34 files changed, 80 insertions(+), 72 deletions(-) diff --git a/docs/developers/apis/apple-native-payment.api.mdx b/docs/developers/apis/apple-native-payment.api.mdx index 49319a0..f02c7ed 100644 --- a/docs/developers/apis/apple-native-payment.api.mdx +++ b/docs/developers/apis/apple-native-payment.api.mdx @@ -5,7 +5,7 @@ description: "Allows merchants to submit an Apple Pay payment directly via serve sidebar_label: "Native Payment API(Apple Pay)" hide_title: true hide_table_of_contents: true -api: eJztff1yGze256ugmK2SlWlSH7ZjW/vHXkV2MtqJY61lJzVleUmwGyQxagIdAC2KY7vqPsR9hvtg90m2zjkAGt1sSlQmU/furlOVhCK78XFwcD5/B/g00JUw3EmtzovByYBXVSnGijt5I8YVXy+FcoNsUAibG1nBY4OTwWlZ6pVlS2HyBVfOMqeZradL6RhX7BSaYBd8zfz7rJBG5K5csxvJmRXmRpih00P6xKRyYk5DGLF3C2mZUEWlpXLMiN9qaYRllZE33Al2LdaM124hlJM5vsK4Kpi4rUTuLOPshpeySIbg9LVQzDpT5642gknF3EJgw8I6GGGpecFqVQjDJv7PyYhdqSv1bl3JnJestoLl3IoT9m4h4qxZrssSe4UGuz1q7EcaNjNaOaEKHKcVqrBMOiCYa82Ul1rN2Uq6BbPC2jAxvtS1ckyqmTZLItGV+uabb9iFMEuJz1kY6md2WrsFey3cQhfsM3tLhCvS59jnK/V5OBziv/DKh9OLc/YXsf746KAQN6IETrAHc+GcVPOhddw4URy0yX3wDa/k8Fqsh/D9PvvMTsuSVUkvj3ixlIrxPBfW7jPq6XtuZY5jfFhnU3gvdjU544rxooiM5ZfRTpg2za9imOslLJMID9oJjGOQDRyf28HJh8GFb+BNYH47+JgNfHPf62I9OPk0yHHlHHyEbREG9TcLm+DTwOYLseTwya0rMTgZ6OnfRA67pTIwOyeFhV89U+30IAzqJXfYKi/LN7PByYf7XrsRxkoakn/QOiPVfPAlGxS+rY0frJwrDjui99eF4IUwDxmEqBZiKQwvL+ppKfO/iHVvwyvDq0oU236uwst/5nbR+4QzXFmeB3m18cQXWkXgfVjndoPd1z9mAyddCe//mWb85WNX1p2ZdeX03PBqIXNGhAGJUMAeLkQOP3ckQBR73PERO1d5WReCxASNB8XYgttFxiLdkp8y5slEf4AcSMbNzl+ONuaJ6xzXLV3eLPJHMlsc60XCbpvzfqVwaqLYMjEGu4NLJdWcZuZ/I4mVNWLy/CVNQbuFMK2JFMJxWVov9IMoljaQVRRsum41PudOrFDGslwvq1I4gb8nrY6Qj+h5EocPYeNC2qrk65/5sn9jKOFW2lz3syZ+cR9Hpj007fm3kyW6aE1hc31e4l/TwFeeQEtSAFaAZmrol9fW6aUwGZPIjbBoOTcF8/2zR2I0H2XsF2n5fsZgLOGrQkyl26cl9GNnii/FaGM3gtyeSRIb9+zKhPO6i7Wt0R7ufQeaFpd7Ps51kRD/Q+g5G6i6LAcb1ANFXiv5Wy2Yf5n29EwbUsyBoFKB7QAfccJeN49lj+zZsJJCDzLOwrffrFe6HR75xvc3t3dQIa0B9FDkZ7TbPOtgK6niuh2uVqshWBLD2pRCwbSLr5rsqyb7qsm+arKvmuyrJvsvrcmWdelkxY07QA0W9MFX3fVVd33VXV9111fd9VV3/RfVXa1mnKkFTiGvjXRr3A0+Dovx0cHJh49fsk+DJmKK32B00lZaWdoix4eHf2SIcj6uuOFLe/cubVP2ZwhJl/LvotiQDGGoDFsVThg7Ym+cq9mSV5bdcCMhNv1jfNBCFgBi4sIKNpO3wARSlIXNmNVsrWuWc4WZAlMZ4ZIAsK1LZ0EMWmmBFCX0PuemKIW1TM/YaiHzRRxZZTTEpUFxdCQWe29FHAB0jVwneAGNVNzYIGMNX7GJb28cJjBhRKXRBm0heB03Roc3a7fQRv6dEhnI/0a42qjtMjewblfWghwZB9m3uctQlugZiRvcY16wXA1yIwrprgbwGcUMfayMqLgsrgb7TfsLXXqDpN3DD3VZojiCLlDScVPQw4xD8kbfyGLrnGL79MZYLLksNzt5BV9DfN/4hW13lDE527mnsbitpFmPl1q5RU9X+CvDX9OeGqIdHhGVjo5bBPLNrgXvoZJvFX7sb/T48PgpNQv/p2ZndVmOk7a3EB8boicgxfX69cFf/wo5Efzw178ySh9lsBpdDtugjaqX075Vfs3ttSi8xsJn2KOL05/3U5kt2rI0zOzJEfzzLf4Dn1pEk9bWff0B38JvsO+mXF3DfGZScZVLXuLmlK7GfhJqYrNGzDab+5HmObSVyOVM5syImTBC5b2qobu/SND0D1I1gjCdPb0CCcBl71aO1Dk7vXj3/u2rl7T2pxcXb9/8Ev56+ersp/Of4a/9oOvza6/4OiOBX4BWyWy4BRP0bmliRK5VLkvJG8NNWzcuuNsiTOCXjbVewUbXFpJ4VjhX3r0Jkzd7J/OedHbawe7TSo3P3tZD9i9d9y2rlCXcHQgMRlgf1ebjpbCWz3vI9ud6ydXQCF7waQk5ZHxuO2/Q29OgclI66Nrl2lt+RuRCVm6s9GaXb+m3sFXnQkGq8+GaJV2qvn7eJWPzfXXXJ9JSz5xQrJAz3Hlhb7R4AfssRC6DN73Jf765PYvioGThaZ907xdBp2dnry7e0aZ6++p/vjqLn385f/VrjxTf7PssEbK4ByDNHUbTyBWStU1z3sHqUf9FIeEj9/LbP+gtiT5Z3cfoRZ4DUEOYMTl9/TSLQILQjjB7luW1AQm4ZquFUOzlWvGlzNlZ+PZMK++2skcvz872wStEM1MUna5DQ/2dh+5KDXCK2CkaPNTz2VnSdrNo7y+9GHz1/m1YoqZTcQu+7VyMzVZRFR5h8EhsH1gduszj/Gg3mR6GeyuckeKGl+xt1Bc/E5v/x7/+G+M97kUqMSIjllpf15WNHlztwNizuqz9TvuSeJ0/XpA1TmY/L96ock2uQ58LNYnm+4RM1xAVIK80sBUKixtRsCu1Ve7kvCynPL/2hnB4lRvBrlS0rpxmte1sbsZnDrY+zN5AWCXGBqBD3utr8bgBynXWmsaVInsfgzYp/IXpKcwMCAxzwIfAtVqzKxVAPUteCELYbE7QOu5qy/KFyK/Z6cU5IH1g7fncCLEMrtSOHtClMBIVv4HuwA714CJgcZDdGKJpg3cwyiJtgDYRo0wF6hVQDRBUMYK7tJmAYqEg1EKwix8tTVcaQZ5y2smGC7KLn3zuCJllQe70cXXQD5FSTFjHp6W0C1EQcimKlhEipU7jk+cvGYQsoOHc1Gi/GV0K7Ep1O8m1MaJEVdVM3FqdS/wOe+IxmMK0KfC/TKobLXORsYWcL0o5X7igPpXwdCbk1Q03azblsEu9xujpcoR4oSW//UmoOTgJR8fPgU9Qjo7Bg+VTWaIH/2kgVL2ECAF6rhDsw59LCiV1yH6LmmIIrwxhYQZPn76YPXv+4rv8xZP88MXx076lKcRMKvCSZz1hPvSNcVJIG8HzRds0k27hBX9cvBF7perlCZvgkCcZm4QxTyjEAoCsaAN250C8NjgZ4AN9Mgn1I/SN3nebb9q8AivivfJmvadiLpXFkXif6vcPxRsJMKBaOVn2jsmA16ks4Qex3yW/9Rp1XIGGW+flPQMQuVzysncM2FExrCut2JLfymW9DIsHfIlirJA3sqghBu1XN1k3K4wURA8cyBhDITe8HBd8bZNhIZgSg8++m8HJ4+++ywZLqeivo77hebtNzxg0x6bCrYRQxEkbYoisQu14SUS5p/sXL17c1z02lgwiEICa7+VfVtSmMb1nKPq9/RE2ozRGzOuSw2gKLsv1IBushLjGD1YsJbn/+Gfz6bcakIimeYgrVYOCGmQDcN3xA0bRd9rcs2fF4+Nnz6fi8MXx0fPZYQ93QJxTGK+vSWvF+STUsJv8gPITOYshZ3WF8GWdLxi3J2wSaQE7HYkBH4ga8MnPHz5GAsAfLQrAF0SCCUWiJ0iHyYj9CkbcBIgxYVag6TqpFUQfi7ok8RKnNGF2oeuyiA82YxuRLg5hrLCQ4gYcORTYg2wAjj8vSw9Mjtw5yAZJjw9aI/7sOT98+mx2eHhcPOfPc1yjGUd/v9XBHXE1ApyCYmtY1C24S+Qc2ERxhUJi5oRNYg8T9ugl9bufbdCPSJ2xSUIN+DMhR6CfFWX5sLyh6s209E3YoEWI1rwzHFMYlIfo0ZV2oY0b79b26XRqxI3kaTxnS18Zs7V0aCyB7AzOBVh2XjRQgqQzpu+eoEPmxFybdSdTsT158GRYyLl05KvkJXi2s3WMBDcDnNYWFHS0igNjzLUuLFgnYFzJXCD6W4P/azfHl7gA0Xa6pMXsSz1523yqa9caThbMhIYVpSX7p2GWxtAZ9Pa7g+9xqlomIDgdhucOVBg3BtyuHnWfefXLfexbWAzvQwUB7ANRgo2ujSC8fD21KDYgrF87Cba2x9U3qaHGN4ApRje8qk2lrQiJzRxlDoDelhW3Nh2hZaW87rW3Z+nCWZKmbKmnshQ4tkAMm6WkHZJt2WqlqmG/W2Gzds+o/YvhQucsX3AzF34wPM/ROnC6GtaVzTD4CaNxXBUQLJCqqK0zkNEAMy8PL1ZC8dKtY2vwEmDzRQHuL9Qa0KpjhcPP2okTdj6DJaBCDEWxNsusLmEtYF1wOWLW2bNdx78FD0Q62QkwYXUHabQa8uAZfFYht+dTQ2xudF0FraC0Y1PKA6Jqb4Ia3a16N3O+FEo7n5cl+8LWyyBZepzRwJeRQ/y7ubYuvmY0sGjBpBPL1q7OINLgU7pcrZmtIRcIfYBZPhMCn/ZrkswrDQ7tKqxD/GSrDGsT5k4admMdlREW+bIhmzdT76ecTCEWLbJ53u+hG5vWzpMOzBm1TmICXbJ1VcxhMEP/MeaA5TZiIZSVN2HOd01WqlybSoP1CYkJHYSbkSqXVUMwLN+BCTWuK0yI7FWxw8L1hnp+EGKCvgJoMpoA8HUh7bQ2dhNr4PefBCpqK1QTfeskwUcMhEFGezMJ0cGeRN8yxozij9vyPt5t6wTn7rctmnAcheti+8lw4hNF3fJJSMjf8LIGQT5rCrOwJQw8lhjeymv08zez++1tRWsUGCxN8uPqeuW7i5LsMBhYvXoWmCRI07B3TtLgayEyduqBPO9gHBn7QQgfWK5Ano4LUcobYdZjnxdNCD3VuhRcbVD6+zUTCpQ2GjHSZqh/V7IsGbfXSG8I4e3ZkGsdgYLAV0SRMd8zCz2zXGtTSIXs6GU4L60GIQ7scLNlwLAkrg2Ya0YciH12R2f/wMRic2EQEKnggE0YsRi2hwK2ynGVi3FupINQ30Ok9FKqkA52smUB97roT+/ykS/JpvH73T/XRBAxZiHdGtxIqQsQUejHZ2RdUHLB4YqIUs5lYjnT3jmfIVs6zR4fJm+KWw4R3AwbsOERnJRInVElbp1Plq9w/aewYnkJYdoRO20FeSXGsjiCNpr+KAvgMJbt83bkTErLJrx2eozIhAkOFYQqwdiifAZjG2wWD7jKmNKhGy8T8FeHDtKXlL9McRrX+Sws8y5hd7CoMdbOqRjWG7EUqGusUFOXguK2uVZECEuOoV+XZQ0Ra0G03bpC7zAcb52sQHxhI5DM2MS6CCRMEh7NF1qjLaOhNVYjjIUzy29CLl8bpitaDqie5EyJFf3SJ9vZ92tWihth+Dy4QZNt+2VCW3DOQ9pJryjeBzQauloJMjzDOvowILRrHQju+TpjICA1yvqmB09WGHEp5z7wgU1FPwxivoAe8jiraDhbCl0Yaa/ZkivunZRKlzKHEBuYxd9++4pY/9tvg3XMTA0VuWSreEGOJgwtJmhjA0gXUeglYBQc2c6VEUtZL+NyeKG0hOg0bqhAKmpGq3JNDNW2rVH3Qlh76CBKTpAdvy3R6v/l/PKUXQBrqHoZq6htbYTntiaS3hDMUYIM5wMkArpMDVdoxWrvFARLbcTeiqXACB3iPtVMzmsTEFPJNHQ9XziAraxH7NIZeR29ZZz0lJe4giHGGBYo80sinZxzsrRgPJhNgvJuIwmq4R0H0Ip+rcBugYV6dycr+t0asow5xg+Q3sDlVKHeTrSAJwK/LRDVEMuyE785u98W37RyvGiA3RdUvWnb3YVQyERpLCTdgj/D9nMLAbueJKoWVu05pgRsH25kuQbexpB34yf7ivNbnrvY9ehljSmnSqPr187OBlsLjfBgz9mM/DkMqpNlzpZ8DaIL0+FNcj/20TbcH6Omi38hEWlzBCNmnPu0yg4mI/BtgP/4ZiAaI0s0A6IFk8hrP9gAHoeSfHy9886WBGJnMk8Oe8cP3Gl2nQI9fP8sMo8sAGbEHJ1b6WEpHLjQ55dvYkMYqvIp9L33l3vIxO+VhPcuIUhmM7Z3dkrfn3HFC77/z6PQcWu5j/vIBYbCUR+xopoOyiz0DG+woy3ZHmMdPbCdotYZ0Lj/DPbYNsHjh0/wuF9+APKoeNgMMSLIb7gsQezdNV+f40/d8DCmJNKWxWAYHLkARTlIBHDsa+lCPqlNjKk0btHO4vUAxO9P5yWTpSTjjGHTIH5gG1AL7BHgHoevXw9fvtzvXxVAq0EOa2fJTS/Q/vpPlDlHvZsIw987aiCHdAPo3zyFT/6ny8+I/L1/DqIXDRy2EZo80rYHGUaiNIAN8mBGE5gPoHLeNIRs+jSJPswMrwuw5G4oOtqihrRe02pDBhQYGOUKfBqLrkk/Fdi5Q0IGT9n7/0UIl0Ysgx9aRhNuFYA08IVoP/N5fyYmUhil444pmUaaptBuI3JZSbEREexSJZIPcAW6RjjQslaR7kGA3Dnby9eXGPm+e8ZdYt5BeJCDwUrqTxAFSu2CmUnFEWBc5N3Imfho4juHPCAksNbWiSXOBpnIaiIi6vpYyHVXu8AcDc5GOjy9CIE20BvU6fhagxGe2tPZ9OROYLwEYjcdxA0aj1D0dgfNSv4g5oLH/7/krWqh1Q40ilYBPp+AazsL06UTeZf3DBYFiaiE9/ZUG6gradbOyPmc4gmlBFQgBRECXKeXYKgp0wFTBO6fLeget7TiipelcOPUiU7oDRk4gHFgOqKvOqq9Dm+UYNQgK8UcRj65q6MJ+qWnzN0qUkQ1xF+ofLkMLVn2COuh/sT+l3R8Bjo5v4bIlXD5aJ+JpXRAXwEwv1ybAmJ7wTgDZIdU81IM/ajcrbL4CuPwzlBQ6omV0vYUJIVWdrR8LinVnsgdvzl956E5muuCq6LE6ippkVroiLCJp5N2rkbkCf35G8x9sj9ir5aVI0+8FHOeQ3EjhI4T7MtCULCh6W/F0ekl+jQ8Ag7SsnL3JA87QXqPo0N3tgipDmn9HFuu/g5Qyss37Mnx0bM20hkbiYft7aRffiUKh0hTfBl0zSNdcSycTPiCDF1P21CZ9pCg9QPp1WaEOLwAIHS1vb+peAJbgOYSw+xF9PBexva8mNrb/+NWgkC2xZj3TrflhgwxgL994NgUfIDnrOPLqu1w7LLUUdYn+8yLyFWLC34/G+3IPiEALyCY0G6/yVy0O/hJFKAl8A1ovFtfi8H7UEYFIOM/onFqiiYE0Os2joXmfEk0exu2wiaKBqvnYrlqt96iTfqmLrkU8z+GifzSpGjdLdy01AVGDf/QvtACo5bzzU6/bAYoqI2k5IcW9a5UyU+SkACNBvUhacQLyWntyEdrFXxDaQWYELTqFUr7trZB9ZmR9szYf/zrv++P2GvQsUEpokYF24Z0adS/0KQU9r8ziFFjyKKlS6PG2aZP2ZulxBgc7FPEKz3CU0mnYG3tUyZL6TBeKIsDG6e88XgWcesM31as4gzfADS1NxKmi7MEwhwdA4AXosEnMdgLY6LUFzR3F+qgx+sTFIROEQYtR6MCH6OLLIio3RD39dYoX3cABAkHYjKWjslIAuJkRMIoJJWRII9oiP87zQCoDWhZcMl94RdmCpSEmUJA2C0MZCECLq6VXipqg6bjBkgmVHR75NXvwWfgaAtfTgAipdgWBkldNUDRWR99D87ajENtoSOMSQ8MhbIPYcjbXK778SSp97VRKuOlHhWnePRd0eo4tTG6lkUTQbxIbYwvd6RSEWlmI9SK6vQT4ezrl7ZWLwFRZ9qsuPFVSiAjehfbg9X0g1CyW9TVRuN3B1m6PsudTnP3YUiH7eZghxOAR+zo6SFatjzHHCVEtMQKnIifMHdgM4YQVwqF/cvB6OBPB8ODMebG0HkAgxoq4wb/+8PV1Wr0L38afvzTf+tEmZ5CHG9r+C4qJ3qiUSutmv5O3uApuMxbPeVYKpd4mpuRrw7EJ3QvAR8eSZmAe84DW7y3vZhbPLAEMpKrhU4Ajygbg9rG3ZSosjZ4bFsYXlpIwvuAu9qIsmLtMfbqTY5t+DSCcfkA6FYUG6olggKEs0cAj8vithjLGAf1sA9AXZA+8cq7JeIwMy4tiqvTs3fnv7wiOoVyBQxtgeSQdmy5Kqb69k7gz7lll/TY/9g06iP6LcAdoIvGusVKdGGA6SjOwJmDskChbqTRKmQqlCaTNKnZ/h3yvpO69Y1lTMjmoCVvL3ibMhSf/xiOAbj4cR8TrAmUerpmZN5Q7p5sHojqkQEA0yrLGjESSQDfL3Ss63XepSKXAcrkfAH3w4/n6Su+79psLS48d61AXaydD6jsECsH7vKEiZaMN3p8PLQvng0nkyTlzlqJtgCP8qAxi3UN9Xhwsk7nVKTeaUMHAaOXIoIjJJWAaeEZj9CImPairatpoxO0FA/WMm091kAC9qi9PZIKmU/C47aaaSMAuuGNJCmibRGQTtwm8cc0FOhPopAKsGM+bOpDpQXl/2clnI/PA5K7XTdte1VoCtRKq3W0EmM9m4EFEIFbUEvFbwQeZLJTSc70mIvvDmfPXhw9f3H0XDzbNFN9fUWMfJ4hzolNfPeTFD/lHQ6d57UhzAfakhA+BRuRsOkYRJYBHR+aS8BnPS1CXTQ8AeY6IUwLUdQEQQtB6KasYHvFAOH7k4ofbHWI/XqofhhQpOME5DsiHDlFeb3MawB/Tbw/ic0g7P/Nu1cIbGpNLwHQnbArdTRik1hAMqF6rySkMUnOdmqHeGM+DAZ+PGLANXDWE5jGFpHxmji6NcKobWgE8O4pSDwL2Wgxm4ncEfKkOcKo6x1tT10IAuTDDmvmNJJw0QNZ7dBmeL3UFIkNGT8PX4rOD27bQpQCf5LJCS8ksXyVKWTGS7CcINmKHUBH5CohLjOucFpznC5OutQba5Mc6oAQwqlgfxdGR6LAyx7fF9ee1oNABP5outfnLx/5s9f2qSG/QO3VAdynovr07W0/HrGLUnALJ+IEG2TL4+TYKVhckKK2xtsiZnUZNyXYG7MazAvyP3xsdnSlngBL5SLwObRENlFGR4zhOmLGl7OVmC60vu4ek9g6bsNL0SQTF956//an0ZV66usbO65rRJ0m65QBeA8ZB9JSUMoUYZbJYR7BKCqux5URcKTcOBy76AHUU8EWsigAHifR6w12J/ABvyEIZ4RpYqpEC4uINax1x5Q3rDDxZjTNtAoIx0RQDhkkON7MZvh1KhGGcP6cZi/xVDD4MeHIIbuEZQUErT9yiQ7HSI6PurcuxQhYYZGq8vsU+Pby4dBYWle9zUimES+JI/7B3o2wVLYdIP01WPZ6TqZpA7QsfM1iOJoTwzRpHYeuHYJU6bwrQklCpUD7yIwVl7iUdMgS1WP3kjacVxX0so+hgyqm3QbzQ2NyAIh3lQv6KIzRMPdc96rqbba4nwEcTRTs0UQ4THyfkxhX4ummT1IHPcbA4eP86HBWzJ4dflc8nr3gffP9I46ExHL3XrctuGEx9EQ12AQIJTiNr0fZiDfZbp2nr42lM7L+Qd7zLOczbyAqMQ4nEdSdWKNSMcwnGjkn3KYPtHXL1qhAqY+82w8qvs9Nugyvsh/Apj1hpyxvn+bL7SJSeF5zw5UTIpydAndDBXByvB0IvvAEz0sADIS7pCJK1St2bLsFhIYFAp83SFwgG9UcgojnywoVEmzbBg2EJuNUsBthyEyfrlPqAv4tnM6wFYa1QVLUrw85bSatzsM7pmI0GMfnvX1UExif9QeleD3u1VCqI8PxOlTrl7TY3JJFobfNHDLCxB/oSqKuwhfTg24z9ppbJwz8ut9ruuGxfuylP/W2e9qNLxDztllUQ3eiA3bF9uwC5Vloplf+pCV0b3pwHzc34yYMdW+BVlPtI5NTIuNVaGTNTv19W6Qhzn75ZaMgdwQbjexasqjgId8Kxek7OLfEIKVjATvV0OlpLPHgzB0AUtwUe5bKhmjF8OURu/BQ094VTXVeUhYCzIPlTlFbpCHDZnzhBM7fMzx49580OmmpJmwnPjhl/pcQIiRdCx2lgS9cY5BivuVwkG1n2Fib5OCeNiVajCX9oTebFd142pQmvGS3qrQFdaKZVbj5ts3tbiXBGkOiM7YOSC12ErUshU1H7A2eAxVAbAGxxp3PMYY4JvTOvB5wugq2CqT2vBFg1/7yOpwYhIjHWlHo4uECjw6n3bOUaeF4/AOcKs9NhE89RL6RBsr7+AtFTdf43mmcy82DXakWLeKvMtKhqG9jDhCuZMzX/l5DX2W1WsDRCBSwxNxrzGx1DihLDaIXfYeH37VnJ/7pyVZ9sWdjQD6czbk7LnEjrdTTia8kpbVDUyyE9SlKbj24roOss03lFG04rLGKkU+fe/QnLHn7YGc9RTp8G0my9pFzbbOgEfKN9PDR/uRgjoD7ayciW4uJiaAYYuk59DLAAZpn+qGm/jDfTgYnaTnzRkhbr3e0bUdhtfVDSx53RFhn42eNXR44tWGqsFYf24WlPaHljfCInHWDGHhHKh5PCDo7OtytWlfw4AGXKriyve/3uVY9kZUmpnKlfoBzQrRpznykIxLPwkjAZu4U55JaKnSOJ/NTJ+E8i87BsaWet6yuD0n+NAimWA19fPTk2ZPnj7978iwpij7ccD2DVWY3IjOlnt8Fk21nKk43Xk2IGd1Cj8IMhQUgGbmDaG3wQzib1uV1/KFx/hBF40E149rlO6N3dq5A7uSgYm+g5ggoArDLO46+/xWlNm47OqH3DgADtJ5JiJLJJcQJffA5YWnnsw7gVflSiKnwYsiK0UWIoHv7k+fXSq9KQHkVDOui4YAGQx1Zn2Nq5pS2DekQAoGAdIrL7M8gSkfcPcn4QWjgXTGSGy7e1+rQP6A69P+pxOX/dWGqEM6IUUSOSjYEW+PH8W+1qNO/jfgbZhjgNFQNpwbveFzi9Ch/8TR/nB8/Pjri+ZaSmya7vYFeasMtHFuIskIhhld8Y4A1AIzmae1YSCT66DjME4LceAcGfBFmDF+Gz8kPfv7Nr/6L9JFAkuSh8BU+RnSCXz3FNqwfEj1dwZLaHQtZFvHmmU2OKr31VUikEMdTJKVtTofPiL2SfAneMQUiFmCAS06VyvQQdNYLL2kHJL0yRRlMM/tDAv7U1G7h/m1m5CBriNo5keuOY2C6C3BHCXg4R6iLLuyA93ogdQ0ypY13yJLbenryLj2JjZgN2Ag7t68oo83eNVcS7rrE64R+pewYXWzUXhxY4ScPvJloA7yx7VIwXJddxOaifdlC8nPimRYbxydCMsSDQ1s4tKetdMpm5+Gk0JhM+X0pknfrymMIfKRijxqkOn3MyjTXJRGeF38fB0j0zoUAuYaDOalJSzg/OjyjVRk06ZR3QDHPCtLXHihxYAR5MzQMf0Ee1ot5E9PyOQdEK54oH9zwFDK68+je8lWDA43pdugYo2FtlL4NZ+giB1IE39ZmxkMitYLieL70NI0VIWGkDxrZmV5WQlmyxozAzDmA1yefgpI4YR9Go9FHcL+RXs0XefLu2HOf9b9+mWAzTpSlbU8HTbRy7S17hNOvoDYK0ArGik4dRKxSeQWjbgohsvu2G7oW3aDJNlO5Zze0sY1B+I5IaoTRYUYIR0ZHqYXv6Qa19H7E8NA2mXP0IJnz+yTNxiWC9Fwy7h9BjcocB/vaS+/eISPukK5FxNt2CGe7GJwMDqYH1bQ8uDk+8JrsAKYihhVfH6AAhzyXRXlZm3JwMlg4V9mTg4Nry0fg540KcYPEDEE5lNo0s/ZFc82yVhLuAgVYNDQYrq+kxW/fUrYpbi/OsdYg5uaaYEMTcIK4iryFW1gqOfyLWF/hqqVX3MWxwHRgnjhoiCDDQ0gwWMa3dMXD97pY+yOaBu27XTu3t8ZbWRMWxZ+av5PUZvNlc/Vq35WqzXPpTarNt50LVBPUcvve1JSxNi7LbF2CmXg84e7LpNU2l269EDK94jWEWxM6JK5J8iTEbXF5gkCBUMLpxXlypenJ4Gh0ONo82jw+6q+UWnLchp6taI9HOOzpxfmjeMfpfretZG8PTunAteB1oXGPCTEIbfXdk4pnO5Vriozh/hk6HTLGlGEOOpjOzSrwnNwm5Yahbif6+JyjRK7wuEnuEynNECgiC3dX5pgBj3lVuqgk5KDRNcHoGvw5IcCftwfAqcPACR1wFX3NXJfNIZfdHnUozYlag6L0EM+RLjrAcaa81KBHYc8GdxHz7eHSoPQCk2+++YZdQB4Jn7Mw1M+4iRnxLvvMQu1B+hz7fKU+D4dD/Bde+eCF0cdHB4W4ESVIYHswFw4yXEO8f0IUB21yH3zDKzm8FushfL/PPuM5BlXSyyNeLCHSgPHPfUY9NYLmYZ2h7IldTc44XlmTXD6Jy2gn4PjHX8XQHwbfVC9PYBzNRnXi1h1UJZdYPYdS/JMX/x8GU5AfU6hSuDlurmUF9ySogUE2AJ0Dx5LBC58+wXHT70355Qt8/Vst4OSpDx+TW0jwStEo0z58GlyjvDqjLTUELC1eWlLWpA0a1Xk7XK1WQ7xwuzYlIKHRL81CE3R44paXUe+CJoqq7uLN5TsI3OsCi3eXJIKSlrP0Dxo239BV16ir/IfEceBqnYykq7ZowPDfxPhpv/LpE2nCL1/i8/TT1jeirqSnYUU/fvny5f8A/8N/FA== +api: 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 sidebar_class_name: "post api-method" info_path: developers/apis/ottu-api custom_edit_url: null @@ -48,7 +48,7 @@ Typical use case: The merchant collects the Apple Pay token on their frontend an | [Basic Auth](/developers/getting-started/authentication/#basic-auth) | `Can add payment requests` or `Can add e-commerce payments` | -
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/apple-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {\n    \"paymentData\": {\n      \"version\": \"string\",\n      \"data\": \"string\",\n      \"signature\": \"string\",\n      \"header\": {\n        \"ephemeralPublicKey\": \"string\",\n        \"wrappedKey\": \"string\",\n        \"publicKeyHash\": \"string\",\n        \"transactionId\": \"string\"\n      }\n    },\n    \"paymentMethod\": {\n      \"displayName\": \"string\",\n      \"network\": \"string\",\n      \"type\": \"string\"\n    },\n    \"transactionIdentifier\": \"string\"\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment/apple-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {\n    \"paymentData\": {\n      \"version\": \"string\",\n      \"data\": \"string\",\n      \"signature\": \"string\",\n      \"header\": {\n        \"ephemeralPublicKey\": \"string\",\n        \"wrappedKey\": \"string\",\n        \"publicKeyHash\": \"string\",\n        \"transactionId\": \"string\"\n      }\n    },\n    \"paymentMethod\": {\n      \"displayName\": \"string\",\n      \"network\": \"string\",\n      \"type\": \"string\"\n    },\n    \"transactionIdentifier\": \"string\"\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"token\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"token\": \"string\"\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/auto-debit/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"token\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/cash/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment/cash/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/cash-payment/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\"\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/cash-payment/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\"\n}'"}
**Gateway permission**: `Can use pg_code` for the target [payment gateway](/developers/payments/payment-methods/) -
{"curl --location 'https://ksa.ottu.dev/b/invoice/v1/invoice/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"payment_request\",\n  \"invoice_number\": \"INV-001\",\n  \"due_date\": \"2030-12-31\",\n  \"currency_code\": \"KWD\",\n  \"pg_codes\": [\n    \"knet\"\n  ],\n  \"invoice_items\": [\n    {\n      \"sku\": \"ITEM-001\",\n      \"description\": \"Product description\",\n      \"unit_price\": \"10.000\",\n      \"quantity\": \"1\"\n    }\n  ]\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/invoice/v1/invoice/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"payment_request\",\n  \"invoice_number\": \"INV-001\",\n  \"due_date\": \"2030-12-31\",\n  \"currency_code\": \"KWD\",\n  \"pg_codes\": [\n    \"knet\"\n  ],\n  \"invoice_items\": [\n    {\n      \"sku\": \"ITEM-001\",\n      \"description\": \"Product description\",\n      \"unit_price\": \"10.000\",\n      \"quantity\": \"1\"\n    }\n  ]\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"e_commerce\",\n \"amount\": \"10.000\",\n \"currency_code\": \"KWD\",\n \"pg_codes\": [\n \"knet\"\n ]\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/checkout/v1/pymt-txn/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"e_commerce\",\n  \"amount\": \"10.000\",\n  \"currency_code\": \"KWD\",\n  \"pg_codes\": [\n    \"knet\"\n  ]\n}'"}
{"curl --location --globoff --request DELETE 'https://ksa.ottu.dev/b/pbl/v2/card/{token}/?customer_id={customer_id}&type={type}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
+
{"curl --location --globoff --request DELETE 'https://sandbox.ottu.net/b/pbl/v2/card/{token}/?customer_id={customer_id}&type={type}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/{token}/download/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/api/v1/reports/files/{token}/download/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location --globoff --request PUT 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} +
{"curl --location --globoff --request PUT 'https://sandbox.ottu.net/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"amount\": \"string\",\n  \"currency_code\": \"string\",\n  \"pg_codes\": [\n    \"string\"\n  ],\n  \"type\": \"e_commerce\",\n  \"billing_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\"\n  },\n  \"branding_options\": {\n    \"payment_methods\": {}\n  },\n  \"loyalty\": {\n    \"enabled\": true,\n    \"reference\": \"string\",\n    \"metadata\": {}\n  },\n  \"shipping_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\",\n    \"email\": \"user@example.com\",\n    \"phone\": \"string\"\n  },\n  \"agreement\": {\n    \"id\": \"string\",\n    \"amount_variability\": \"fixed\",\n    \"start_date\": \"2024-07-29\",\n    \"expiry_date\": \"2024-07-29\",\n    \"max_amount_per_cycle\": \"string\",\n    \"cycle_interval_days\": 0,\n    \"total_cycles\": 0,\n    \"frequency\": \"irregular\",\n    \"type\": \"recurring\",\n    \"seller\": {\n      \"name\": \"string\",\n      \"short_name\": \"string\",\n      \"category_code\": \"string\"\n    }\n  },\n  \"attachment\": \"string\",\n  \"attachment_upload_url\": \"string\",\n  \"card_acceptance_criteria\": {\n    \"min_expiry_time\": 0\n  },\n  \"customer_birthdate\": \"2024-07-29\",\n  \"customer_email\": \"user@example.com\",\n  \"customer_first_name\": \"string\",\n  \"customer_id\": \"string\",\n  \"customer_last_name\": \"string\",\n  \"customer_phone\": \"string\",\n  \"customer_phone_2\": \"string\",\n  \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n  \"email_recipients\": [\n    \"user@example.com\"\n  ],\n  \"expiration_time\": \"string\",\n  \"generate_qr_code\": false,\n  \"include_sdk_setup_preload\": false,\n  \"initiator_id\": 0,\n  \"language\": \"en\",\n  \"notifications\": {\n    \"email\": [\n      \"created\"\n    ],\n    \"sms\": [\n      \"created\"\n    ],\n    \"whatsapp\": [\n      \"created\"\n    ]\n  },\n  \"order_no\": \"string\",\n  \"payment_instrument\": {\n    \"instrument_type\": \"apple_pay\",\n    \"payload\": {\n      \"paymentData\": {\n        \"version\": \"string\",\n        \"data\": \"string\",\n        \"signature\": \"string\",\n        \"header\": {\n          \"ephemeralPublicKey\": \"string\",\n          \"publicKeyHash\": \"string\",\n          \"transactionId\": \"string\"\n        }\n      },\n      \"paymentMethod\": {\n        \"displayName\": \"string\",\n        \"network\": \"string\",\n        \"type\": \"string\"\n      },\n      \"transactionIdentifier\": \"string\"\n    }\n  },\n  \"payment_type\": \"one_off\",\n  \"preload_checkout_page\": false,\n  \"product_type\": \"string\",\n  \"redirect_url\": \"string\",\n  \"shortify_attachment_url\": false,\n  \"shortify_checkout_url\": false,\n  \"unit_code\": \"string\",\n  \"vendor_name\": \"string\",\n  \"webhook_url\": \"string\"\n}'"}
**Gateway permission**: `Can use pg_code` — grants access to the specific [payment gateway](/developers/payments/payment-methods/) (e.g., "Can use Credit Card") -
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment-methods/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"plugin\": \"payment_request\",\n  \"operation\": \"purchase\",\n  \"currencies\": [\n    \"KWD\"\n  ],\n  \"type\": \"sandbox\",\n  \"tags\": [\n    \"demo\"\n  ]\n}'"}
+
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment-methods/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"plugin\": \"payment_request\",\n  \"operation\": \"purchase\",\n  \"currencies\": [\n    \"KWD\"\n  ],\n  \"type\": \"sandbox\",\n  \"tags\": [\n    \"demo\"\n  ]\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/api/sdk/v1/pre-payment-option-check/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"pg_code\": \"string\"\n}'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/checkout/api/sdk/v1/pre-payment-option-check/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"pg_code\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/card/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"type\": \"sandbox\",\n \"customer_id\": \"sandbox\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/card/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"type\": \"sandbox\",\n  \"customer_id\": \"sandbox\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/google-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"payload\": {\n \"apiVersion\": 0,\n \"apiVersionMinor\": 0,\n \"paymentMethodData\": {\n \"type\": \"string\",\n \"description\": \"string\",\n \"info\": {},\n \"tokenizationData\": {}\n },\n \"email\": \"user@example.com\",\n \"shippingAddress\": {}\n },\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment/google-pay/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"payload\": {\n    \"apiVersion\": 0,\n    \"apiVersionMinor\": 0,\n    \"paymentMethodData\": {\n      \"type\": \"string\",\n      \"description\": \"string\",\n      \"info\": {},\n      \"tokenizationData\": {}\n    },\n    \"email\": \"user@example.com\",\n    \"shippingAddress\": {}\n  },\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/inquiry/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/inquiry/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"order_no\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/api/v1/reports/files/?created_after={created_after}&created_before={created_before}&interval={interval}&limit={limit}&offset={offset}&source={source}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/api/v1/reports/files/?created_after={created_after}&created_before={created_before}&interval={interval}&limit={limit}&offset={offset}&source={source}' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/message-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"session_id\": \"string\",\n \"order_no\": \"string\",\n \"channels\": [\n \"sms\",\n \"email\"\n ]\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/message-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"session_id\": \"string\",\n  \"order_no\": \"string\",\n  \"channels\": [\n    \"sms\",\n    \"email\"\n  ]\n}'"}
{"curl --location --globoff --request PATCH 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"amount\": \"string\",\n \"currency_code\": \"string\",\n \"pg_codes\": [\n \"string\"\n ],\n \"type\": \"e_commerce\",\n \"billing_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\"\n },\n \"branding_options\": {\n \"payment_methods\": {}\n },\n \"loyalty\": {\n \"enabled\": true,\n \"reference\": \"string\",\n \"metadata\": {}\n },\n \"shipping_address\": {\n \"line1\": \"string\",\n \"line2\": \"string\",\n \"city\": \"string\",\n \"state\": \"string\",\n \"country\": \"AF\",\n \"postal_code\": \"string\",\n \"first_name\": \"string\",\n \"last_name\": \"string\",\n \"email\": \"user@example.com\",\n \"phone\": \"string\"\n },\n \"agreement\": {\n \"id\": \"string\",\n \"amount_variability\": \"fixed\",\n \"start_date\": \"2024-07-29\",\n \"expiry_date\": \"2024-07-29\",\n \"max_amount_per_cycle\": \"string\",\n \"cycle_interval_days\": 0,\n \"total_cycles\": 0,\n \"frequency\": \"irregular\",\n \"type\": \"recurring\",\n \"seller\": {\n \"name\": \"string\",\n \"short_name\": \"string\",\n \"category_code\": \"string\"\n }\n },\n \"attachment\": \"string\",\n \"attachment_upload_url\": \"string\",\n \"card_acceptance_criteria\": {\n \"min_expiry_time\": 0\n },\n \"customer_birthdate\": \"2024-07-29\",\n \"customer_email\": \"user@example.com\",\n \"customer_first_name\": \"string\",\n \"customer_id\": \"string\",\n \"customer_last_name\": \"string\",\n \"customer_phone\": \"string\",\n \"customer_phone_2\": \"string\",\n \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n \"email_recipients\": [\n \"user@example.com\"\n ],\n \"expiration_time\": \"string\",\n \"generate_qr_code\": false,\n \"include_sdk_setup_preload\": false,\n \"initiator_id\": 0,\n \"language\": \"en\",\n \"notifications\": {\n \"email\": [\n \"created\"\n ],\n \"sms\": [\n \"created\"\n ],\n \"whatsapp\": [\n \"created\"\n ]\n },\n \"order_no\": \"string\",\n \"payment_instrument\": {\n \"instrument_type\": \"apple_pay\",\n \"payload\": {\n \"paymentData\": {\n \"version\": \"string\",\n \"data\": \"string\",\n \"signature\": \"string\",\n \"header\": {\n \"ephemeralPublicKey\": \"string\",\n \"publicKeyHash\": \"string\",\n \"transactionId\": \"string\"\n }\n },\n \"paymentMethod\": {\n \"displayName\": \"string\",\n \"network\": \"string\",\n \"type\": \"string\"\n },\n \"transactionIdentifier\": \"string\"\n }\n },\n \"payment_type\": \"one_off\",\n \"preload_checkout_page\": false,\n \"product_type\": \"string\",\n \"redirect_url\": \"string\",\n \"shortify_attachment_url\": false,\n \"shortify_checkout_url\": false,\n \"unit_code\": \"string\",\n \"vendor_name\": \"string\",\n \"webhook_url\": \"string\"\n}'"} +
{"curl --location --globoff --request PATCH 'https://sandbox.ottu.net/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"amount\": \"string\",\n  \"currency_code\": \"string\",\n  \"pg_codes\": [\n    \"string\"\n  ],\n  \"type\": \"e_commerce\",\n  \"billing_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\"\n  },\n  \"branding_options\": {\n    \"payment_methods\": {}\n  },\n  \"loyalty\": {\n    \"enabled\": true,\n    \"reference\": \"string\",\n    \"metadata\": {}\n  },\n  \"shipping_address\": {\n    \"line1\": \"string\",\n    \"line2\": \"string\",\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"AF\",\n    \"postal_code\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\",\n    \"email\": \"user@example.com\",\n    \"phone\": \"string\"\n  },\n  \"agreement\": {\n    \"id\": \"string\",\n    \"amount_variability\": \"fixed\",\n    \"start_date\": \"2024-07-29\",\n    \"expiry_date\": \"2024-07-29\",\n    \"max_amount_per_cycle\": \"string\",\n    \"cycle_interval_days\": 0,\n    \"total_cycles\": 0,\n    \"frequency\": \"irregular\",\n    \"type\": \"recurring\",\n    \"seller\": {\n      \"name\": \"string\",\n      \"short_name\": \"string\",\n      \"category_code\": \"string\"\n    }\n  },\n  \"attachment\": \"string\",\n  \"attachment_upload_url\": \"string\",\n  \"card_acceptance_criteria\": {\n    \"min_expiry_time\": 0\n  },\n  \"customer_birthdate\": \"2024-07-29\",\n  \"customer_email\": \"user@example.com\",\n  \"customer_first_name\": \"string\",\n  \"customer_id\": \"string\",\n  \"customer_last_name\": \"string\",\n  \"customer_phone\": \"string\",\n  \"customer_phone_2\": \"string\",\n  \"due_datetime\": \"2024-07-29T15:51:28.071Z\",\n  \"email_recipients\": [\n    \"user@example.com\"\n  ],\n  \"expiration_time\": \"string\",\n  \"generate_qr_code\": false,\n  \"include_sdk_setup_preload\": false,\n  \"initiator_id\": 0,\n  \"language\": \"en\",\n  \"notifications\": {\n    \"email\": [\n      \"created\"\n    ],\n    \"sms\": [\n      \"created\"\n    ],\n    \"whatsapp\": [\n      \"created\"\n    ]\n  },\n  \"order_no\": \"string\",\n  \"payment_instrument\": {\n    \"instrument_type\": \"apple_pay\",\n    \"payload\": {\n      \"paymentData\": {\n        \"version\": \"string\",\n        \"data\": \"string\",\n        \"signature\": \"string\",\n        \"header\": {\n          \"ephemeralPublicKey\": \"string\",\n          \"publicKeyHash\": \"string\",\n          \"transactionId\": \"string\"\n        }\n      },\n      \"paymentMethod\": {\n        \"displayName\": \"string\",\n        \"network\": \"string\",\n        \"type\": \"string\"\n      },\n      \"transactionIdentifier\": \"string\"\n    }\n  },\n  \"payment_type\": \"one_off\",\n  \"preload_checkout_page\": false,\n  \"product_type\": \"string\",\n  \"redirect_url\": \"string\",\n  \"shortify_attachment_url\": false,\n  \"shortify_checkout_url\": false,\n  \"unit_code\": \"string\",\n  \"vendor_name\": \"string\",\n  \"webhook_url\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/operation/' \\\n--header 'Tracking-Key: Tracking-Key: your_operation_tracking_key' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"order_no\": \"string\",\n \"session_id\": \"string\",\n \"operation\": \"delete\",\n \"amount\": \"string\",\n \"extra\": {},\n \"destination\": \"pg\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/operation/' \\\n--header 'Tracking-Key: Tracking-Key: your_operation_tracking_key' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"order_no\": \"string\",\n  \"session_id\": \"string\",\n  \"operation\": \"delete\",\n  \"amount\": \"string\",\n  \"extra\": {},\n  \"destination\": \"pg\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/checkout/v1/pymt-txn/{session_id}/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/send-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"channel\": \"email\",\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/send-notification/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"channel\": \"email\",\n  \"template_id\": \"payment-request-mail\",\n  \"to\": \"customer@example.com\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/pbl/v2/notifications/send/{channel}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n \"template_id\": \"payment-request-mail\",\n \"to\": \"customer@example.com\"\n}'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/pbl/v2/notifications/send/{channel}/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data-raw '{\n  \"template_id\": \"payment-request-mail\",\n  \"to\": \"customer@example.com\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/checkout/v1/upload-attachment/' \\\n--header 'Content-Type: multipart/form-data' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--form 'file=@\"/path/to/file\"' \\\n--form 'shortify_attachment_url=\"false\"' \\\n--form 'order_no=\"\"' \\\n--form 'session_id=\"\"'"} +
{"curl --location 'https://sandbox.ottu.net/b/checkout/v1/upload-attachment/' \\\n--header 'Content-Type: multipart/form-data' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--form 'file=@\"/path/to/file\"' \\\n--form 'shortify_attachment_url=\"false\"' \\\n--form 'order_no=\"\"' \\\n--form 'session_id=\"\"'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/accounts/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/wallet/ottu/v1/accounts/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"customer_id\": \"sandbox-usd\",\n  \"currency\": \"USD\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/entries/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"customer_id\": \"sandbox-usd\",\n \"currency\": \"USD\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/wallet/ottu/v1/entries/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"customer_id\": \"sandbox-usd\",\n  \"currency\": \"USD\"\n}'"}
{"curl --location --globoff 'https://ksa.ottu.dev/b/checkout/v1/wallet/payment-sessions/{session_id}/finalization-status/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"} +
{"curl --location --globoff 'https://sandbox.ottu.net/b/checkout/v1/wallet/payment-sessions/{session_id}/finalization-status/' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY'"}
{"curl --location 'https://ksa.ottu.dev/b/pbl/v2/payment/wallet/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"payload\": {},\n \"pg_code\": \"string\",\n \"session_id\": \"string\"\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/pbl/v2/payment/wallet/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"payload\": {},\n  \"pg_code\": \"string\",\n  \"session_id\": \"string\"\n}'"}
{"curl --location 'https://ksa.ottu.dev/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n \"operation_id\": 0\n}'"} +
{"curl --location 'https://sandbox.ottu.net/b/wallet/ottu/v1/operations/' \\\n--header 'Content-Type: application/json' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: Api-Key YOUR_API_KEY' \\\n--data '{\n  \"operation_id\": 0\n}'"}
state.auth.data); diff --git a/src/utils/sandbox.ts b/src/utils/sandbox.ts index 9864815..19fe084 100644 --- a/src/utils/sandbox.ts +++ b/src/utils/sandbox.ts @@ -31,14 +31,12 @@ export const KSA: ConnectEnv = { }; // ⬇️ THE GLOBAL SWITCH for the LIVE interactive demos (Checkout / Recurring / -// PaymentJourney / Wallet) + the API-explorer "try it". docs.ottu.com must -// advertise only sandbox.ottu.net; the static code samples already do -// (OTTU_CONNECT_BASE_URL). These LIVE surfaces stay on KSA for now ONLY because -// the wallet demo needs a wallet-enabled gateway — present on ksa.ottu.dev, -// absent on sandbox.ottu.net (verified: 0 wallet PGs vs 15 on KSA). Flip to -// SANDBOX once a wallet-enabled sandbox.ottu.net merchant + the sandbox wallet -// service/Keycloak (mcp-server/config.mjs) exist. -export const ACTIVE_CONNECT: ConnectEnv = KSA; +// PaymentJourney / Wallet) + the API-explorer "try it". docs.ottu.com +// advertises only sandbox.ottu.net, so everything runs on SANDBOX. +// The wallet gateway is live on sandbox.ottu.net for USD only — PG +// `ottu-sandbox-usd`, payment_services `ottu-wallet`, tagged `demo` — so the +// WalletDemo seeds and charges in USD (see walletDemoConfig.ts). +export const ACTIVE_CONNECT: ConnectEnv = SANDBOX; export interface CreateSessionOptions { pg_codes: string[]; diff --git a/src/utils/walletDemoConfig.ts b/src/utils/walletDemoConfig.ts index c977e7c..f28524a 100644 --- a/src/utils/walletDemoConfig.ts +++ b/src/utils/walletDemoConfig.ts @@ -7,9 +7,10 @@ * in `./sandbox` — flip that one global to retarget every demo on the site. */ export const WALLET_DEMO = { - currency: "KWD", - seedAmount: "10.000", - sessionAmount: "8.000", + // Wallet on sandbox.ottu.net is enabled for USD only (PG `ottu-sandbox-usd`). + currency: "USD", + seedAmount: "10.00", + sessionAmount: "8.00", pgFilter: { plugin: "e_commerce", type: "sandbox", diff --git a/static/Ottu_API.yaml b/static/Ottu_API.yaml index d4a4d7a..64c7dd0 100644 --- a/static/Ottu_API.yaml +++ b/static/Ottu_API.yaml @@ -9885,4 +9885,4 @@ components: name: Authorization description: Token-based authentication with required prefix "Token" servers: - - url: https://ksa.ottu.dev + - url: https://sandbox.ottu.net diff --git a/static/api-enrichments/_variables.yaml b/static/api-enrichments/_variables.yaml index f8e2275..7d1da06 100644 --- a/static/api-enrichments/_variables.yaml +++ b/static/api-enrichments/_variables.yaml @@ -6,4 +6,4 @@ apiBaseUrl: "/developers" glossaryUrl: "/glossary" -sandboxUrl: "https://ksa.ottu.dev" +sandboxUrl: "https://sandbox.ottu.net" From da56d9b1d3e6b7804c0775fa8c35a6fcb23d7999 Mon Sep 17 00:00:00 2001 From: Dacian Popute Date: Wed, 10 Jun 2026 20:08:34 +0300 Subject: [PATCH 18/18] feat(wallet-demo): seed against the sandbox.ottu.net wallet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The docs run on sandbox.ottu.net now, so the wallet seed backend mints on that merchant's wallet instead of KSA: - config.mjs: add SANDBOX_OTTU_NET — merchant sandbox.ottu.net, shared wallet.ottu.dev + auth.ottu.dev, realm sandbox.ottu.net, client backend, secret env SANDBOX_KEYCLOAK_CLIENT_SECRET (confirmed in Keycloak) - server.mjs: handleSeedWallet seeds via SANDBOX_OTTU_NET Verified end-to-end locally: POST /seed-wallet for ottu-sandbox-usd (USD) -> 201, balance minted. DO mcp component has SANDBOX_KEYCLOAK_CLIENT_SECRET set on docs-dev (docs-prod set at merge time). Co-Authored-By: Claude Opus 4.8 (1M context) --- mcp-server/config.mjs | 17 +++++++++++++++++ mcp-server/server.mjs | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/mcp-server/config.mjs b/mcp-server/config.mjs index 71bae50..1aeeba1 100644 --- a/mcp-server/config.mjs +++ b/mcp-server/config.mjs @@ -17,3 +17,20 @@ export const KSA_OTTU_DEV = { clientSecretEnvVar: "KSA_KEYCLOAK_CLIENT_SECRET", }, }; + +// Active docs merchant — the WalletDemo seeds wallet credit here. Shares the +// wallet service + Keycloak host with KSA; only the realm, merchant id, and +// secret differ. Confirmed in Keycloak (auth.ottu.dev): realm +// `sandbox.ottu.net`, client `backend` (Client Id and Secret authenticator). +export const SANDBOX_OTTU_NET = { + merchantId: "sandbox.ottu.net", + walletUrl: "https://wallet.ottu.dev", + keycloak: { + url: "https://auth.ottu.dev", + realm: "sandbox.ottu.net", + clientId: "backend", + // Client secret resolved from process.env.SANDBOX_KEYCLOAK_CLIENT_SECRET + // at the call site (mcp-server/server.mjs handleSeedWallet). + clientSecretEnvVar: "SANDBOX_KEYCLOAK_CLIENT_SECRET", + }, +}; diff --git a/mcp-server/server.mjs b/mcp-server/server.mjs index e96d703..36e6acc 100644 --- a/mcp-server/server.mjs +++ b/mcp-server/server.mjs @@ -3,7 +3,7 @@ import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; import { McpDocsServer } from "docusaurus-plugin-mcp-server"; -import { KSA_OTTU_DEV } from "./config.mjs"; +import { SANDBOX_OTTU_NET } from "./config.mjs"; import { getKeycloakToken } from "./keycloak.mjs"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -142,7 +142,7 @@ async function handleSeedWallet(req, res) { return; } - const merchant = KSA_OTTU_DEV; + const merchant = SANDBOX_OTTU_NET; let token; try { token = await getKeycloakToken({