{"id":208331,"date":"2025-10-14T09:00:55","date_gmt":"2025-10-14T13:00:55","guid":{"rendered":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/?p=208331"},"modified":"2026-03-27T10:54:15","modified_gmt":"2026-03-27T14:54:15","slug":"stop-writing-rest-apis-from-scratch","status":"publish","type":"post","link":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/","title":{"rendered":"Stop writing REST APIs from scratch in 2025"},"content":{"rendered":"<!DOCTYPE html>\n<html><p>If you\u2019ve been a backend or full-stack developer for any length of time, you know the ritual. A new feature requires a new API endpoint, and the boilerplate ceremony begins: define the route, write the controller, validate input, handle errors, and update the docs.<\/p><img loading=\"lazy\" decoding=\"async\" width=\"895\" height=\"597\" src=\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png\" class=\"attachment-full size-full wp-post-image\" alt srcset=\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png 895w, https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them-300x200.png 300w, https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them-768x512.png 768w\" sizes=\"auto, (max-width: 895px) 100vw, 895px\">\n<p>This process isn\u2019t just tedious \u2014 it\u2019s fragile. Every extra definition or cast is a chance for a silent bug: mismatched types, stale documentation, or forgotten validation. Developers have accepted this as the cost of reliability.<\/p>\n<p>But in 2025, it\u2019s time to challenge that assumption. Building APIs manually is an <strong>anti-pattern<\/strong>. The modern ecosystem offers something better \u2014 a schema-driven paradigm that replaces repetitive setup with declarative contracts.<\/p>\n<p>This article deconstructs the old way, introduces the schema-driven model, and shows why writing REST APIs from scratch no longer makes sense.<\/p>\n<h2 id=\"classic-rest-api-setup\">A \u201cclassic\u201d REST endpoint setup<\/h2>\n<p>Let\u2019s illustrate the problem by building a simple <code>POST \/users<\/code> endpoint the \u201cclassic\u201d way, using Express and <code>yup<\/code>.<\/p>\n<pre class=\"language-javascript hljs\">import * as yup from 'yup';\n\n\/\/ Definition 1: TypeScript interface\ninterface CreateUserRequest {\n  username: string;\n  email: string;\n  age: number;\n}\n\n\/\/ Definition 2: Validation schema\nconst createUserSchema = yup.object({\n  username: yup.string().min(3).required(),\n  email: yup.string().email().required(),\n  age: yup.number().positive().integer().required(),\n});\n<\/pre>\n<p>Immediately, we\u2019ve defined the same structure <strong>twice<\/strong> \u2014 violating DRY and creating sync issues.<\/p>\n<p>Now, the endpoint itself:<\/p>\n<pre class=\"language-javascript hljs\">import express, { Request, Response, NextFunction } from 'express';\nimport * as yup from 'yup';\n\nconst app = express();\napp.use(express.json());\n\nconst validate = (schema: yup.AnyObjectSchema) =&gt;\n  async (req: Request, res: Response, next: NextFunction) =&gt; {\n    try {\n      await schema.validate(req.body);\n      next();\n    } catch (err) {\n      res.status(400).json({ type: 'validation_error', message: err.message });\n    }\n  };\n\napp.post('\/users', validate(createUserSchema), (req, res) =&gt; {\n  const userData = req.body as CreateUserRequest;\n  try {\n    const newUser = { id: Date.now(), ...userData };\n    res.status(201).json(newUser);\n  } catch {\n    res.status(500).json({ message: 'Internal server error' });\n  }\n});\n<\/pre>\n<p>We\u2019ve repeated the same ceremony: duplicate schemas, manual validation middleware, explicit type casting, and <code>try\/catch<\/code> clutter.<br>\nTo make things worse, we\u2019d still need to manually update our OpenAPI docs \u2014 a <strong>third source of truth<\/strong> bound to drift.<\/p>\n<h2 id=\"schema-driven-apis\">The schema-driven solution<\/h2>\n<p>The alternative is a <strong>declarative model<\/strong>: define your contract once and let your framework handle routing, validation, and documentation.<\/p>\n<p>Let\u2019s rebuild the same endpoint using <strong>tRPC<\/strong> with <strong>Zod<\/strong> as our single source of truth.<\/p>\n<pre class=\"language-javascript hljs\">import { initTRPC } from '@trpc\/server';\nimport { z } from 'zod';\n\nconst t = initTRPC.create();\n\nconst createUserSchema = z.object({\n  username: z.string().min(3),\n  email: z.string().email(),\n  age: z.number().positive().int(),\n});\n\nexport const appRouter = t.router({\n  createUser: t.procedure\n    .input(createUserSchema)\n    .mutation(({ input }) =&gt; {\n      const newUser = { id: Date.now(), ...input };\n      return newUser;\n    }),\n});\n\nexport type AppRouter = typeof appRouter;\n<\/pre>\n<p>Here\u2019s what changed:<\/p>\n<ul>\n<li><strong>One schema, one truth.<\/strong> Types are inferred automatically from Zod.<\/li>\n<li><strong>No middleware.<\/strong> Validation is built in.<\/li>\n<li><strong>No type casting.<\/strong> Inputs and outputs are strongly typed.<\/li>\n<li><strong>No <code>try\/catch<\/code>.<\/strong> Errors are handled gracefully by the framework.<\/li>\n<\/ul>\n<p>The result: faster iteration, fewer bugs, and self-documenting code.<\/p>\n<h2 id=\"frameworks\">Frameworks embracing schema-driven APIs<\/h2>\n<p>This shift isn\u2019t limited to tRPC \u2014 it\u2019s a <strong>broader industry trend<\/strong>. Here\u2019s how three other frameworks implement similar principles.<\/p>\n<h3 id=\"hono\">Hono: Web standards meet type safety<\/h3>\n<pre class=\"language-javascript hljs\">import { Hono } from 'hono';\nimport { z } from 'zod';\nimport { zValidator } from '@hono\/zod-validator';\n\nconst app = new Hono();\nconst createUserSchema = z.object({\n  username: z.string().min(3),\n  email: z.string().email(),\n  age: z.number().positive().int(),\n});\n\napp.post('\/users', zValidator('json', createUserSchema), (c) =&gt; {\n  const userData = c.req.valid('json');\n  const newUser = { id: Date.now(), ...userData };\n  return c.json(newUser, 201);\n});\n<\/pre>\n<p>Hono modernizes Express-style syntax with built-in validation middleware \u2014 minimal setup, full type safety.<\/p>\n<h3 id=\"fastify\">Fastify: Schema-driven performance<\/h3>\n<pre class=\"language-javascript hljs\">import Fastify from 'fastify';\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nconst fastify = Fastify();\nconst createUserSchema = z.object({\n  username: z.string().min(3),\n  email: z.string().email(),\n  age: z.number().positive().int(),\n});\n\ntype CreateUserRequest = z.infer;\n\nfastify.post&lt;{ Body: CreateUserRequest }&gt;('\/users', {\n  schema: { body: zodToJsonSchema(createUserSchema) },\n}, async (request, reply) =&gt; {\n  const newUser = { id: Date.now(), ...request.body };\n  reply.code(201).send(newUser);\n});\n<\/pre>\n<p>Fastify uses schemas for <strong>both validation and performance optimization<\/strong>, turning type safety into runtime efficiency.<\/p>\n<h3 id=\"nestjs\">NestJS: Declarative via decorators<\/h3>\n<pre class=\"language-javascript hljs\">import { Controller, Post, Body } from '@nestjs\/common';\nimport { IsString, IsEmail, IsInt, Min, MinLength } from 'class-validator';\n\nexport class CreateUserDto {\n  @IsString()\n  @MinLength(3)\n  username: string;\n\n  @IsEmail()\n  email: string;\n\n  @IsInt()\n  @Min(1)\n  age: number;\n}\n\n@Controller('users')\nexport class UsersController {\n  @Post()\n  create(@Body() userData: CreateUserDto) {\n    return { id: Date.now(), ...userData };\n  }\n}\n<\/pre>\n<p>NestJS integrates validation and typing through class decorators \u2014 no manual wiring needed.<\/p>\n<h2 id=\"benefits\">The payoff: faster, safer, and self-documenting<\/h2>\n<p style=\"margin-bottom: 15px;\">The schema-driven paradigm offers measurable improvements across the board:<\/p>\n<table style=\"width: 100%;\">\n<tbody>\n<tr>\n<th>Aspect<\/th>\n<th>Classic REST (Express + yup)<\/th>\n<th>Schema-Driven (tRPC + Zod)<\/th>\n<\/tr>\n<tr>\n<td style=\"padding-bottom: 10px;\"><strong>Development velocity<\/strong><\/td>\n<td style=\"padding-bottom: 10px;\">Slow and verbose: multiple schemas, middleware, and manual error handling.<\/td>\n<td style=\"padding-bottom: 10px;\">Rapid and concise: one schema defines the entire contract; plumbing handled by framework.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding-bottom: 10px;\"><strong>Safety and reliability<\/strong><\/td>\n<td style=\"padding-bottom: 10px;\">Brittle: manual type casting and sync issues between layers.<\/td>\n<td style=\"padding-bottom: 10px;\">End-to-end typesafe: schema shared across server and client with compile-time validation.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding-bottom: 10px;\"><strong>Documentation<\/strong><\/td>\n<td style=\"padding-bottom: 10px;\">Manual and stale: separate OpenAPI spec that drifts over time.<\/td>\n<td style=\"padding-bottom: 10px;\">Automatic and current: tools like <code>trpc-openapi<\/code> generate live documentation from code.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>Building APIs manually is a relic of the past. The schema-driven approach replaces repetitive glue code with <strong>declarative contracts<\/strong>, letting frameworks handle the boilerplate.<\/p>\n<p>It\u2019s not about writing less code \u2014 it\u2019s about writing <strong>better code<\/strong>. A single schema becomes your validation layer, type system, and documentation. Your APIs are faster to build, safer to evolve, and easier to maintain.<\/p>\n<p>The message is simple: stop writing REST APIs from scratch. The frameworks of 2025 already know how to do it for you.<\/p>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.<\/p>\n","protected":false},"author":156415799,"featured_media":208333,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2147999,1],"tags":[2109715],"class_list":["post-208331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","category-uncategorized","tag-typescript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.1.1 - https:\/\/proxy.goincop1.workers.dev:443\/https\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Stop writing REST APIs from scratch in 2025 - LogRocket Blog<\/title>\n<meta name=\"description\" content=\"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Stop writing REST APIs from scratch in 2025 - LogRocket Blog\" \/>\n<meta property=\"og:description\" content=\"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/\" \/>\n<meta property=\"og:site_name\" content=\"LogRocket Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-14T13:00:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-27T14:54:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png\" \/>\n\t<meta property=\"og:image:width\" content=\"895\" \/>\n\t<meta property=\"og:image:height\" content=\"597\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ikeh Akinyemi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ikeh Akinyemi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/\",\"url\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/\",\"name\":\"Stop writing REST APIs from scratch in 2025 - LogRocket Blog\",\"isPartOf\":{\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png\",\"datePublished\":\"2025-10-14T13:00:55+00:00\",\"dateModified\":\"2026-03-27T14:54:15+00:00\",\"author\":{\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/0bf45d326537ede84251ba74a1b26d98\"},\"description\":\"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.\",\"breadcrumb\":{\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage\",\"url\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png\",\"contentUrl\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png\",\"width\":895,\"height\":597},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stop writing REST APIs from scratch in 2025\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#website\",\"url\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/\",\"name\":\"LogRocket Blog\",\"description\":\"Resources to Help Product Teams Ship Amazing Digital Experiences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/0bf45d326537ede84251ba74a1b26d98\",\"name\":\"Ikeh Akinyemi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/secure.gravatar.com\/avatar\/1623a7c5ccd3ae865ce54f95de530e3dbe6187829e6ba8dc4814a1b1f8c5e231?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/secure.gravatar.com\/avatar\/1623a7c5ccd3ae865ce54f95de530e3dbe6187829e6ba8dc4814a1b1f8c5e231?s=96&d=mm&r=g\",\"caption\":\"Ikeh Akinyemi\"},\"description\":\"Ikeh Akinyemi is a software engineer based in Rivers State, Nigeria. He\u2019s passionate about learning pure and applied mathematics concepts, open source, and software engineering.\",\"sameAs\":[\"https:\/\/proxy.goincop1.workers.dev:443\/https\/ikehakinyemi.medium.com\/\"],\"url\":\"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/author\/ikehakinyemi\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Stop writing REST APIs from scratch in 2025 - LogRocket Blog","description":"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/","og_locale":"en_US","og_type":"article","og_title":"Stop writing REST APIs from scratch in 2025 - LogRocket Blog","og_description":"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.","og_url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/","og_site_name":"LogRocket Blog","article_published_time":"2025-10-14T13:00:55+00:00","article_modified_time":"2026-03-27T14:54:15+00:00","og_image":[{"width":895,"height":597,"url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png","type":"image\/png"}],"author":"Ikeh Akinyemi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ikeh Akinyemi","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/proxy.goincop1.workers.dev:443\/https\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/","url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/","name":"Stop writing REST APIs from scratch in 2025 - LogRocket Blog","isPartOf":{"@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage"},"image":{"@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage"},"thumbnailUrl":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png","datePublished":"2025-10-14T13:00:55+00:00","dateModified":"2026-03-27T14:54:15+00:00","author":{"@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/0bf45d326537ede84251ba74a1b26d98"},"description":"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.","breadcrumb":{"@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#primaryimage","url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png","contentUrl":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-content\/uploads\/2025\/10\/rest-api-stop-writing-them.png","width":895,"height":597},{"@type":"BreadcrumbList","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/stop-writing-rest-apis-from-scratch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/"},{"@type":"ListItem","position":2,"name":"Stop writing REST APIs from scratch in 2025"}]},{"@type":"WebSite","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#website","url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/","name":"LogRocket Blog","description":"Resources to Help Product Teams Ship Amazing Digital Experiences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/0bf45d326537ede84251ba74a1b26d98","name":"Ikeh Akinyemi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/#\/schema\/person\/image\/","url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/secure.gravatar.com\/avatar\/1623a7c5ccd3ae865ce54f95de530e3dbe6187829e6ba8dc4814a1b1f8c5e231?s=96&d=mm&r=g","contentUrl":"https:\/\/proxy.goincop1.workers.dev:443\/https\/secure.gravatar.com\/avatar\/1623a7c5ccd3ae865ce54f95de530e3dbe6187829e6ba8dc4814a1b1f8c5e231?s=96&d=mm&r=g","caption":"Ikeh Akinyemi"},"description":"Ikeh Akinyemi is a software engineer based in Rivers State, Nigeria. He\u2019s passionate about learning pure and applied mathematics concepts, open source, and software engineering.","sameAs":["https:\/\/proxy.goincop1.workers.dev:443\/https\/ikehakinyemi.medium.com\/"],"url":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/author\/ikehakinyemi\/"}]}},"yoast_description":"Writing REST APIs by hand is a thing of the past. Frameworks like tRPC, Fastify, and Hono eliminate boilerplate with schema-driven design, improving speed and safety.","_links":{"self":[{"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/posts\/208331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/users\/156415799"}],"replies":[{"embeddable":true,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/comments?post=208331"}],"version-history":[{"count":3,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/posts\/208331\/revisions"}],"predecessor-version":[{"id":208626,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/posts\/208331\/revisions\/208626"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/media\/208333"}],"wp:attachment":[{"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/media?parent=208331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/categories?post=208331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/blog.logrocket.com\/wp-json\/wp\/v2\/tags?post=208331"}],"curies":[{"name":"wp","href":"https:\/\/proxy.goincop1.workers.dev:443\/https\/api.w.org\/{rel}","templated":true}]}}