<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>APIs &amp; Web Services on Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/</link><description>Recent content in APIs &amp; Web Services on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/apis-web-services/index.xml" rel="self" type="application/rss+xml"/><item><title>REST Principles</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/01-rest-principles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/01-rest-principles/</guid><description>&lt;h1 id="rest-principles"&gt;REST Principles&lt;a class="anchor" href="#rest-principles"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;REST (Representational State Transfer) is an architectural style defined by Roy Fielding in his 2000 doctoral dissertation. It describes a set of constraints that, when applied to web services, yield systems that are scalable, loosely coupled, and simple to understand.&lt;/p&gt;
&lt;h2 id="the-six-rest-constraints"&gt;The Six REST Constraints&lt;a class="anchor" href="#the-six-rest-constraints"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;REST is not a protocol or a standard — it&amp;rsquo;s a set of architectural constraints. A service that satisfies all constraints is called &lt;em&gt;RESTful&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>API Design</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/02-api-design/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/02-api-design/</guid><description>&lt;h1 id="api-design"&gt;API Design&lt;a class="anchor" href="#api-design"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Good API design makes the right thing easy and the wrong thing hard. This section covers the practical patterns for URL structure, request/response shaping, pagination, error handling, and bulk operations that production APIs rely on.&lt;/p&gt;
&lt;h2 id="url-structure"&gt;URL Structure&lt;a class="anchor" href="#url-structure"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A well-designed URL is predictable, readable, and consistent.&lt;/p&gt;
&lt;h3 id="anatomy-of-an-api-url"&gt;Anatomy of an API URL&lt;a class="anchor" href="#anatomy-of-an-api-url"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;https://api.example.com/v1/customers/42/orders?status=shipped&amp;amp;page=2
└─────────┬──────────┘ └┬┘ └────┬────┘ └┘ └──┬──┘ └──────┬───────┘
 base URL ver collection id sub-res query params&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="design-rules"&gt;Design Rules&lt;a class="anchor" href="#design-rules"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Rule&lt;/th&gt;
					&lt;th&gt;Good&lt;/th&gt;
					&lt;th&gt;Bad&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Use nouns for resources&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/invoices&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/getInvoices&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Plural for collections&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/user&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;IDs in path for specifics&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users/42&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users?id=42&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nest for relationships&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users/42/posts&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/posts?user_id=42&lt;/code&gt; (acceptable for filtering)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Max 2 levels of nesting&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users/42/posts&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/users/42/posts/7/comments/3/likes&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Actions as sub-resources&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/orders/42/cancel&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/cancelOrder?id=42&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Consistent naming&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;snake_case&lt;/code&gt; or &lt;code&gt;camelCase&lt;/code&gt; (pick one)&lt;/td&gt;
					&lt;td&gt;Mixing conventions&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="when-nesting-gets-too-deep"&gt;When Nesting Gets Too Deep&lt;a class="anchor" href="#when-nesting-gets-too-deep"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you need more than two levels, flatten:&lt;/p&gt;</description></item><item><title>Authentication &amp; Authorization</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/03-authentication-authorization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/03-authentication-authorization/</guid><description>&lt;h1 id="authentication--authorization"&gt;Authentication &amp;amp; Authorization&lt;a class="anchor" href="#authentication--authorization"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Authentication (AuthN) verifies &lt;em&gt;who you are&lt;/em&gt;. Authorization (AuthZ) determines &lt;em&gt;what you can do&lt;/em&gt;. Every API needs both. This section covers the mechanisms from simple API keys to full OAuth2 flows.&lt;/p&gt;
