One API for SMS, WhatsApp and email
Call https://api.wrnexus.com/<app>/<operation> with your API key. Create keys, allow your server addresses and add webhooks in Account.
Authentication
Send the key in the Authorization header. Calls are accepted only from addresses on your Allowed list, and only for the apps and operations the key allows.
curl -X POST https://api.wrnexus.com/sms/send \
-H "Authorization: Bearer wrn_live_…" \
-H "Content-Type: application/json" \
-d '{"destination":"+919876543210","templateName":"otp","senderName":"WRNEXS","variables":{"code":"123456"}}'
Every response carries a requestId. Errors look like {"ok":false,"error":{"code":"ip-not-allowed","message":"…"}}.
Contacts
| Operation | Method and URL | Fields |
|---|---|---|
| recordsVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /contacts/records | query, after, limit, kind, archived |
| recordVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /contacts/record | id |
| createVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/create | record, target, requestKey |
| updateVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/update | id, revision, record, requestKey |
| archiveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/archive | id, revision, requestKey |
| linksVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /contacts/links | id |
| linkVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/link | id, revision, target, requestKey |
| method addVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/method-add | id, revision, method, requestKey |
| method retireVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /contacts/method-retire | id, revision, methodId, requestKey |
Webhook events: contacts.record.changed
Notes
| Operation | Method and URL | Fields |
|---|---|---|
| recordsVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /notes/records | query, after, limit, state |
| recordVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /notes/record | id |
| createVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /notes/create | record, target, requestKey |
| updateVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /notes/update | id, revision, record, requestKey |
| archiveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /notes/archive | id, revision, requestKey |
| linksVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /notes/links | id |
| linkVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /notes/link | id, revision, target, requestKey |
| revisionsVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /notes/revisions | id |
| restoreVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /notes/restore | id, revision, restoreRevision, requestKey |
Webhook events: notes.record.changed
Tasks
| Operation | Method and URL | Fields |
|---|---|---|
| recordsVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /tasks/records | query, after, limit, view |
| recordVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /tasks/record | id |
| createVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/create | record, target, requestKey |
| updateVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/update | id, revision, record, requestKey |
| archiveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/archive | id, revision, requestKey |
| linksVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /tasks/links | id |
| linkVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/link | id, revision, target, requestKey |
| statusVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/status | id, revision, status, requestKey |
| assignVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/assign | id, revision, userId, requestKey |
| checklistVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /tasks/checklist | id |
| checklist saveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/checklist-save | id, revision, items, requestKey |
| watchersVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /tasks/watchers | id |
| watchers saveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/watchers-save | id, revision, users, requestKey |
| recurrence saveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /tasks/recurrence-save | id, revision, rule, requestKey |
Webhook events: tasks.record.changed
Calendar reminders
| Operation | Method and URL | Fields |
|---|---|---|
| remindersVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /calendar/reminders | after, limit |
| reminderVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /calendar/reminder | id |
| reminder saveVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /calendar/reminder-save | reminder, requestKey |
| reminder stopVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | POST /calendar/reminder-stop | id, revision, requestKey |
| reminder jobsVersion 1 shared productivity operation. Organization, environment and workspace are fixed by the key; record permissions are rechecked. | GET /calendar/reminder-jobs | id |
Webhook events: calendar.reminder.changed
SMS
| Operation | Method and URL | Fields |
|---|---|---|
| Service BalanceRead the organization’s shared Service Balance in minor currency units. | GET /sms/balance | — |
| Send SMSSend an approved template to one number. | POST /sms/send | destination, templateName, senderName, variables, idempotencyKey |
| Check statusCurrent delivery status of one message. | GET /sms/status | id |
| Message detailsFull details of one message. | GET /sms/details | id |
| List messagesRecent messages, newest first. | GET /sms/list | limit, status |
| List templatesApproved templates you can send. | GET /sms/templates | — |
| List sender IDsVerified sender IDs you can send from. | GET /sms/senders | — |
Webhook events: sms.message.queued, sms.message.submitted, sms.message.delivered, sms.message.failed
| Operation | Method and URL | Fields |
|---|---|---|
| Service BalanceRead the organization’s shared Service Balance in minor currency units. | GET /whatsapp/balance | — |
| Send messageSend a text or approved template message. | POST /whatsapp/send | to, kind, text, template_id, body_values, number_id, idempotency_key |
| Check statusCurrent status of one message. | GET /whatsapp/status | id |
| Fetch messageFull details of one message. | GET /whatsapp/details | id |
| List messagesRecent messages, newest first. | GET /whatsapp/list | limit, status |
| List templatesApproved templates you can send. | GET /whatsapp/templates | — |
Webhook events: whatsapp.message.sent, whatsapp.message.delivered, whatsapp.message.read, whatsapp.message.failed, whatsapp.message.received, whatsapp.template.updated, whatsapp.order.paid
| Operation | Method and URL | Fields |
|---|---|---|
| Service BalanceRead the organization’s shared Service Balance in minor currency units. | GET /email/balance | — |
| Send emailSend an email from an assigned sender. | POST /email/send | to, senderKey, fromName, subject, htmlBody, textBody, templateId |
| Check statusCurrent delivery status of one email. | GET /email/status | id |
| Fetch emailFull details of one email. | GET /email/details | id |
| List emailsRecent emails, newest first. | GET /email/list | limit, status |
| List templatesTemplates you can send. | GET /email/templates | — |
Webhook events: email.message.queued, email.message.submitted, email.message.accepted, email.message.deferred, email.message.failed, email.message.tracking_unknown, email.message.opened, email.message.clicked, email.message.bounced, email.message.complained, email.message.unsubscribed
Notifications
| Operation | Method and URL | Fields |
|---|---|---|
| AppsList apps and their configured channel routes. | GET /notifications/apps | — |
| Save appGroup Android, iOS and channel connections in one app. | POST /notifications/app-save | id, revision, name, active, config |
| Send across channelsAdmit selected channels together with retry-safe billing. | POST /notifications/app-send | appId, recipientId, channels, title, body, purpose, category, templateId, variables, url, screen, idempotencyKey |
| Push analyticsProvider submission and SDK-observed device receipt, opening and reading. | GET /notifications/push-analytics | days, recipientId, connectionId, platform, category, status |
| List workflow runsBrowse scoped workflow run status without event payloads. | GET /notifications/workflow-runs | workflowId, cursor, limit |
| Read workflow runRead a retained run and its event/recipient snapshot. | GET /notifications/workflow-run | runId |
| List workflow stepsBrowse durable node outcomes and linked send processing. | GET /notifications/workflow-steps | runId, cursor, limit |
| Cancel workflow runCancel the current revision and stop linked pending work; accepted and uncertain provider submissions remain retained. | POST /notifications/workflow-run-cancel | runId, revision |
| Record workflow eventRecord an idempotent recipient event and retain matching published workflow runs. Records a correlation key for event processing; omitted keys use the recipient ID. | POST /notifications/workflow-event | idempotencyKey, recipientId, event, correlationKey, data |
| List workflowsBrowse scoped workflow drafts and active versions. | GET /notifications/workflows | cursor, limit |
| Read workflowRead a scoped workflow draft. | GET /notifications/workflow | workflowId |
| List workflow versionsBrowse retained workflow definitions and approval state. | GET /notifications/workflow-versions | workflowId, cursor, limit |
| Read workflow versionRead an immutable retained workflow definition. | GET /notifications/workflow-version | versionId |
| Save workflow draftCreate or revise a typed workflow graph. Send nodes support config.delivery.urgent=true only with transactional published content. Delivery requires the published version creator's active urgent permission and shared hourly allowance. Does not start runs. | POST /notifications/workflow-save | id, revision, name, config |
| Prepare workflow versionRetain a draft revision and its pinned templates; required approval stays pending. Does not start runs. | POST /notifications/workflow-publish | workflowId, revision |
| Approve workflow versionApprove the exact retained version without replacing a newer active revision. | POST /notifications/workflow-approve | versionId |
| Browse campaign deliveriesPage through a scoped occurrence's per-recipient/channel delivery ledger, status, units and output identity. | GET /notifications/campaign-deliveries | runId, limit, cursor |
| Browse campaign schedulesPage through scoped schedule history for a campaign, including cancelled versions. | GET /notifications/campaign-schedules | campaignId, limit, cursor |
| Schedule campaign versionRegister an approved immutable campaign version and capture schedule-time audience. Occurrence materialization and delivery use separate workers. | POST /notifications/campaign-schedule-create | versionId |
| Pause, resume or cancel campaign scheduleRevision-checked controls stop future occurrence creation and change queued runs. Already submitted deliveries require separate reconciliation. | POST /notifications/campaign-schedule-control | scheduleId, revision, action |
| Read campaign scheduleRead scoped schedule state, revision, next occurrence and saved advisory estimate. | GET /notifications/campaign-schedule | scheduleId |
| Browse campaign runsPage through scoped persisted occurrences and audience capture state. | GET /notifications/campaign-runs | scheduleId, limit, cursor |
| Estimate campaign unitsEstimate current consent and policy eligible contacts/devices and unit bounds without reserving or sending. Advisory only; managed carrier quotes and transport readiness are evaluated separately. | POST /notifications/campaign-estimate | config |
| Preview campaign audienceCount and page current scoped campaign membership. This does not capture recipients or imply consent, channel eligibility, units or carrier costs. | POST /notifications/campaign-audience-preview | audience, limit, cursor |
| Preview campaign occurrencesResolve the next local-calendar campaign times without saving, scheduling or sending. Explicit UTC/offset cutoff; monthly dates clamp, repeated times run once and skipped times shift forward. | POST /notifications/campaign-schedule-preview | schedule, after, limit |
| List campaign draftsPage through scoped campaign drafts. Publishing prepares immutable versions; execution is separate. | GET /notifications/campaigns | limit, cursor |
| Read campaign draftRead a scoped campaign configuration and revision. | GET /notifications/campaign | campaignId |
| Read campaign versionRead immutable campaign configuration and publication/approval state. | GET /notifications/campaign-version | versionId |
| List campaign versionsBrowse scoped retained campaign versions and approval state. | GET /notifications/campaign-versions | campaignId, cursor, limit |
| Estimate retained campaign versionReview current advisory policy and unit counts and future dates using immutable version settings. Does not reserve, approve, schedule or send. | GET /notifications/campaign-version-estimate | versionId |
| Save campaign draftCreate or revise validated audience, schedule, delivery, limits and A/B settings. Optional config.delivery.urgent=true requires transactional template content. Delivery requires the scheduled sender's active urgent permission and shared hourly allowance per message/device. Does not schedule or send. | POST /notifications/campaign-save | id, revision, name, config |
| Prepare campaign versionFreeze a campaign revision and pin approved template content; required approval remains pending. Does not launch. | POST /notifications/campaign-publish | campaignId, revision |
| Approve campaign versionApprove the exact immutable campaign version. Does not launch. | POST /notifications/campaign-approve | versionId |
| List recipient segmentsPage through scoped dynamic recipient segments. | GET /notifications/segments | limit, cursor |
| Read recipient segmentRead saved audience rules and their current revision. | GET /notifications/segment | segmentId |
| Browse segment recipientsEvaluate saved audience rules against current scoped profiles. Dispatch still rechecks consent and delivery policy. | GET /notifications/segment-members | segmentId, limit, cursor |
| Save recipient segmentCreate or revise validated dynamic audience rules. | POST /notifications/segment-save | id, revision, name, description, rules |
| Preview recipient segmentEvaluate draft audience rules without saving, sending or changing consent. | POST /notifications/segment-preview | rules, limit, cursor |
| Validate recipient CSVValidate up to 500 recipient rows and explicit destination consent without changing recipients or sending messages. | POST /notifications/recipient-import-preview | csv |
| Export in-app report pageOwner-only scoped CSV of in-app creation, read and archive timestamps. Excludes titles, bodies, links and action content. Follow nextCursor to export the remaining records. | GET /notifications/inbox-export | limit, cursor |
| Export dispatch report pageOwner-only scoped CSV of external handoff outcomes and earliest recorded delivery/read/bounce/complaint/failure timestamps. Empty receipt fields mean no evidence recorded. Accepted means provider acceptance, not confirmed delivery or read. Excludes content, addresses, credentials and attachment details; follow nextCursor with the same filters. | GET /notifications/delivery-export | limit, cursor, channel, status |
| Export recipient pageExport scoped profile and destination CSV pages; preserves every address and explicit consent, excludes bearer tokens. Follow nextCursor for the remaining audience. | GET /notifications/recipient-export | limit, cursor |
| Import recipient CSVAtomically upsert validated recipient profiles and explicit destination consent; never sends messages or clears suppression. | POST /notifications/recipient-import | csv |
| Upsert recipient batchAtomically upsert up to 500 scoped profiles with optional explicit destination consent. | POST /notifications/recipient-bulk-upsert | recipients |
| Read recipient groupRead a scoped group and its current revision. | GET /notifications/group | groupId |
| Browse group recipientsPage through scoped members or recipients available to add, with optional name or customer ID search. | GET /notifications/group-members | groupId, membership, search, limit, cursor |
| List recipient groupsList scoped recipient groups and membership counts. | GET /notifications/groups | limit, cursor |
| Save recipient groupCreate or revise a scoped recipient group. | POST /notifications/group-save | id, revision, name, description |
| Update group membersAtomically add and remove scoped recipients without changing consent. | POST /notifications/group-members-update | groupId, revision, add, remove |
| Send approved WhatsAppReserve the notification processing fee from Service Balance and queue approved content through a scoped registered business number. Optional urgent=true requires transactional purpose and an active sender permission with available hourly allowance; consent and provider approval still apply. | POST /notifications/whatsapp-send | recipientId, destinationId, guest, numberId, templateId, templateSnapshotHash, variables, headerText, code, couponCode, offerExpiresAt, urlSuffix, purpose, category, idempotencyKey, urgent |
| Send approved SMSReserve the notification processing fee from Service Balance and queue approved content through a verified sender. Select connectionId or useDefaultProvider=true. Optional backupConnectionIds retain order; the reserved managed backup requires allowPaidManagedBackup=true and maxManagedCostMinor. Backups follow confirmed pre-submission failures only. Retries retain reviewed routes; managed delivery uses Service Balance. Optional urgent=true requires transactional purpose and an active sender permission with available hourly allowance. | POST /notifications/sms-send | recipientId, destinationId, guest, senderId, templateId, templateSnapshotHash, variables, connectionId, useDefaultProvider, backupConnectionIds, allowPaidManagedBackup, maxManagedCostMinor, purpose, category, idempotencyKey, urgent |
| Mobile push connectionsRead scoped mobile provider setup without private credentials. | GET /notifications/mobile-connections | — |
| Email connectionsRead scoped Email provider metadata, form revision and delivery revision without SMTP credentials. | GET /notifications/email-connections | — |
| Save Email connectionConfigure authenticated customer SMTP (TLS on port 465 or STARTTLS on 587) or an assigned managed Email sender. Supply the current revision when editing; omit smtpPassword to retain it. Mode cannot change. Credentials are never returned. | POST /notifications/email-connection-save | id, revision, name, mode, fromAddress, active, isDefault, smtpHost, smtpPort, smtpUsername, smtpPassword, managedSenderKey |
| External SMS connectionsRead scoped TLS SMPP provider metadata and country compliance settings without credentials. | GET /notifications/external-sms-connections | — |
| SMS provider defaultRead the selected environment’s SMS default provider mode, identity and revision without credentials. | GET /notifications/sms-provider-default | — |
| Save SMS provider defaultChoose managed delivery or an active compliant external SMS provider. Supply the current settings revision; changing this default never alters existing queued sends. | POST /notifications/sms-provider-default-save | mode, connectionId, revision |
| BrandingRead the display name, brand colour and logo shown on hosted preference pages and the recipient inbox for the selected environment. | GET /notifications/branding | — |
| Save brandingSet the display name, brand colour (#rrggbb) and logo (PNG, JPEG or WebP up to 256 KiB, base64) shown to recipients. Omit a field to keep it, send null to clear it, and supply the current revision. | POST /notifications/branding-save | displayName, brandColor, logo, revision |
| Email designsList published Email-studio designs a template's Email content can use, with the variables each needs. Saving a template with email.design {templateId, versionId} copies that exact version in. | GET /notifications/email-designs | — |
| Test recipientsList Test-environment recipients approved for real delivery and the channels that deliver for real (in-app, web push, mobile push, Email, SMS and WhatsApp, direct or managed). Messages using the simulation sender, number or template stay simulated. | GET /notifications/test-recipients | — |
| Approve test recipientApprove a Test-environment recipient for real delivery. Up to 25 per organisation. Applies to messages admitted afterwards; real Test sends consume Test units. | POST /notifications/test-recipient-approve | recipientId |
| Revoke test recipientStop real Test delivery to a recipient. Queued messages that have not been submitted are simulated instead. | POST /notifications/test-recipient-revoke | recipientId |
| Custom domainsList hostnames for hosted preference pages with their DNS TXT verification record, CNAME target and verification status. | GET /notifications/custom-domains | — |
| Add custom domainAdd a hostname for hosted preference pages. It routes only after verification. Up to five per environment; platform, local and IP hosts are refused. | POST /notifications/custom-domain-save | hostname |
| Verify custom domainCheck the hostname's _wrnexus-notifications TXT record. A host can be verified by only one organisation; unverified hosts stay pending with a reason. | POST /notifications/custom-domain-verify | id |
| Remove custom domainStop serving hosted preference pages on a hostname. Links already sent with that host stop working. | POST /notifications/custom-domain-remove | id |
| Save external SMS connectionSave a TLS SMPP connection and supported country compliance profile. Supply the current revision when editing; omitted credentials and compliance are retained. Credentials are never returned. | POST /notifications/external-sms-connection-save | id, revision, name, server, systemId, password, active, compliance |
| Save mobile push connectionConfigure a customer-owned FCM/APNs connection or an explicitly provisioned managed application. | POST /notifications/mobile-connection-save | id, revision, name, provider, mode, applicationId, projectId, clientEmail, teamId, keyId, sandbox, privateKey, active, isDefault |
| Send mobile pushFreeze device targets and reserve one unit per device. Optional urgent=true requires transactional purpose and an active sender permission with hourly allowance for every target device. Test sends simulate by default. | POST /notifications/mobile-push-send | recipientId, connectionId, deviceIds, content, purpose, category, idempotencyKey, urgent |
| Send web push templateSend a published version with translated content and frozen device targets. Optional urgent=true requires a transactional published version and an active sender permission with hourly allowance for every target device. | POST /notifications/push-template-send | templateId, versionId, recipientId, connectionId, deviceIds, variables, idempotencyKey, urgent |
| Send mobile push templateSend a published version with translated content and frozen device targets. Optional urgent=true requires a transactional published version and an active sender permission with hourly allowance for every target device. | POST /notifications/mobile-push-template-send | templateId, versionId, recipientId, connectionId, deviceIds, variables, idempotencyKey, urgent |
| Mobile push request statusRead retained scoped mobile submission outcomes. | GET /notifications/mobile-push-request | requestId |
| Send web pushFreeze the active target devices and reserve one unit per device. Optional urgent=true requires transactional purpose and an active sender permission with hourly allowance for every target device. Test sends simulate without provider contact. | POST /notifications/push-send | recipientId, connectionId, deviceIds, content, purpose, category, idempotencyKey, urgent |
| Web push request statusRead the retained outcomes for a scoped web push request. | GET /notifications/push-request | requestId |
| Web push connectionsRead scoped web push connections and public subscription keys. | GET /notifications/push-connections | — |
| Save web push connectionConfigure a managed or customer-owned VAPID pair. Private credentials are write-only and encrypted. | POST /notifications/push-connection-save | id, revision, name, mode, subject, publicKey, privateKey, active, isDefault |
| List templatesList scoped in-app template drafts. | GET /notifications/templates | limit, cursor |
| Template detailsRead a draft and retained version history. | GET /notifications/template | templateId |
| Save templateSave a draft with an optimistic revision check. Approval policy is fixed on creation. | POST /notifications/template-save | id, revision, name, content, requireApproval |
| Publish templateFreeze a draft revision; approval-enabled templates wait for explicit approval. | POST /notifications/template-publish | templateId, revision |
| Approve template versionApprove and publish an immutable submitted version. | POST /notifications/template-approve | versionId |
| Preview templateRender content without sending or charging units. | POST /notifications/template-preview | content, language, variables, previewChannel |
| Send templateSend the latest published version or an exact published version; retries retain their original version. Optional urgent=true requires transactional published content and an active sender permission with available hourly allowance. | POST /notifications/template-send | templateId, versionId, recipientId, variables, idempotencyKey, urgent |
| Recipient preference linkIssue short-lived, revocable access to the hosted preference page only. | POST /notifications/recipient-preference-link | recipientId |
| Recipient detailsRead a scoped recipient, preferences and in-app suppression. | GET /notifications/recipient | recipientId |
| Save recipient destinationAdd or update a scoped email or phone destination with explicit consent and reversible delivery access. | POST /notifications/destination-save | recipientId, destinationChannel, address, active, marketingConsent, consentEvidence |
| Queue email notificationQueue Email using connectionId, useDefaultConnection=true, or a legacy senderKey. Connection and default choices are mutually exclusive; senderKey is required only for legacy routing. Admission pins provider identity on replay. Optional urgent=true requires transactional purpose and an active sender permission, consumes the hourly urgency allowance and bypasses quiet hours. Test mode simulates delivery. | POST /notifications/email-send | recipientId, destinationId, guest, senderKey, fromName, content, connectionId, useDefaultConnection, attachments, purpose, category, idempotencyKey, urgent |
| Queue email templateQueue an exact or latest published Email template using connectionId, useDefaultConnection=true, or a legacy senderKey. Connection and default choices are mutually exclusive. Retries retain the original version and provider identity. Optional urgent=true requires transactional published content and an active sender permission with available hourly allowance. | POST /notifications/email-template-send | templateId, versionId, recipientId, destinationId, senderKey, fromName, variables, attachments, idempotencyKey, connectionId, useDefaultConnection, urgent |
| List channel dispatchesRead scoped channel dispatch states, including unknown acceptance and simulations. | GET /notifications/dispatches | limit, cursor |
| Pause recipient notificationsPause or resume in-app delivery with an audit reason. | POST /notifications/recipient-suppression | recipientId, suppressed, reason |
| List recipientsList recipients in the key's environment. | GET /notifications/recipients | limit, cursor |
| Save recipientCreate or update a customer recipient. | POST /notifications/recipient-upsert | customerId, name, language, attributes |
| Issue recipient tokenIssue a short-lived token for an existing recipient's inbox. | POST /notifications/recipient-token | recipientId, ttlSeconds |
| Revoke recipient tokensInvalidate every outstanding token for one recipient. | POST /notifications/recipient-token-revoke | recipientId |
| Send in-app notificationInsert an in-app notification and charge the notification processing fee from Service Balance. Optional urgent=true requires transactional purpose and an active sender permission, consumes the hourly urgency allowance and bypasses quiet hours. | POST /notifications/send | recipientId, title, body, purpose, category, url, actions, idempotencyKey, urgent |
| List in-app deliveriesRead recent in-app deliveries in the key's environment. | GET /notifications/deliveries | limit, cursor |
| Notification unitsRead Service Balance billing, current notification processing rates and usage. The legacy units field reports affordable, pending and processed notification counts. | GET /notifications/units | — |
Webhook events: notifications.campaign.run.completed, notifications.campaign.run.expired, notifications.campaign.run.cancelled, notifications.campaign.scheduled, notifications.campaign.paused, notifications.campaign.resumed, notifications.campaign.cancelled, notifications.campaign.run.created, notifications.campaign.run.targets.frozen, notifications.campaign.audience.captured, notifications.campaign.saved, notifications.campaign.submitted, notifications.workflow.saved, notifications.workflow.submitted, notifications.workflow.published, notifications.workflow.event.recorded, notifications.workflow.run.started, notifications.workflow.run.cancelled, notifications.workflow.run.completed, notifications.workflow.run.failed, notifications.workflow.step.completed, notifications.workflow.send.admitted, notifications.campaign.published, notifications.group.saved, notifications.group.members.updated, notifications.segment.saved, notifications.message.queued, notifications.message.accepted, notifications.message.rejected, notifications.message.unknown, notifications.message.cancelled, notifications.message.simulated, notifications.message.reconciled, notifications.message.resumed, notifications.connection.updated, notifications.device.registered, notifications.device.rotated, notifications.device.unregistered, notifications.destination.updated, notifications.preferences.updated, notifications.template.published
SEO and Content
| Operation | Method and URL | Fields |
|---|---|---|
| List websitesRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/websites | cursor |
| List ai-modelsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/ai-models | cursor |
| List ai-reviewsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/ai-reviews | cursor |
| List ai-review-batchesRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/ai-review-batches | cursor |
| List auditsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/audits | cursor |
| List findingsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/findings | cursor |
| List keywordsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/keywords | cursor |
| List contentRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/content | cursor |
| List versionsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/versions | cursor |
| List approvalsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/approvals | cursor |
| List publicationsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/publications | cursor |
| List publication-checksRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/publication-checks | cursor |
| List mediaRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/media | cursor |
| List researchRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/research | cursor |
| List metricsRead organization-scoped SEO records in the single Live workspace with cursor pagination. | GET /seo/metrics | cursor |
| Request AI site reviewExplicitly request AI review of every retained page in a completed site audit, with one total charge limit. | POST /seo/ai-review-start | siteId, auditId, modelId, requestKey, maxChargeMinor |
| Reconcile AI site reviewResume the same incomplete review using its original paid operation identities. | POST /seo/ai-review-resume | siteId, id |
| Stop AI site reviewStop remaining batches; an in-flight paid batch may still finish and charge. | POST /seo/ai-review-cancel | siteId, id |
| Add websiteAdd a public HTTPS website; ownership verification remains a separate operation. | POST /seo/website-create | name, url, locale, goal, maxPages, maxDepth |
| Queue auditQueue a bounded audit of an ownership-verified site in Live mode. | POST /seo/audit-start | siteId |
| Add keywordMap a keyword to a site, country, language and device. | POST /seo/keyword-add | siteId, query, country, language, device, targetUrl, cluster |
| Save article versionUpdate an existing article with revision guards. Initial article creation uses the editor. | POST /seo/content-save | id, revision, title, slug, locale, description, body, blocks, sources, remoteHash, remoteId, importNotes, wordpress, publishAt |
| Create article draftCreate an article draft once using a UUID request key. Reusing the key requires identical content. | POST /seo/content-create | siteId, requestKey, title, slug, locale, description, body, blocks, sources, wordpress |
| Transfer or reconcile article imageCopy a saved PNG or JPEG image block to WordPress and save a new draft version. Requires Live mode, edit and publish permissions, accepted bridge and a UUID requestKey. Reuse the key after uncertainty; newer article edits are preserved. | POST /seo/wordpress-media | id, revision, blockIndex, requestKey |
| Check public publicationInspect a completed publication's public static response against its reviewed version. Requires Live mode, publish permission and verified ownership. Records observations without claiming indexing or ranking. | POST /seo/publication-check | id |
| Refresh WordPress choicesRead permitted category, tag, author and featured-image choices and cache the bounded result. Requires Live mode, edit permission and verified ownership. Specify siteId or an existing article id; search narrows the choices. | POST /seo/wordpress-choices | siteId, id, search |
| Import WordPress draftImport a post as an unapproved draft using siteId, remoteId and a UUID requestKey; refresh an existing bound article using id and its current revision. Requires Live mode and edit permission. Unsupported content fails without saving. | POST /seo/wordpress-import | siteId, remoteId, requestKey, id, revision |
| Request article reviewAssign an active reviewer to the exact current document version. | POST /seo/review-request | id, revision, reviewerId |
| Decide article reviewThe assigned reviewer approves or requests changes on an exact version. | POST /seo/review-decide | id, revision, decision, note |
| Queue licensed researchReserve allowance and queue a paid job using a unique request key. | POST /seo/research-start | siteId, kind, requestKey, seed, locationCode, language, keywordId, competitorId |
| Publish or reconcilePublish an approved article version or reconcile the same durable operation key. | POST /seo/publish | id, revision, requestKey |
Webhook events: seo.media.completed, seo.website.created, seo.audit.queued, seo.content.saved, seo.review.requested, seo.review.decided, seo.publication.completed
Webhooks
Each delivery is a POST with the JSON body {"id","event","app","createdAt","data"}. It carries your secret in X-WRNexus-Secret and X-WRNexus-Signature: v1=HMAC-SHA256(secret, timestamp + "." + body) with X-WRNexus-Timestamp. Reply with any 2xx status; failed deliveries are retried up to six times.