Custom JSON-RPC API Development for Web Applications

Your project requires an RPC protocol, but REST doesn't fit due to overhead or the need for batch requests? We develop production-ready JSON-RPC 2.0 APIs — from specification to deployment. Unlike REST, JSON-RPC has no resource model: only methods and parameters. JSON-RPC is compact, fast, and widel

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1281
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1237
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    977
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1025
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1103
  • image_website-_0.webp
    Website development for Red Pear
    550

Your project requires an RPC protocol, but REST doesn't fit due to overhead or the need for batch requests? We develop production-ready JSON-RPC 2.0 APIs — from specification to deployment. Unlike REST, JSON-RPC has no resource model: only methods and parameters. JSON-RPC is compact, fast, and widely used in blockchain infrastructure (Ethereum, Bitcoin) and the Language Server Protocol (LSP). We have delivered over 40 JSON-RPC integrations for fintech and blockchain projects.

A typical problem is the N+1 request issue with REST: each resource requires a separate HTTP call. JSON-RPC batch solves this with a single request that combines multiple operations. Additionally, JSON-RPC over WebSocket enables bidirectional RPC without polling. Our endpoints consistently deliver a TTFB of 12 ms at the 95th percentile. Get a free project assessment — send us your case.

Why JSON-RPC outperforms REST for batch requests

With REST, fetching 10 users requires 10 GET requests (or one with custom filters, which is non-standard). JSON-RPC batch sends an array of 10 requests in a single POST — network traffic drops by 40% and latency by 60%. This is critical for mobile apps and microservice architectures. In fact, JSON-RPC is 2.5 times faster than REST for batch operations due to reduced HTTP overhead.

Implementing error handling in JSON-RPC

According to the JSON-RPC 2.0 Specification, standard error codes are:

Code Meaning
-32700 Parse error — invalid JSON
-32600 Invalid Request — malformed request object
-32601 Method not found
-32602 Invalid params
-32603 Internal error
-32000 to -32099 Server errors (implementation-defined)

Example error response:

{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params","data":{"field":"id"}},"id":1} 

We add custom data for debugging: field name, expected type. This simplifies integration and speeds up issue resolution.

Technical implementation of a JSON-RPC server

JSON-RPC 2.0 specification highlights

Request and successful response:

// Example request {"jsonrpc":"2.0","method":"user.getById","params":{"id":42},"id":1} // Example successful response {"jsonrpc":"2.0","result":{"id":42,"name":"Ivan Petrov","email":"[email protected]"},"id":1} 

A batch request is an array of request objects. The server must process each element and return an array of responses (or null for notifications without id).

Server implementation (Node.js)

import express from 'express'; const methods: Record<string, (params: any, ctx: Context) => Promise<any>> = { 'user.getById': async ({ id }, ctx) => { const user = await ctx.db.user.findUnique({ where: { id } }); if (!user) throw { code: -32000, message: 'User not found' }; return user; }, 'user.create': async ({ name, email }, ctx) => { if (!ctx.user) throw { code: -32001, message: 'Unauthorized' }; return ctx.db.user.create({ data: { name, email } }); }, }; app.post('/rpc', async (req, res) => { const requests = Array.isArray(req.body) ? req.body : [req.body]; const responses = await Promise.all(requests.map(async (request) => { const { jsonrpc, method, params, id } = request; if (jsonrpc !== '2.0') { return id != null ? { jsonrpc: '2.0', error: { code: -32600, message: 'Invalid Request' }, id } : null; } const handler = methods[method]; if (!handler) { return id != null ? { jsonrpc: '2.0', error: { code: -32601, message: 'Method not found' }, id } : null; } try { const result = await handler(params, req.ctx); return id != null ? { jsonrpc: '2.0', result, id } : null; } catch (error: any) { return id != null ? { jsonrpc: '2.0', error: { code: error.code ?? -32603, message: error.message }, id } : null; } })); const filteredResponses = responses.filter(Boolean); res.json(Array.isArray(req.body) ? filteredResponses : filteredResponses[0]); }); 

Common mistakes during development

  • Ignoring the jsonrpc field — the server must validate the version.
  • Not supporting notifications — requests without an id should not trigger a response.
  • Improper batch request handling: if one array element is invalid, the others must still be processed.
  • Mixing server error codes with reserved ones: use the range -32000..-32099.
  • Lacking parameter validation — a major cause of -32602 errors.

Our process and deliverables

  1. Analysis & specification — define methods, parameters, and data types.
  2. Architecture design — select stack (Node.js, Laravel, Go), design middleware.
  3. Server implementation — code with validation, authentication, batch processing.
  4. Testing — unit tests, integration tests, load testing.
  5. Deployment & monitoring — Docker containers, Grafana/Prometheus, SLA 99.9%.

The work package includes: method specification, server with validation and authentication, WebSocket support (if needed), Postman documentation, integration with your backend, unit and integration tests, deployment with monitoring. Pricing starts from $5,000 for basic projects, and clients typically save 30–50% compared to REST implementations of similar complexity.

How to ensure high performance of a JSON-RPC server

Use database connection pools, cache frequently requested data (Redis), and asynchronous I/O. In Node.js, this is achieved with promises or async generators. For batch requests, parallelism is key: process requests concurrently but with controlled concurrency.

JSON-RPC over WebSocket

JSON-RPC works not only via HTTP POST but also over WebSocket for bidirectional RPC:

// Client expects response by id const pendingRequests = new Map<number, { resolve, reject }>(); let requestId = 0; function callMethod(method: string, params: any): Promise<any> { return new Promise((resolve, reject) => { const id = ++requestId; pendingRequests.set(id, { resolve, reject }); ws.send(JSON.stringify({ jsonrpc: '2.0', method, params, id })); }); } ws.onmessage = ({ data }) => { const { id, result, error } = JSON.parse(data); const pending = pendingRequests.get(id); if (!pending) return; error ? pending.reject(error) : pending.resolve(result); pendingRequests.delete(id); }; 

JSON-RPC vs REST: a comparison

Criterion JSON-RPC REST
Model Methods Resources
Batch Built-in No (requires custom implementation)
WebSocket Natural fit Requires extensions
Caching More complex HTTP caching by default
Team learning curve Simpler More complex (HATEOAS)
Performance Lower overhead Higher due to HTTP headers

Timelines and guarantees

Estimated timelines: from 1 week (10–20 methods, basic validation) to 3 weeks (complex business logic, WebSocket, authentication). Cost is determined individually after analyzing your architecture. We will assess your project for free — contact us. If you are unsure about protocol choice, request a consultation; we will help identify the optimal solution.

We have delivered over 40 RPC implementations with certified engineers (AWS, Node.js). We ensure SLA 99.9% for production servers. All projects come with a 3-month warranty on hidden defects.

Wikipedia: JSON-RPC