&lt;h2 id="authentication-vs-authorization"&gt;Authentication vs Authorization&lt;a class="anchor" href="#authentication-vs-authorization"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;Authentication (AuthN)&lt;/th&gt;
					&lt;th&gt;Authorization (AuthZ)&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Question&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;Who is this?&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;Can they do this?&amp;rdquo;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Happens&lt;/td&gt;
					&lt;td&gt;First&lt;/td&gt;
					&lt;td&gt;After authentication&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mechanism&lt;/td&gt;
					&lt;td&gt;Credentials, tokens&lt;/td&gt;
					&lt;td&gt;Permissions, roles, policies&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Failure code&lt;/td&gt;
					&lt;td&gt;401 Unauthorized&lt;/td&gt;
					&lt;td&gt;403 Forbidden&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant Client
 participant API
 participant AuthServer

 Client-&amp;gt;&amp;gt;API: Request with credentials
 API-&amp;gt;&amp;gt;AuthServer: Validate credentials (AuthN)
 AuthServer--&amp;gt;&amp;gt;API: Identity confirmed
 API-&amp;gt;&amp;gt;API: Check permissions (AuthZ)
 API--&amp;gt;&amp;gt;Client: 200 OK or 403 Forbidden&lt;/pre&gt;&lt;h2 id="api-keys"&gt;API Keys&lt;a class="anchor" href="#api-keys"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The simplest authentication mechanism. A long, random string shared between client and server.&lt;/p&gt;</description></item><item><title>OpenAPI &amp; Documentation</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/04-openapi-documentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/04-openapi-documentation/</guid><description>&lt;h1 id="openapi--documentation"&gt;OpenAPI &amp;amp; Documentation&lt;a class="anchor" href="#openapi--documentation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A well-documented API is a usable API. The OpenAPI Specification (formerly Swagger) provides a machine-readable description of your API that powers documentation, code generation, testing, and validation.&lt;/p&gt;
&lt;h2 id="what-is-openapi"&gt;What is OpenAPI?&lt;a class="anchor" href="#what-is-openapi"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OpenAPI is a standard for describing REST APIs. It&amp;rsquo;s a YAML or JSON document that describes every endpoint, parameter, request body, response, and authentication mechanism your API offers.&lt;/p&gt;
&lt;h3 id="openapi-document-structure"&gt;OpenAPI Document Structure&lt;a class="anchor" href="#openapi-document-structure"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;openapi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3.1.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Orders API&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;API for managing customer orders&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1.2.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Platform Team&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;platform@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://api.example.com/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://staging-api.example.com/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Staging&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;/orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;post&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/orders/{id}:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;put&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;securitySchemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;security&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;bearerAuth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="key-sections"&gt;Key Sections&lt;a class="anchor" href="#key-sections"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Section&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
					&lt;th&gt;Contains&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;API metadata&lt;/td&gt;
					&lt;td&gt;Title, version, description, contact&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;servers&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Base URLs&lt;/td&gt;
					&lt;td&gt;Production, staging, dev environments&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;paths&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Endpoints&lt;/td&gt;
					&lt;td&gt;All routes with operations&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;components&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Reusable definitions&lt;/td&gt;
					&lt;td&gt;Schemas, parameters, security, responses&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;security&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Global auth requirements&lt;/td&gt;
					&lt;td&gt;Default security schemes&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Grouping&lt;/td&gt;
					&lt;td&gt;Logical grouping of operations&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="schema-definition"&gt;Schema Definition&lt;a class="anchor" href="#schema-definition"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Schemas define the shape of request and response bodies:&lt;/p&gt;</description></item><item><title>Versioning &amp; Evolution</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/05-versioning-evolution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/05-versioning-evolution/</guid><description>&lt;h1 id="versioning--evolution"&gt;Versioning &amp;amp; Evolution&lt;a class="anchor" href="#versioning--evolution"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;APIs evolve. New features arrive, old patterns prove inadequate, business requirements shift. The challenge is evolving your API without breaking existing consumers. This section covers versioning strategies, change classification, and lifecycle management.&lt;/p&gt;
