Account and workspace API access
Read identity, usage and credits, set the workspace model policy, manage webhooks and provider connections over the API, and see what stays in the web app.
Updated
Creative work goes through the session API and the twelve tools. Account and workspace administration — identity, usage and credits, the workspace model policy, webhooks, provider connections, and personal settings — goes through a few /v1 routes and the older operations the service still serves at POST /api/v1/ops/{name}. This page lists exactly what you can reach with a credential, what scope each call needs, and what stays in the web app.
What you can reach
| Area | Calls | Scope |
|---|---|---|
| Identity | GET /v1/identity; operations identity.me, workspace.inspect | read |
| Usage and credits | read of wm://credits and wm://receipt/{id}; operations credits.balance, credits.history, credits.activity, credits.holds, credits.inspect, credits.receipts, credits.budgets, credits.rates | read |
| Plans | operations billing.plans, billing.entitlements, billing.reviews (read); billing.checkout (write) | as listed |
| Workspace model policy | GET /v1/workspace/policy (read); PUT /v1/workspace/policy (write, owners and admins) | as listed |
| Webhooks | /v1/webhooks/endpoints/**, /v1/webhooks/deliveries/** | read to view, write to change |
| Provider connections | operations connections.list, connections.inspect (read); connections.create, connections.enrollment, connections.test, connections.revoke (write) | as listed |
| Personal settings | operations account.profile.inspect, account.settings.inspect, preferences.me (read); account.profile.save, account.settings.save, preferences.save (write) | as listed |
| Notifications | operations notifications.list, notifications.inspect, notifications.preferences.inspect (read); notifications.read, notifications.preferences.save (write) | as listed |
| Support | operations support.list, support.inspect, support.preview (read); support.submit, support.retry (write) | as listed |
| Data export | operations data.exports.list, data.exports.inspect (read); data.exports.create, data.exports.revoke (write) | as listed |
| Help, docs and blog | operations content.search, content.inspect, content.versions; also GET /api/content/articles/{slug} without a credential | read |
What stays in the web app
These are not reachable with a developer credential or an OAuth app:
- Members, roles and invitations. Inviting, changing a member's role, transferring ownership and renaming a workspace need a signed-in, password-authenticated browser session. A developer credential or OAuth token is refused.
- Developer credentials. Create, replace and revoke them in Connections › Developer setup. See Client credentials and provider keys.
- Provider keys. A key is entered only on the private enrollment page.
connections.enrollmentreturns a one-use link to that page; the key never travels through the API. - Sign-in, consent, passwords, recovery codes and legal agreements. These stay in their own browser flows. Never put a password, recovery code or provider key in an API or MCP request.
- Staff consoles. Publishing review, finance, support administration, moderation and infrastructure tools are separate and not reachable through these calls.
Roles and what they mean for API access
| Role | Effect on API access |
|---|---|
| Owner | Full administration, including the workspace model policy |
| Admin | Same API administration as an owner; can create workspace provider connections |
| Member | Uses the workspace with the scopes its credentials carry |
| Viewer | Read only: a viewer's session carries only read |
A developer credential or OAuth app acts with at most admin authority, and only when the person who created it is an administrator. Membership alone doesn't grant access to existing creative work. Read more in Keep account and workspace access clear.
Check identity
GET /v1/identity answers who a credential is:
curl --fail-with-body --header "Authorization: Bearer $WAVEMAKER_KEY" \
https://api.wavemaker.io/v1/identity
# → 200 {"ok": true, "data": {"schema": "wmcore.identity/1", "workspace": "...", "subject": "...",
# "credential": "...", "kind": "api_key", "mode": "live", "scopes": ["read", "run", "write"],
# "projects": null, "expires_at": 1793000000.0}, ...}kind is api_key for a developer credential and oauth for an app sign-in. mode is live, or test for a test workspace. workspace.inspect adds the workspace's execution policy and admission settings.
Usage and credits
readofwm://creditsreturns the balance in microcredits. 1 credit is 1,000,000 microcredits.- Each finished session turn links a
receipt(wm://receipt/{id}) with its settled cost;readit for the breakdown. credits.historylists credit movements, each marked added, charged, refunded, reserved, returned or restricted. Page withoffsetandlimit.credits.activityfilters workspace activity by date, project, job, model, payer and state. Its totals cover every matching record; afinal_chargeof null means pending, not zero.credits.receiptsexports usage with frozen prices and observed units. Pending observations are not settled charges.credits.holdslists current reservations, andcredits.budgetslists spending caps and what remains under them.
curl --fail-with-body --header "Authorization: Bearer $WAVEMAKER_KEY" \
--json '{"limit": 20, "newest_first": true}' \
https://api.wavemaker.io/api/v1/ops/credits.history
# → 200 {"schema": "wmlab.result/1", "ok": true, "data": {"items": [...], "offset": 0,
# "next_offset": 20, "total": 134}, "error": null}billing.checkout with a plan_hash from billing.plans and a request_id creates a hosted checkout and returns its url for a person to complete in the browser. Retry with the same request_id if the outcome is uncertain. Completing the redirect doesn't grant credits by itself; credits arrive when payment is confirmed. See Credits and Plans.
Workspace model policy
The workspace policy limits which models and routes any call in the workspace may use. It is enforced on generate and edit, for every member, credential and agent.
curl --fail-with-body --header "Authorization: Bearer $WAVEMAKER_KEY" \
https://api.wavemaker.io/v1/workspace/policy
# → 200 {"ok": true, "data": {"revision": 3, "allow": [], "block": [{"kind": "vendor", "value": "xai"}]}, ...}To change it, send the whole document with the revision you read:
curl --fail-with-body --header "Authorization: Bearer $WAVEMAKER_KEY" -X PUT \
--json '{"expected_revision": 3, "allow": [{"kind": "licence_class", "value": "commercial"}], "block": []}' \
https://api.wavemaker.io/v1/workspace/policy
# → 200 {"ok": true, "data": {"revision": 4, "allow": [...], "block": []}, ...}- Each item is
{kind, value}.kindisroute,model,vendor,licence_class(commercial,non_commercial,territory_limitedorpartner_api) orcontent_class(permissive). - block: a call using any matching route, model, vendor or class is refused.
- allow: once it names items of a kind, every fact of that kind must be on the list.
- Each list holds at most 200 items, and each value at most 200 characters.
- A call outside the policy is refused
workspace_policy_refused(403) with the offending item. Wavemaker never substitutes another model. - A stale
expected_revisionis refusedconflict(409): read again and reapply your change. - Saving needs
writeand owner or admin authority; anyone else getsscope_denied. Every save is audited.
Webhooks
Webhooks push session milestones and other workspace events to your HTTPS endpoint.
| Method and path | Purpose |
|---|---|
POST /v1/webhooks/endpoints | Create an endpoint: {url, events[], description}; returns its secret once (201) |
GET /v1/webhooks/endpoints, GET /v1/webhooks/endpoints/{id} | List or read endpoints |
PATCH /v1/webhooks/endpoints/{id} | Change url, events, enabled or description, with expected_revision |
POST /v1/webhooks/endpoints/{id}/rotate | Issue a new secret; the old one keeps signing for 24 hours |
POST /v1/webhooks/endpoints/{id}/test | Send a test event |
DELETE /v1/webhooks/endpoints/{id} | Remove an endpoint |
GET /v1/webhooks/deliveries, GET /v1/webhooks/deliveries/{id} | Read the delivery log |
POST /v1/webhooks/deliveries/{id}/retry | Send one more attempt for a failed delivery |
eventstakes exact types such asturn.completed, families such asturn.*, or*.- The URL must be public HTTPS with no credentials, query or fragment, at most 500 characters. Private, loopback and
localhostaddresses are refused, and redirects are never followed. - A workspace has at most 20 endpoints. Each attempt waits up to 10 seconds for your answer; a 2xx counts as delivered.
rotatereturns the newsecretonce, as create does.- Any other answer, or no answer, is retried after 30 seconds, 2 minutes, 10 minutes, 30 minutes, 2 hours and 6 hours, then marked
failed. Only afaileddelivery can be retried by hand; the retry is one more attempt with the same delivery id. - Each request carries
Wavemaker-Signature: t={unix},v1={hex},Wavemaker-EventandWavemaker-Delivery. Eachv1is HMAC-SHA256 over{t}.{raw body}with your secret; during a rotation the header carries twov1values. Deduplicate bydelivery_id. - Unknown request fields are refused
invalid_requestwithdetails.path.
Provider connections
The connections.* operations manage bring-your-own provider keys without ever carrying the key itself.
connections.createmakes the connection record.visibilitydefaults to personal; only an administrator can create a workspace connection.connections.enrollmentwith{id, version}returns a one-use link to the private key page. It expires after 10 minutes.connections.testwith{id, version}runs a read-only access check and stores the result inreadiness.state:ready,denied,unavailable,offlineorcredential_invalid, orunsupportedfor a provider with no check. A connection never checked readsuntested. Tests of one connection must be at least five seconds apart (connection_rate_limited).connections.revokedeletes the stored key. Provider work already dispatched may still incur cost.- The hosted agent's delegated credentials can't create, enroll, test or revoke connections.
See Client credentials and provider keys for what a saved key pays for.
Personal settings, notifications, support and exports
These operations act on you as a person, not on the workspace:
- They need a credential tied to your enrolled personal account. A credential without one is refused
personal_identity_unestablished. - A delegated agent's credential is refused
forbidden: "Use your own account to manage personal settings". - Profile and settings saves take the
revisionyou last read and arequest_id. A stale revision is a conflict: read again and reconcile instead of overwriting. data.exports.createprepares a portable archive you own. A workspace export also needs a current owner. Repeating the samerequest_idresumes the same export.support.submitopens a case in the in-app support channel. Callsupport.previewfirst and send itspreview_digestwith yourmessage(3 to 2,000 characters) and arequest_id. Don't include secrets in the message.
curl --fail-with-body --header "Authorization: Bearer $WAVEMAKER_KEY" \
--json '{"revision": 0, "request_id": "my-settings-1", "timezone": "America/New_York"}' \
https://api.wavemaker.io/api/v1/ops/account.settings.saveCalling older operations
| Route | Body |
|---|---|
POST /api/v1/ops/{name} | The arguments object |
POST /api/v1/operations/{name} | {"arguments": {...}} |
GET /api/v1/operations | None; returns the whole older catalog (needs read) |
Replies use the older envelope {schema: "wmlab.result/1", ok, data, error}, with error as {code, message, details}.
| Status and code | Meaning |
|---|---|
401 unauthorized | Missing or invalid credential, or one without the operation's scope; details name the required_scopes |
403 forbidden | The credential has the scope but not the authority, for example a delegated agent changing personal settings |
404 resource_missing | The thing named doesn't exist in this workspace |
| 404 with no envelope | /ops/{name} with a name outside the catalog |
422 request_invalid | The arguments don't match the operation's schema |
429 quota_exceeded | Too many requests; wait retry_after_seconds |
501 operation_not_ported | The name is in the catalog but this service doesn't answer it; it won't be added back |
503 service_busy or release_draining | Back off for retry_after_seconds, then retry |
- Each operation needs its own exact scope; there is no hierarchy between scopes.
GET /api/v1/operationslists served and unserved operations alike. Everyagents.*,productions.*,jobs.*,compute.*,creative.*andcapabilities.*operation, andmodels.list, answers 501. Use the tools and the session API for that work.- In the Python client, call an operation with
call("workspace.inspect")or its typed methodworkspace_inspect(). The TypeScript client usescall("workspace.inspect", {}), and the Go client has a typed method per operation, such asWorkspaceInspect. See Python, TypeScript and Go clients.
Help, documentation and blog content
content.search returns paginated metadata for published articles. content.inspect with a slug, and optionally a revision, returns the full body. content.versions pages an article's public history. Drafts and archived articles are not returned. The public route GET /api/content/articles/{slug} needs no credential.
Related
- Connect to Wavemaker
- HTTP API
- Client credentials and provider keys
- Connect an external agent with MCP
- Capability map