Messaging and media
Read and send supported text, voice, and files. Respect the capabilities and permissions of each conversation.

Let your users connect their own Robono accounts and send and receive messages through your app. Integrate directly with the SDK; each user chooses whether to give it access.
Developer preview. The SDK is published on npm as @robono/linked-apps@0.1.0-preview.4. No SDK archive is offered on this website. No developer signup, app registration, API key or manual activation is required. Each user enters a code and approves inside Robono; no separate user registration or extra SMS check is needed.
Your app provides the experience. Each person approves access to their own Robono account. You do not need to operate a messaging network or connect through Robono Bridge.
Read and send supported text, voice, and files. Respect the capabilities and permissions of each conversation.
The user reviews your app and requested access inside Robono. They can revoke access from Linked apps.
Use the TypeScript SDK or the HTTP API. Supply your app details in code. Access is limited to each account’s approved permissions.
Connecting an entire messaging network? Explore Robono Bridge. Linked Apps is for acting on behalf of an existing Robono account.
Install the supported TypeScript SDK preview and pin its exact version:
npm install --save-exact @robono/linked-apps@0.1.0-preview.4View the package on npm · Read the SDK license
Commit your lockfile and review release notes before updating. Apps that do not use TypeScript can implement the HTTP API directly using the app details described in the integration guide.
Set your app name, developer name, public website and privacy-policy URL in the SDK configuration. Robono identifies the integration automatically. There is no website form to complete, developer account to create, or client ID to request.
Keep these details stable. App identity is supplied by your app, not verified or endorsed by Robono. Use a different app name and separate secure storage for development tests.
Start pairing with the SDK and show the returned code. The user enters it in Robono → Linked apps → Connect an app, then reviews the app, account, and permissions. The SDK completes the connection after approval. Handle denial and expired codes too.
Use the user linking guide for your help link. Once connected, show the linked account and a Disconnect option in your app. Never ask users to share a Robono SMS verification code with your app.
Follow the implementation and test checklist below, including text and voice, offline recovery, user revocation and account switching. Test every platform you support before offering the feature to users. SDK installation alone does not authorize any user account.
| Permission | Allows your app to |
|---|---|
account:read | Identify the account that approved your app. |
messages:read | Read available conversations and messages, download media, and synchronize changes. |
messages:send | Send messages and upload media to permitted conversations. |
receipts:write | Mark messages delivered, read, or heard when those actions actually happen. |
Permission does not override a contact's block, a disconnected relationship, a network's communication rules, or required approvals. This API does not create new contact connections or change those rules.
The preview SDK, @robono/linked-apps, handles linking, credential refresh, messaging and synchronization. Install the pinned npm version shown above. Use the HTTP API reference if your platform does not use TypeScript.
This example shows the flow. Supply your platform's secure storage, cryptography, app-opening and lifecycle handlers. The integration guide includes React Native adapter examples for iOS and Android.
import { RobonoLinkedApps } from '@robono/linked-apps';
const robono = new RobonoLinkedApps({
app: {
name: 'Your App',
developerName: 'Your Company',
websiteUrl: 'https://example.com',
privacyUrl: 'https://example.com/privacy',
},
tokenStore, // Keychain / Keystore adapter
crypto, // Secure platform crypto adapter
});
// Requires @robono/linked-apps 0.1.0-preview.4 or newer.
const pairing = await robono.beginPairing(
['account:read', 'messages:read', 'messages:send']
);
// Display pairing.userCode. Keep pairing.pending in secure storage.
// User: Robono → Linked apps → Connect an app → enter code → approve.
const controller = new AbortController();
// Cancel on leaving the screen/backgrounding; resume on return if unexpired.
await robono.waitForPairing(pairing.pending, controller.signal);
// Connected: credentials have been saved through tokenStore.Keep tokens and the pending verifier in Keychain or Keystore. Codes expire after five minutes. No callback URL or extra SMS verification is needed for code pairing. Use one SDK instance per connected account and coordinate refreshes across processes.
const conversations = await robono.conversations();
const history = await robono.messages(conversationId, { limit: 50 });
// Generate and persist a UUID once; reuse it on retries.
await robono.send({
conversationId,
clientMessageId: savedOutgoingId,
messageKind: 'text',
textBody: 'Hello from our app',
});Use conversation capabilities to decide which tools to display. A successful send response acknowledges acceptance; it does not prove that the recipient has received or heard a message.
For voice or files, call createUpload, upload the bytes with uploadBytes, then call send with the returned media ID. Preserve a recording's measured duration. The API reference lists media fields and supported message kinds.
Use download for an expiring playback or download URL. Keep URLs private. Mark a voice message heard only after actual listening.
Use watch to open an authenticated persistent connection. The SDK reconnects and recovers missed changes from a saved cursor. No delivery endpoint needs registration. Save the cursor after processing succeeds, deduplicate message IDs, and reconcile deleted or unavailable content. Events are retained for seven days; an expired cursor requires a fresh synchronization.
For background notifications, your backend can maintain the same SDK connection and route updates to your users. No webhook is offered. Protect linked credentials and coordinate token refreshes through one owner per grant.
Your backend sends a content-free sync hint using your own app's APNs, FCM, or Expo credentials. Fetch current messages when the app wakes or resumes. Background execution is controlled by the operating system and is not guaranteed. Keep companion hints silent by default to avoid duplicating Robono alerts.
Current preview limits per grant, per minute: 60 send operations, 120 media operations, 120 event polls, and 300 other operations. Authorization starts are limited to 60 per app per minute. Limits may change before production.
Respect HTTP 429 responses and back off. Retry a message with its original saved UUID to avoid duplicates. Do not blindly retry token exchanges: refresh tokens rotate, and reusing a spent refresh token revokes access.
Access tokens last 10 minutes, refresh tokens up to 30 days, and grants up to 90 days. Ask the user to reconnect when needed. Never log credentials, callback codes, or message contents.
Call disconnect() to revoke your connection, then stop watchers and clear cached account data. Also handle revocation from Robono, account deletion, and account switching. Previously received data must be handled according to your disclosed retention and deletion policy.
Keep your test results. Publish your data-use, retention and deletion practices, protect credentials, and provide support and security contacts. Do not sell message content or use access beyond the user's consent.
API documentation, setup instructions and integration examples. Install the SDK and configure your app details to begin. Account access requires each user’s approval.
The example is a host-independent starting point. Your app supplies its own interface, secure adapters and notification delivery. The SDK is distributed through npm under the published SDK license.
Review Robono's privacy notice, terms, and acceptable use policy.
Start with the SDK example above. Every developer can integrate directly without contacting Robono.
Start integrating