How It Works
All 6 API protocols converge into the Opsalis marketplace. Each is routed to the appropriate API owner on the NYC server with 6 mock servers running.
Why Multi-Protocol Support?
APIs aren't monolithic. A single organization might run REST for public endpoints, GraphQL for mobile clients, SOAP for legacy integrations, and gRPC for internal microservices. Forcing everything into one protocol means rewriting code that already works.
Opsalis handles every protocol natively. Register your API regardless of what protocol it speaks — the wrapper detects the protocol, routes the request correctly, and handles any necessary conversion. Consumers and owners both use whatever protocol they prefer.
This demo runs all 6 supported protocols in parallel against the same test infrastructure. Compare latencies side by side and see that protocol choice doesn't impact performance — the P2P mesh handles them all equally.
Live Demo — Run All 6 Protocols
REST API Call
GraphQL Query
SOAP Operation
gRPC Call
JSON-RPC Call
XML-RPC Call
Code Samples
# Run all 6 protocols in parallel with bash
curl -X POST https://opsalis.com/api/demo/api/bb-sse-ticker \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"symbol":"AAPL"}' &
curl -X POST https://opsalis.com/api/demo/api/bb-graphql \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"query":"{ users { id name } }"}' &
curl -X POST https://opsalis.com/api/demo/api/bb-soap \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"operation":"getBalance","accountId":"ACC-001"}' &
curl -X POST https://opsalis.com/api/demo/api/bb-grpc \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"service":"UserService.GetUser","user_id":42}' &
curl -X POST https://opsalis.com/api/demo/api/bb-jsonrpc \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"method":"getServerInfo","params":{"verbose":true}}' &
curl -X POST https://opsalis.com/api/demo/api/bb-xmlrpc \
-H "Content-Type: application/json" \
-H "X-Consumer-Key: demo-public-key-2026" \
-d '{"method":"wp.getPost","post_id":1}' &
wait # All 6 complete in parallel
const headers = {
'Content-Type': 'application/json',
'X-Consumer-Key': 'demo-public-key-2026'
};
const base = 'https://opsalis.com/api/demo';
// Run all 6 protocols in parallel
const [rest, graphql, soap, grpc, jsonrpc, xmlrpc] = await Promise.all([
fetch(`${base}/api/bb-sse-ticker`, {
method: 'POST', headers, body: JSON.stringify({ symbol: 'AAPL' })
}),
fetch(`${base}/api/bb-graphql`, {
method: 'POST', headers, body: JSON.stringify({ query: '{ users { id name } }' })
}),
fetch(`${base}/api/bb-soap`, {
method: 'POST', headers, body: JSON.stringify({ operation: 'getBalance', accountId: 'ACC-001' })
}),
fetch(`${base}/api/bb-grpc`, {
method: 'POST', headers, body: JSON.stringify({ service: 'UserService.GetUser', user_id: 42 })
}),
fetch(`${base}/api/bb-jsonrpc`, {
method: 'POST', headers, body: JSON.stringify({ method: 'getServerInfo', params: { verbose: true } })
}),
fetch(`${base}/api/bb-xmlrpc`, {
method: 'POST', headers, body: JSON.stringify({ method: 'wp.getPost', post_id: 1 })
})
]);
const results = await Promise.all(
[rest, graphql, soap, grpc, jsonrpc, xmlrpc].map(r => r.json())
);
console.log('All 6 protocols returned:', results);
import asyncio
import aiohttp
BASE = 'https://opsalis.com/api/demo'
HEADERS = {
'Content-Type': 'application/json',
'X-Consumer-Key': 'demo-public-key-2026'
}
async def call_api(session, api_id, payload):
async with session.post(f'{BASE}/{api_id}', json=payload, headers=HEADERS) as resp:
return await resp.json()
async def run_all():
async with aiohttp.ClientSession() as session:
results = await asyncio.gather(
call_api(session, 'api/bb-sse-ticker', {'symbol': 'AAPL'}),
call_api(session, 'api/bb-graphql', {'query': '{ users { id name } }'}),
call_api(session, 'api/bb-soap', {'operation': 'getBalance', 'accountId': 'ACC-001'}),
call_api(session, 'api/bb-grpc', {'service': 'UserService.GetUser', 'user_id': 42}),
call_api(session, 'api/bb-jsonrpc', {'method': 'getServerInfo', 'params': {'verbose': True}}),
call_api(session, 'api/bb-xmlrpc', {'method': 'wp.getPost', 'post_id': 1}),
)
for name, data in zip(['REST', 'GraphQL', 'SOAP', 'gRPC', 'JSON-RPC', 'XML-RPC'], results):
print(f'{name}: {data}')
asyncio.run(run_all())
Self-Host: Register APIs of Any Protocol
Install Opsalis
Pull the free Docker container onto your own server. No cloud dependency.
docker pull opsalis/control-center:latest
docker run -d --name opsalis -p 3000:3000 opsalis/control-center:latest
Register APIs of Any Protocol
In the Opsalis web console, register each API endpoint. The wrapper auto-detects protocol type — REST, GraphQL, SOAP, gRPC, JSON-RPC, or XML-RPC.
# In the Opsalis web console:
# 1. Go to APIs → Register New API
# 2. Set endpoint URL (any protocol)
# 3. Wrapper auto-detects: REST, GraphQL, SOAP, gRPC, JSON-RPC, XML-RPC
# 4. Set pricing and go live
No Protocol Conversion Needed
Consumers call your API using its native protocol. REST stays REST, GraphQL stays GraphQL. No forced conversion, no data loss, no impedance mismatch.
Unified Billing Across Protocols
All protocols share the same USDC settlement layer. Set per-call pricing regardless of protocol. One dashboard, one revenue stream.