@apiosk/mcp 1.7.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -612
- package/assets/brand/apiosk-a-20260921.png +0 -0
- package/assets/brand/apple-touch-icon.png +0 -0
- package/assets/brand/favicon-dark.ico +0 -0
- package/assets/brand/favicon-light.ico +0 -0
- package/assets/brand/favicon.ico +0 -0
- package/assets/brand/icon-192.png +0 -0
- package/assets/brand/icon-512.png +0 -0
- package/assets/brand/icon-maskable-512.png +0 -0
- package/assets/brand/inter-OFL.txt +93 -0
- package/assets/brand/inter-latin-400-normal.woff2 +0 -0
- package/assets/brand/inter-latin-500-normal.woff2 +0 -0
- package/assets/brand/inter-latin-600-normal.woff2 +0 -0
- package/assets/brand/mark-20260905-transparent.svg +1 -0
- package/assets/brand/mark-20260918.svg +1 -0
- package/assets/brand/mark-black-20260918.svg +1 -0
- package/assets/brand/mark-dark-20260905-transparent.png +0 -0
- package/assets/brand/mark-dark-20260918.png +0 -0
- package/assets/brand/mark-dark-96.png +0 -0
- package/assets/brand/mark-light-20260905-transparent.png +0 -0
- package/assets/brand/mark-light-20260918.png +0 -0
- package/assets/brand/mark-light-96.png +0 -0
- package/assets/brand/wordmark-black-320.png +0 -0
- package/assets/brand/wordmark-white-320.png +0 -0
- package/docs/branding.md +11 -0
- package/docs/marketplace-submission-2026-04-08.md +4 -0
- package/docs/marketplace-submission-2026-08-20.md +157 -0
- package/docs/openai-plugin-submission-2026-09-05.md +143 -0
- package/dxt.json +26 -22
- package/index.mjs +3 -1
- package/logo-optimized-light.png +0 -0
- package/package.json +14 -14
- package/plugin/apiosk/.codex-plugin/plugin.json +45 -0
- package/plugin/apiosk/.mcp.json +8 -0
- package/plugin/apiosk/assets/icon-dark.png +0 -0
- package/plugin/apiosk/assets/icon.png +0 -0
- package/plugin/apiosk/assets/icon.svg +1 -0
- package/plugin/apiosk/assets/logo.png +0 -0
- package/plugin/apiosk/skills/apiosk/SKILL.md +33 -0
- package/plugin/apiosk/skills/apiosk/agents/openai.yaml +12 -0
- package/server.json +58 -24
- package/server.mjs +136 -151
- package/src/approval-feedback.mjs +21 -0
- package/src/brand-routes.mjs +28 -0
- package/src/create-server.mjs +160 -46
- package/src/display-money.mjs +20 -0
- package/src/display-text.mjs +67 -0
- package/src/gateway-client.mjs +42 -0
- package/src/gateway-v2-ask.mjs +50 -0
- package/src/gateway-v2-card-account.mjs +23 -0
- package/src/gateway-v2-card-actions.mjs +67 -0
- package/src/gateway-v2-card-answer-text.mjs +130 -0
- package/src/gateway-v2-card-answer.mjs +68 -0
- package/src/gateway-v2-card-blocks.mjs +166 -0
- package/src/gateway-v2-card-body.mjs +259 -0
- package/src/gateway-v2-card-budget.mjs +21 -0
- package/src/gateway-v2-card-cbs.mjs +56 -0
- package/src/gateway-v2-card-choices.mjs +4 -0
- package/src/gateway-v2-card-clarification.mjs +25 -0
- package/src/gateway-v2-card-compact.mjs +34 -0
- package/src/gateway-v2-card-events.mjs +41 -0
- package/src/gateway-v2-card-presentation.mjs +125 -0
- package/src/gateway-v2-card-research.mjs +63 -0
- package/src/gateway-v2-card-result.mjs +32 -0
- package/src/gateway-v2-card-search.mjs +39 -0
- package/src/gateway-v2-card-sources.mjs +32 -0
- package/src/gateway-v2-card-style.mjs +76 -0
- package/src/gateway-v2-card-verdict.mjs +66 -0
- package/src/gateway-v2-card.mjs +91 -0
- package/src/gateway-v2-contracts.json +66 -0
- package/src/gateway-v2-instructions.md +113 -0
- package/src/gateway-v2-recovery.mjs +18 -0
- package/src/gateway-v2-report-links.mjs +14 -0
- package/src/gateway-v2-workflows.mjs +17 -0
- package/src/gateway-v2.mjs +179 -0
- package/src/oauth.mjs +402 -1949
- package/src/observability.mjs +19 -3
- package/src/result-presentation.mjs +9 -0
- package/src/runtime.mjs +24 -3670
- package/src/source-groups.mjs +91 -0
- package/src/source-value-format.mjs +25 -0
- package/src/tool-result.mjs +20 -0
- package/src/ui-bridge.mjs +185 -0
- package/src/well-known-routes.mjs +132 -0
- package/src/assets/wallet-accounts.mjs +0 -20513
- package/src/assets/walletconnect-provider.mjs +0 -6319
- package/src/discovery.mjs +0 -929
- package/src/external-fetch.mjs +0 -203
- package/src/funding-options.mjs +0 -255
- package/src/gateway-management.mjs +0 -107
- package/src/hosted-payment.mjs +0 -552
- package/src/hosted-wallets.mjs +0 -530
- package/src/listing-metadata.mjs +0 -287
- package/src/local-config.mjs +0 -256
- package/src/payment-guidance.mjs +0 -298
- package/src/publisher.mjs +0 -1288
- package/src/result-canvas.mjs +0 -16
- package/src/source-registry.mjs +0 -215
- package/src/wallet-store.mjs +0 -476
- package/src/x402-inspect.mjs +0 -361
package/src/payment-guidance.mjs
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
// Payment guidance for the Apiosk gateway.
|
|
2
|
-
//
|
|
3
|
-
// This module turns the Apiosk settlement model into agent-readable guidance
|
|
4
|
-
// that is surfaced at discovery time (search/explore/get_api) and through the
|
|
5
|
-
// dedicated apiosk_payment_guide tool. It covers BOTH sides of the gateway:
|
|
6
|
-
// - buyers: how an agent pays for a paid API call (USDC over x402),
|
|
7
|
-
// tailored to what auth the runtime currently has.
|
|
8
|
-
// - providers (sellers): how to publish an API so other agents can pay for it.
|
|
9
|
-
//
|
|
10
|
-
// Everything here is pure (no I/O) so it stays trivially testable and fast.
|
|
11
|
-
|
|
12
|
-
export const BASE_CHAIN_ID = 8453;
|
|
13
|
-
export const BASE_USDC_CONTRACT = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
14
|
-
|
|
15
|
-
// Settlement rails shared across every guide. Kept aligned with the
|
|
16
|
-
// apiosk_help topic='rails' payload so agents see one consistent story.
|
|
17
|
-
export const SETTLEMENT_RAILS = [
|
|
18
|
-
{
|
|
19
|
-
id: "usdc_x402",
|
|
20
|
-
label: "USDC over x402 (Base)",
|
|
21
|
-
summary:
|
|
22
|
-
"On-chain USDC on Base (chain 8453), settled per call via an x402 payment proof signed by the agent's wallet or APIOSK_PRIVATE_KEY.",
|
|
23
|
-
best_for: "Autonomous agents that hold a funded Base USDC wallet.",
|
|
24
|
-
setup: "Fund a wallet with Base mainnet USDC, then settlement happens automatically per call.",
|
|
25
|
-
},
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
// The order the gateway tries to cover a paid call. A 402 is only returned
|
|
29
|
-
// when none of the buyer's enabled rails can settle.
|
|
30
|
-
export const RAIL_FALLBACK_ORDER = [
|
|
31
|
-
"1. USDC / x402 wallet when the agent can produce a payment proof.",
|
|
32
|
-
];
|
|
33
|
-
|
|
34
|
-
function resolvePrice(api) {
|
|
35
|
-
if (!api || typeof api !== "object") return null;
|
|
36
|
-
const raw =
|
|
37
|
-
api.price_usd ??
|
|
38
|
-
api.listing_metadata?.cost_per_call ??
|
|
39
|
-
api.detail?.price_usd ??
|
|
40
|
-
api.cost_per_call ??
|
|
41
|
-
null;
|
|
42
|
-
if (raw === null || raw === undefined) return null;
|
|
43
|
-
const price = Number(raw);
|
|
44
|
-
return Number.isFinite(price) ? price : null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Map the runtime's auth method onto whether the agent can settle a paid call
|
|
48
|
-
// right now, plus the single clearest next step to become payment-ready.
|
|
49
|
-
function describeReadiness(capability = {}, { localWalletsEnabled = false, mode = "remote" } = {}) {
|
|
50
|
-
const method = String(capability.method || "none");
|
|
51
|
-
const walletAddress = capability.wallet_address || null;
|
|
52
|
-
|
|
53
|
-
switch (method) {
|
|
54
|
-
case "env_private_key":
|
|
55
|
-
return {
|
|
56
|
-
ready: true,
|
|
57
|
-
status: "ready_to_pay",
|
|
58
|
-
active_method: "APIOSK_PRIVATE_KEY",
|
|
59
|
-
detail:
|
|
60
|
-
"An environment private key is configured, so the SDK auto-settles supported x402 calls. Fund this wallet with Base USDC if a call returns payment_required.",
|
|
61
|
-
};
|
|
62
|
-
case "local_wallet":
|
|
63
|
-
return {
|
|
64
|
-
ready: true,
|
|
65
|
-
status: "ready_to_pay",
|
|
66
|
-
active_method: "local wallet",
|
|
67
|
-
detail:
|
|
68
|
-
"A local wallet is selected and used automatically for paid calls. Fund it with Base USDC (apiosk_show_wallet_funding) if a call returns payment_required.",
|
|
69
|
-
};
|
|
70
|
-
case "connect_token":
|
|
71
|
-
case "request_connect_token":
|
|
72
|
-
return {
|
|
73
|
-
ready: true,
|
|
74
|
-
status: "ready_to_pay",
|
|
75
|
-
active_method: "Apiosk connect token",
|
|
76
|
-
detail:
|
|
77
|
-
"A managed connect token is active. The gateway settles each call from the authorized USDC managed wallet server-side, no signing needed here.",
|
|
78
|
-
};
|
|
79
|
-
case "wallet_address":
|
|
80
|
-
return {
|
|
81
|
-
ready: false,
|
|
82
|
-
status: "setup_required",
|
|
83
|
-
active_method: "wallet address only",
|
|
84
|
-
detail:
|
|
85
|
-
"A wallet address is known but no signing key or connect token is configured, so this surface cannot settle x402 calls itself.",
|
|
86
|
-
};
|
|
87
|
-
default:
|
|
88
|
-
return {
|
|
89
|
-
ready: false,
|
|
90
|
-
status: "setup_required",
|
|
91
|
-
active_method: "none",
|
|
92
|
-
detail: localWalletsEnabled
|
|
93
|
-
? "No payment method is configured yet. Run apiosk_get_started to create a wallet, or import a dashboard connect string."
|
|
94
|
-
: mode === "hosted"
|
|
95
|
-
? "No buyer is authorized yet. Authorize the Apiosk app when your MCP client prompts so calls settle against your managed wallet."
|
|
96
|
-
: "No payment method is configured. Set APIOSK_PRIVATE_KEY or APIOSK_CONNECT_TOKEN, or run the local stdio package and call apiosk_get_started.",
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Concrete, ordered steps to go from "found an API" to "paid call succeeded",
|
|
102
|
-
// tailored to the current readiness and server mode.
|
|
103
|
-
function buildHowToPaySteps({ readiness, localWalletsEnabled, mode, slug }) {
|
|
104
|
-
const execHint = slug
|
|
105
|
-
? `Call the API's dynamic tool or apiosk_execute with slug "${slug}".`
|
|
106
|
-
: "Call the API's dynamic tool (see tool_name) or apiosk_execute with the slug.";
|
|
107
|
-
|
|
108
|
-
if (readiness.ready) {
|
|
109
|
-
return [
|
|
110
|
-
execHint,
|
|
111
|
-
"Settlement is automatic, the gateway charges the active method and returns the result.",
|
|
112
|
-
"If a call still returns payment_required, fund the wallet with USDC on Base and retry.",
|
|
113
|
-
];
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (localWalletsEnabled) {
|
|
117
|
-
return [
|
|
118
|
-
"Run apiosk_get_started to create or select a local wallet (or import a dashboard connect string).",
|
|
119
|
-
"Fund the wallet with Base mainnet USDC using apiosk_show_wallet_funding.",
|
|
120
|
-
execHint,
|
|
121
|
-
];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (mode === "hosted") {
|
|
125
|
-
return [
|
|
126
|
-
"Authorize the Apiosk app when your MCP client prompts, so calls settle against your managed wallet.",
|
|
127
|
-
execHint,
|
|
128
|
-
"If a call returns payment_required, fund your managed wallet with USDC on Base, then retry.",
|
|
129
|
-
];
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return [
|
|
133
|
-
"Configure settlement: set APIOSK_PRIVATE_KEY (autonomous x402) or APIOSK_CONNECT_TOKEN (managed rails) in the MCP environment.",
|
|
134
|
-
"Or run the local stdio package (npx -y @apiosk/mcp) and call apiosk_get_started.",
|
|
135
|
-
execHint,
|
|
136
|
-
];
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Buyer-side payment guidance, optionally scoped to one listing.
|
|
141
|
-
* Surfaced inline in discovery responses and inside apiosk_payment_guide.
|
|
142
|
-
*/
|
|
143
|
-
export function buildPaymentGuidance({
|
|
144
|
-
api = null,
|
|
145
|
-
capability = {},
|
|
146
|
-
mode = "remote",
|
|
147
|
-
localWalletsEnabled = false,
|
|
148
|
-
} = {}) {
|
|
149
|
-
const price = resolvePrice(api);
|
|
150
|
-
const isFree = price !== null && price <= 0;
|
|
151
|
-
const slug = api?.slug || api?.detail?.slug || null;
|
|
152
|
-
const readiness = describeReadiness(capability, { localWalletsEnabled, mode });
|
|
153
|
-
|
|
154
|
-
if (isFree) {
|
|
155
|
-
return {
|
|
156
|
-
role: "buyer",
|
|
157
|
-
summary: `This listing is free (cost_per_call ${price}). Call it directly, no payment required.`,
|
|
158
|
-
cost_per_call_usd: price,
|
|
159
|
-
free: true,
|
|
160
|
-
status: "ready_to_pay",
|
|
161
|
-
how_to_pay: [
|
|
162
|
-
slug
|
|
163
|
-
? `Call the dynamic tool or apiosk_execute with slug "${slug}".`
|
|
164
|
-
: "Call the dynamic tool (see tool_name) or apiosk_execute with the slug.",
|
|
165
|
-
],
|
|
166
|
-
settlement_rails: SETTLEMENT_RAILS,
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return {
|
|
171
|
-
role: "buyer",
|
|
172
|
-
summary: slug
|
|
173
|
-
? `How to pay for "${slug}" through the Apiosk gateway.`
|
|
174
|
-
: "How an agent pays for paid Apiosk APIs.",
|
|
175
|
-
cost_per_call_usd: price,
|
|
176
|
-
free: false,
|
|
177
|
-
status: readiness.status,
|
|
178
|
-
payment_ready: readiness.ready,
|
|
179
|
-
active_method: readiness.active_method,
|
|
180
|
-
readiness_detail: readiness.detail,
|
|
181
|
-
active_wallet_address: capability.wallet_address || null,
|
|
182
|
-
how_to_pay: buildHowToPaySteps({ readiness, localWalletsEnabled, mode, slug }),
|
|
183
|
-
settlement_rails: SETTLEMENT_RAILS,
|
|
184
|
-
rail_fallback_order: RAIL_FALLBACK_ORDER,
|
|
185
|
-
on_payment_required:
|
|
186
|
-
"A paid call can return a structured payment_required error when the wallet cannot cover it. Fund the wallet with USDC on Base, then retry the same call.",
|
|
187
|
-
base_chain: { chain_id: BASE_CHAIN_ID, usdc_contract: BASE_USDC_CONTRACT, network: "base" },
|
|
188
|
-
learn_more: "Call apiosk_help with topic='rails' for the full settlement model.",
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Provider-side (seller) guidance: how to publish an API so other agents can
|
|
194
|
-
* discover and pay for it through the gateway.
|
|
195
|
-
*/
|
|
196
|
-
export function buildProviderGuidance({ mode = "remote", localWalletsEnabled = false } = {}) {
|
|
197
|
-
const canPublishHere = localWalletsEnabled;
|
|
198
|
-
|
|
199
|
-
return {
|
|
200
|
-
role: "provider",
|
|
201
|
-
summary:
|
|
202
|
-
"How to list an API or MCP toolset on Apiosk so other agents discover it and pay you per call.",
|
|
203
|
-
publish_channel: canPublishHere
|
|
204
|
-
? "This local stdio package can publish directly with a signed wallet (apiosk_publish_api)."
|
|
205
|
-
: mode === "hosted"
|
|
206
|
-
? "This hosted surface is read-only for publishing. Publish from the provider portal or the local stdio package."
|
|
207
|
-
: "Run the local stdio package (npx -y @apiosk/mcp, or the legacy apiosk-mcp-server package) to publish with a signed wallet, or use the provider portal.",
|
|
208
|
-
steps: [
|
|
209
|
-
canPublishHere
|
|
210
|
-
? "Create or select a signing wallet: apiosk_wallet_create then apiosk_wallet_select (or set APIOSK_PRIVATE_KEY). This wallet receives USDC payouts."
|
|
211
|
-
: "Set up a signing wallet via the local stdio package or sign up in the provider portal.",
|
|
212
|
-
"Expose your API over HTTPS. The endpoint receives the forwarded request body and returns JSON.",
|
|
213
|
-
"Publish it with apiosk_publish_api: name, slug (lowercase-with-hyphens), endpoint_url (https), price_usd, and description.",
|
|
214
|
-
"Verify it is live: apiosk_list_my_apis. It now appears in apiosk_search/apiosk_explore for every agent.",
|
|
215
|
-
"Manage it over time with apiosk_update_api (price, endpoint, active) and apiosk_delete_api.",
|
|
216
|
-
],
|
|
217
|
-
mcp_provider_flow: [
|
|
218
|
-
"Host your MCP over HTTPS and support initialize, tools/list, and tools/call.",
|
|
219
|
-
"Protect the upstream MCP with bearer auth or another server-side secret; Apiosk injects that credential after payment.",
|
|
220
|
-
"Import the MCP in the provider portal. Apiosk scans tools/list and creates one paid action per selected tool.",
|
|
221
|
-
"Buyers should use https://mcp.apiosk.com/mcp, GET https://gateway.apiosk.com/<slug>/metadata, or POST https://gateway.apiosk.com/<slug>/execute, not your raw MCP URL.",
|
|
222
|
-
"Your MCP should not return 402 or inspect X-Payment. Apiosk handles payment challenges, settlement, and revenue splits before calling your MCP.",
|
|
223
|
-
],
|
|
224
|
-
requirements: [
|
|
225
|
-
"A signing wallet must be active (local wallet or APIOSK_PRIVATE_KEY).",
|
|
226
|
-
"endpoint_url must use HTTPS.",
|
|
227
|
-
"slug must use lowercase letters, numbers, and hyphens only.",
|
|
228
|
-
"For MCP imports, the provider MCP should be reachable over HTTPS and locked down so only Apiosk can call it directly.",
|
|
229
|
-
],
|
|
230
|
-
listing_metadata_note:
|
|
231
|
-
"MCP-native metadata (operations, input/output schema, default_operation, mcp_tool) is generated automatically from your inputs. Override it via the listing_metadata argument when you need a custom tool shape.",
|
|
232
|
-
earnings: {
|
|
233
|
-
summary: "Providers receive each call's gross minus the current Apiosk platform fee. The gateway default is 2%.",
|
|
234
|
-
usdc: "USDC earnings settle to the API's payout wallet (the publishing wallet address).",
|
|
235
|
-
offramp:
|
|
236
|
-
"Optional crypto→EUR off-ramp: providers can sign a non-custodial mandate so accumulated USDC auto-converts to EUR and redeems to their IBAN.",
|
|
237
|
-
},
|
|
238
|
-
identity_note:
|
|
239
|
-
"apiosk_publish_api manages listings via wallet signature (the community/MCP publish channel). The provider portal uses a separate Supabase-auth identity after KYB; listings do not currently round-trip between the two surfaces.",
|
|
240
|
-
tools: ["apiosk_publish_api", "apiosk_list_my_apis", "apiosk_update_api", "apiosk_delete_api"],
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Full payload for the dedicated apiosk_payment_guide tool. role selects which
|
|
246
|
-
* side(s) to return: "buyer" | "provider" | "both" (default).
|
|
247
|
-
*/
|
|
248
|
-
export function buildPaymentGuide({
|
|
249
|
-
role = "both",
|
|
250
|
-
api = null,
|
|
251
|
-
capability = {},
|
|
252
|
-
mode = "remote",
|
|
253
|
-
localWalletsEnabled = false,
|
|
254
|
-
} = {}) {
|
|
255
|
-
const normalizedRole = ["buyer", "provider", "both"].includes(role) ? role : "both";
|
|
256
|
-
|
|
257
|
-
const payload = {
|
|
258
|
-
role: normalizedRole,
|
|
259
|
-
overview:
|
|
260
|
-
"Apiosk is one gateway, any rail: a single buyer identity can pay for any API over USDC (x402 on Base) or prepaid credits, the gateway picks the rail per call. Providers list APIs once and get paid per call.",
|
|
261
|
-
quickstart: {
|
|
262
|
-
buyer: [
|
|
263
|
-
"Discover: apiosk_search or apiosk_explore.",
|
|
264
|
-
"Inspect: apiosk_get_api for price, schema, and a per-listing payment block.",
|
|
265
|
-
"Pay & run: call the dynamic tool or apiosk_execute, settlement is automatic once a rail is configured.",
|
|
266
|
-
],
|
|
267
|
-
provider: [
|
|
268
|
-
"Get a signing wallet (apiosk_wallet_create or APIOSK_PRIVATE_KEY).",
|
|
269
|
-
"Publish: apiosk_publish_api with name, slug, https endpoint_url, price_usd, description.",
|
|
270
|
-
"Confirm: apiosk_list_my_apis, your listing is now discoverable and payable.",
|
|
271
|
-
],
|
|
272
|
-
},
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
if (normalizedRole === "buyer" || normalizedRole === "both") {
|
|
276
|
-
payload.buyer = buildPaymentGuidance({ api, capability, mode, localWalletsEnabled });
|
|
277
|
-
}
|
|
278
|
-
if (normalizedRole === "provider" || normalizedRole === "both") {
|
|
279
|
-
payload.provider = buildProviderGuidance({ mode, localWalletsEnabled });
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
return payload;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Compact buyer hint attached to multi-result discovery responses so an agent
|
|
286
|
-
// learns how to pay without a second tool call, without bloating every entry.
|
|
287
|
-
export function buildDiscoveryPaymentHint({ capability = {}, mode = "remote", localWalletsEnabled = false } = {}) {
|
|
288
|
-
const readiness = describeReadiness(capability, { localWalletsEnabled, mode });
|
|
289
|
-
return {
|
|
290
|
-
payment_ready: readiness.ready,
|
|
291
|
-
active_method: readiness.active_method,
|
|
292
|
-
how_to_pay: readiness.ready
|
|
293
|
-
? "Paid calls settle automatically, just call the tool or apiosk_execute."
|
|
294
|
-
: readiness.detail,
|
|
295
|
-
settlement_rails: SETTLEMENT_RAILS.map((rail) => rail.id),
|
|
296
|
-
learn_more: "Call apiosk_payment_guide for full buyer + provider instructions.",
|
|
297
|
-
};
|
|
298
|
-
}
|