&lt;h2 id="why-version"&gt;Why Version?&lt;a class="anchor" href="#why-version"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once an API has consumers, you can&amp;rsquo;t freely change it. Versioning gives you a mechanism to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introduce breaking changes without disrupting existing clients&lt;/li&gt;
&lt;li&gt;Communicate the stability of different API surfaces&lt;/li&gt;
&lt;li&gt;Allow consumers to migrate at their own pace&lt;/li&gt;
&lt;li&gt;Maintain multiple versions during transition periods&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="versioning-strategies"&gt;Versioning Strategies&lt;a class="anchor" href="#versioning-strategies"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="url-path-versioning"&gt;URL Path Versioning&lt;a class="anchor" href="#url-path-versioning"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The most common and visible approach. The version is part of the URL:&lt;/p&gt;</description></item><item><title>Rate Limiting &amp; Throttling</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/06-rate-limiting-throttling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/06-rate-limiting-throttling/</guid><description>&lt;h1 id="rate-limiting--throttling"&gt;Rate Limiting &amp;amp; Throttling&lt;a class="anchor" href="#rate-limiting--throttling"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Rate limiting protects APIs from abuse, ensures fair resource allocation, and maintains service stability under heavy load. Understanding rate limiting algorithms and their trade-offs is essential for both API providers and consumers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-rate-limit"&gt;Why Rate Limit?&lt;a class="anchor" href="#why-rate-limit"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Protect infrastructure&lt;/strong&gt; from overload and cascading failures&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ensure fairness&lt;/strong&gt; among consumers sharing a service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prevent abuse&lt;/strong&gt; (scraping, brute-force attacks, DDoS)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control costs&lt;/strong&gt; for metered or pay-per-use services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meet SLAs&lt;/strong&gt; by preserving capacity for critical traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="rate-limiting-algorithms"&gt;Rate Limiting Algorithms&lt;a class="anchor" href="#rate-limiting-algorithms"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="token-bucket"&gt;Token Bucket&lt;a class="anchor" href="#token-bucket"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The token bucket algorithm allows bursts while enforcing an average rate. Tokens are added to a bucket at a fixed rate; each request consumes one token. If the bucket is empty, the request is rejected.&lt;/p&gt;</description></item><item><title>GraphQL</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/07-graphql/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/07-graphql/</guid><description>&lt;h1 id="graphql"&gt;GraphQL&lt;a class="anchor" href="#graphql"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;GraphQL is a query language for APIs and a runtime for executing those queries. Unlike REST, it lets clients request exactly the data they need in a single request, eliminating over-fetching and under-fetching.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="core-concepts"&gt;Core Concepts&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Concept&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Schema&lt;/td&gt;
					&lt;td&gt;Defines the types, queries, mutations, and subscriptions available&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Query&lt;/td&gt;
					&lt;td&gt;Read operation — fetches data&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mutation&lt;/td&gt;
					&lt;td&gt;Write operation — creates, updates, or deletes data&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Subscription&lt;/td&gt;
					&lt;td&gt;Real-time operation — pushes data to clients via WebSocket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Resolver&lt;/td&gt;
					&lt;td&gt;Function that fetches the data for a specific field&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Type&lt;/td&gt;
					&lt;td&gt;Defines the shape of data (object, scalar, enum, interface, union)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="schema-definition-language-sdl"&gt;Schema Definition Language (SDL)&lt;a class="anchor" href="#schema-definition-language-sdl"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="scalar-types"&gt;Scalar Types&lt;a class="anchor" href="#scalar-types"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GraphQL has five built-in scalars: &lt;code&gt;Int&lt;/code&gt;, &lt;code&gt;Float&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Boolean&lt;/code&gt;, &lt;code&gt;ID&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Webhooks &amp; Async APIs</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/08-webhooks-async-apis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/08-webhooks-async-apis/</guid><description>&lt;h1 id="webhooks--async-apis"&gt;Webhooks &amp;amp; Async APIs&lt;a class="anchor" href="#webhooks--async-apis"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Not all API communication follows the request-response pattern. Webhooks, polling, callbacks, and WebSockets enable asynchronous, event-driven architectures where systems react to changes as they happen rather than repeatedly asking &amp;ldquo;has anything changed?&amp;rdquo;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="webhooks"&gt;Webhooks&lt;a class="anchor" href="#webhooks"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A webhook is a user-defined HTTP callback. When an event occurs in the source system, it sends an HTTP POST to a URL configured by the consumer.&lt;/p&gt;
