6 Protocols, One Marketplace

REST, GraphQL, SOAP, gRPC, JSON-RPC, XML-RPC — whatever protocol your API uses, Opsalis handles it. Run all 6 in parallel and compare latencies.

How It Works

CONSUMER Any protocol OPSALIS Protocol Detection + P2P Routing + USDC Settlement REST GraphQL SOAP gRPC JSON-RPC XML-RPC API OWNERS 6 mock servers NYC Server node-a.demo.opsalis.com

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

Click "Run REST" to call the REST API.

GraphQL Query

Click "Run GraphQL" to send a GraphQL query.

SOAP Operation

Click "Run SOAP" to call the SOAP service.

gRPC Call

Click "Run gRPC" to call the gRPC service.

JSON-RPC Call

Click "Run JSON-RPC" to call the JSON-RPC endpoint.

XML-RPC Call

Click "Run XML-RPC" to call the XML-RPC endpoint.
REST
Waiting...
GraphQL
Waiting...
SOAP
Waiting...
gRPC
Waiting...
JSON-RPC
Waiting...
XML-RPC
Waiting...

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

1

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
2

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
3

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.

4

Unified Billing Across Protocols

All protocols share the same USDC settlement layer. Set per-call pricing regardless of protocol. One dashboard, one revenue stream.