&lt;h3 id="how-webhooks-work"&gt;How Webhooks Work&lt;a class="anchor" href="#how-webhooks-work"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────┐ 1. Register URL ┌──────────────┐
│ Client │ ────────────────────── │ Provider │
│ (Server) │ │ (e.g. Stripe│
│ │ ◄───────────────────── │ GitHub) │
└──────────┘ 2. POST event data └──────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;Consumer registers a callback URL with the provider&lt;/li&gt;
&lt;li&gt;An event occurs in the provider (payment completed, PR merged, etc.)&lt;/li&gt;
&lt;li&gt;Provider sends an HTTP POST with event payload to the registered URL&lt;/li&gt;
&lt;li&gt;Consumer processes the event and returns 2xx to acknowledge&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="webhook-payload-design"&gt;Webhook Payload Design&lt;a class="anchor" href="#webhook-payload-design"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;evt_1NqB6e2eZvKY&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;payment.completed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;created&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024-01-15T10:30:00Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pay_abc123&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;amount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;currency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eur&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;succeeded&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;api_version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024-01-01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Best practices for payloads:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>gRPC &amp; Binary Protocols</title><link>https://kyngo.github.io/learning-paths/paths/apis-web-services/09-grpc-and-binary-protocols/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/apis-web-services/09-grpc-and-binary-protocols/</guid><description>&lt;h1 id="grpc--binary-protocols"&gt;gRPC &amp;amp; Binary Protocols&lt;a class="anchor" href="#grpc--binary-protocols"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;REST with JSON dominates public APIs, but service-to-service communication benefits from binary protocols — smaller payloads, schema enforcement, and code generation. gRPC is the industry standard for internal microservice communication.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="why-binary-protocols"&gt;Why Binary Protocols?&lt;a class="anchor" href="#why-binary-protocols"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;REST + JSON&lt;/th&gt;
					&lt;th&gt;gRPC + Protobuf&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Encoding&lt;/td&gt;
					&lt;td&gt;Text (UTF-8 JSON)&lt;/td&gt;
					&lt;td&gt;Binary (Protocol Buffers)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Payload size&lt;/td&gt;
					&lt;td&gt;Larger (~2-10×)&lt;/td&gt;
					&lt;td&gt;Smaller&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Schema&lt;/td&gt;
					&lt;td&gt;Optional (OpenAPI)&lt;/td&gt;
					&lt;td&gt;Required (.proto files)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Code generation&lt;/td&gt;
					&lt;td&gt;Optional&lt;/td&gt;
					&lt;td&gt;Built-in (every language)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Streaming&lt;/td&gt;
					&lt;td&gt;Workarounds (SSE, WebSocket)&lt;/td&gt;
					&lt;td&gt;Native (4 streaming modes)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Browser support&lt;/td&gt;
					&lt;td&gt;Native&lt;/td&gt;
					&lt;td&gt;Requires gRPC-Web proxy&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Human-readable&lt;/td&gt;
					&lt;td&gt;Yes&lt;/td&gt;
					&lt;td&gt;No (binary wire format)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Type safety&lt;/td&gt;
					&lt;td&gt;Runtime validation&lt;/td&gt;
					&lt;td&gt;Compile-time from .proto&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Transport&lt;/td&gt;
					&lt;td&gt;HTTP/1.1 or HTTP/2&lt;/td&gt;
					&lt;td&gt;HTTP/2 (required)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="protocol-buffers-protobuf"&gt;Protocol Buffers (Protobuf)&lt;a class="anchor" href="#protocol-buffers-protobuf"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The serialisation format used by gRPC:&lt;/p&gt;</description></item></channel></rss>