<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Leandro Gabriel — Senior Technical Writer Blog</title>
        <link>https://l-g99921.github.io/tw-portfolio/blog</link>
        <description>Leandro Gabriel — Senior Technical Writer Blog</description>
        <lastBuildDate>Fri, 24 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Documenting PIX: lessons from scaling API docs for Brazil's instant-payments rail]]></title>
            <link>https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons</link>
            <guid>https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons</guid>
            <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Five lessons on writing API documentation for an instant-payments system that processes more than two billion transactions per month. What worked, what broke, and what nobody warned us about.]]></description>
            <content:encoded><![CDATA[<p>PIX moves more money in a month than the United Kingdom's Faster Payments scheme moves in a quarter. It went from zero to one billion monthly transactions in twelve months. It is national infrastructure, free to consumers, mandatory for banks, and operated by a central bank that publishes the spec in Portuguese.</p>
<p>I owned the official PIX API documentation at Itaú Unibanco (via Zup Innovation, 2022–2024) — 37+ endpoint references, integration guides, release notes, and migration docs on a Bitbucket docs-as-code pipeline, for the PSP API serving the world's most-adopted instant-payments rail. This post is what I learned writing those docs at scale — five things that don't show up in Google's developer-docs guide, that I had to learn the way most documentation lessons get learned: by writing the wrong version first.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-documenting-pix-actually-means">What "documenting PIX" actually means<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#what-documenting-pix-actually-means" class="hash-link" aria-label="Direct link to What &quot;documenting PIX&quot; actually means" title="Direct link to What &quot;documenting PIX&quot; actually means" translate="no">​</a></h2>
<p>A quick orientation. PIX is the instant-payments rail operated by Banco Central do Brasil. It went live in November 2020 and now <a href="https://www.bcb.gov.br/en/financialstability/pix_en" target="_blank" rel="noopener noreferrer" class="">averages over 6 billion transactions per month</a>. Every Brazilian with a bank account uses it; most of them weekly.</p>
<p>The rail itself is closed. Only licensed PSPs — banks, fintechs, and a handful of payment institutions — talk to it directly. Everyone else (merchants, marketplaces, gig platforms, bill aggregators) integrates against a PSP's <em>PSP API</em>, which is a customer-facing wrapper over the rail's settlement messages.</p>
<p>There is a <a href="https://bacen.github.io/pix-api/" target="_blank" rel="noopener noreferrer" class="">public OpenAPI standard</a> for PSP APIs, published by Bacen. Every PSP implements that standard. But the docs each PSP ships on top of the standard are where developer experience actually happens — and where my work lived.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lesson-1--reference-is-the-floor-not-the-ceiling">Lesson 1 — reference is the floor, not the ceiling<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#lesson-1--reference-is-the-floor-not-the-ceiling" class="hash-link" aria-label="Direct link to Lesson 1 — reference is the floor, not the ceiling" title="Direct link to Lesson 1 — reference is the floor, not the ceiling" translate="no">​</a></h2>
<p>Most developer documentation guides treat API reference as the boring part — the auto-generated thing you produce from an OpenAPI spec and link to. Your real value, the argument goes, lives in tutorials and concept docs.</p>
<p>That's true for hobbyist APIs. It is not true at PIX volume.</p>
<p>When you have hundreds of integrators hitting your endpoints at a few thousand requests per second each, the reference page for <code>PUT /cob/{txid}</code> is the most-loaded page on your docs site by an order of magnitude. It loads in support tickets, in incident postmortems, in compliance audits, in onboarding sessions for the new integrator's third backend engineer who joined last week. It has to be right, and it has to be <em>fast to scan</em>.</p>
<p>Three things matter on the reference page:</p>
<ul>
<li class=""><strong>Every response code is documented.</strong> Including the ones that "shouldn't happen." <code>409</code> on <code>PUT /cob/{txid}</code> happens. <code>503</code> from the rail happens. The webhook receiver returning <code>401</code> on a redelivered signature happens. If a code is in the spec, it has a row on the reference page with at least one realistic example body.</li>
<li class=""><strong>Examples are real, not placeholder.</strong> Not <code>"valor": "100.00"</code> — <code>"valor": "150.00"</code> for a 150-real charge with a Portuguese-language <code>solicitacaoPagador</code>. Integrators copy from examples. Generic examples produce generic bugs.</li>
<li class=""><strong>The page reflects what the API does <em>now</em>, not what it did at v1.</strong> This is the unglamorous compliance work that makes the difference between a docs site engineers respect and a docs site they distrust enough to read the OpenAPI spec instead.</li>
</ul>
<p>The work isn't generating reference pages. The work is building the contract-first pipeline that keeps them in sync. OpenAPI spec is the source of truth; reference pages regenerate from it; nothing in the rendered output is hand-edited. We spent more engineering time on this pipeline than on any single piece of prose.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lesson-2--idempotency-at-the-rail-boundary-changes-the-page-shape">Lesson 2 — idempotency at the rail boundary changes the page shape<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#lesson-2--idempotency-at-the-rail-boundary-changes-the-page-shape" class="hash-link" aria-label="Direct link to Lesson 2 — idempotency at the rail boundary changes the page shape" title="Direct link to Lesson 2 — idempotency at the rail boundary changes the page shape" translate="no">​</a></h2>
<p>A typical API doc structure looks something like this:</p>
<blockquote>
<p><strong>Overview</strong> → <strong>Authentication</strong> → <strong>Quickstart</strong> → <strong>Endpoints</strong> → <strong>Webhooks</strong> → <strong>Errors</strong></p>
</blockquote>
<p>For PIX, that structure is wrong. Idempotency isn't an "errors" topic — it's an architectural property that shows up on every page.</p>
<p>PIX has a hard property: the rail will not deliver the same <code>e2eId</code> twice, but the PSP webhook layer might. The <code>txid</code> is supplied by the merchant; the PSP enforces uniqueness for at least 365 days. The <code>endToEndId</code> is supplied by the rail at settlement and is unique for the lifetime of the universe.</p>
<p>This means:</p>
<ul>
<li class="">Every reference page for a write endpoint has to explain idempotency behaviour, not just status codes.</li>
<li class="">Every webhook page has to explain that the receiver is the dedupe authority — not the sender.</li>
<li class="">The quickstart can't end at "received webhook." It has to end at "stored <code>e2eId</code>, returned 200, and a second delivery is a no-op."</li>
<li class="">The errors page can't list <code>409</code> without explaining the difference between "duplicate <code>txid</code> with the same body" (idempotent re-create — fine) and "duplicate <code>txid</code> with a different body" (genuine conflict — fix the client).</li>
</ul>
<p>We restructured the docs once we figured this out. The new shape:</p>
<blockquote>
<p><strong>About PIX (concept)</strong> → <strong>Quickstart</strong> → <strong>Idempotency model</strong> → <strong>Endpoints (with idempotency notes)</strong> → <strong>Webhooks (with replay handling)</strong> → <strong>Reconciliation patterns</strong> → <strong>Errors</strong></p>
</blockquote>
<p>Idempotency went from a buried subsection to its own concept page, linked from every reference page. The before/after numbers showed up in the support ticket queue: L1 tickets on the PIX integration queue dropped about 45% in the six months after the restructure (measured via internal ticketing tags).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lesson-3--localization-isnt-translation">Lesson 3 — localization isn't translation<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#lesson-3--localization-isnt-translation" class="hash-link" aria-label="Direct link to Lesson 3 — localization isn't translation" title="Direct link to Lesson 3 — localization isn't translation" translate="no">​</a></h2>
<p>The PIX standard is published in Portuguese. The field names are Portuguese: <code>cob</code>, <code>chave</code>, <code>devedor</code>, <code>valor</code>, <code>pagador</code>, <code>solicitacaoPagador</code>. The status codes are Portuguese: <code>ATIVA</code>, <code>CONCLUIDA</code>, <code>REMOVIDA_PELO_USUARIO_RECEBEDOR</code>. The error reason codes are Portuguese: <code>cobranca-nao-encontrada</code>, <code>chave-invalida</code>.</p>
<p>We had a recurring debate on the team: should we translate the field names in the docs? The English-speaking integrators on partner teams kept asking.</p>
<p>The answer ended up being no, with caveats. Here is why.</p>
<p>The OpenAPI spec is the contract. Integrators are calling endpoints whose payloads are in Portuguese. If we publish English field names in the docs that don't match the wire format, every integrator goes through this:</p>
<ol>
<li class="">Read the docs in English.</li>
<li class="">Write the integration against the English names.</li>
<li class="">Get <code>400 Bad Request</code> when the request hits the rail.</li>
<li class="">Open the OpenAPI spec, find the Portuguese names, fix the code.</li>
<li class="">Lose trust in the docs.</li>
</ol>
<p>Step 5 is the one that costs you. Once an integrator has caught the docs lying about the wire format, every other claim on the docs site is suspect.</p>
<p>What we did instead:</p>
<ul>
<li class=""><strong>Wire-format names stay in Portuguese</strong> on every reference page, every example, every payload snippet. Integrators copy real strings.</li>
<li class=""><strong>Concept words get translated.</strong> "Charge" alongside <code>cob</code> (parenthetical on first mention), "received PIX" alongside <code>pix</code>, "key" alongside <code>chave</code>.</li>
<li class=""><strong>The standard's Portuguese terms are listed in a glossary</strong>, with the English concept and a one-line definition. Integrators have a mental map without us lying about the contract.</li>
<li class=""><strong>Error reason codes ship as-is</strong>, with the English explanation in the corresponding row of the errors table.</li>
</ul>
<p>The lesson generalizes: when the underlying system has a canonical language, your job is to bridge to it, not paper over it. Hiding the canonical names is a leaky abstraction that costs you trust.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lesson-4--webhook-docs-are-60-of-integration-support">Lesson 4 — webhook docs are 60% of integration support<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#lesson-4--webhook-docs-are-60-of-integration-support" class="hash-link" aria-label="Direct link to Lesson 4 — webhook docs are 60% of integration support" title="Direct link to Lesson 4 — webhook docs are 60% of integration support" translate="no">​</a></h2>
<p>Most integration teams I've seen invest most of their docs effort in the request side: how to authenticate, how to format a charge, how to read errors. The webhook side gets one page, late in the doc set, that says "we POST to a URL you give us."</p>
<p>That allocation is upside-down. At PIX volume, the request side is mostly correct on day one. Integrators sign up, copy a curl example, get a 200, and move on. The webhook side is where every long support ticket lives.</p>
<p>The questions integrators actually ask, in the order they ask them:</p>
<ol>
<li class="">"We're not receiving webhooks." (Almost always: their endpoint isn't reachable from the public internet, or the TLS cert isn't trusted.)</li>
<li class="">"We're receiving the same payment twice." (Always: their listener returned a non-2xx and the PSP retried.)</li>
<li class="">"We're double-crediting customers when our database is slow." (Always: they're using <code>SELECT then INSERT</code> for dedupe instead of a primary-key constraint.)</li>
<li class="">"We're missing payments after a deploy." (Always: their listener was down past the retry window.)</li>
<li class="">"Webhook signatures are failing." (Almost always: they're verifying against parsed JSON, not the raw body.)</li>
</ol>
<p>Every one of those is a docs problem, not a product problem. We rewrote our webhook page after we noticed the pattern. The new structure was:</p>
<ul>
<li class="">One page just for the endpoint contract (auth header, payload schema, expected response).</li>
<li class="">One page for the four production problems (verify, ack fast, dedupe, recover).</li>
<li class="">One page for the reconciler pattern (replay missed payments through the API).</li>
</ul>
<p>Three pages instead of one. About 4× the words. Internal developer satisfaction with the docs portal moved from 3.8 to 4.6 out of 5 in the next quarterly DX survey (n=60+ respondents) — and integrators started linking to specific anchor sections in their own internal runbooks.</p>
<p>The general lesson: docs effort should follow ticket weight, not endpoint count.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lesson-5--the-quickstart-is-the-product-page">Lesson 5 — the quickstart is the product page<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#lesson-5--the-quickstart-is-the-product-page" class="hash-link" aria-label="Direct link to Lesson 5 — the quickstart is the product page" title="Direct link to Lesson 5 — the quickstart is the product page" translate="no">​</a></h2>
<p>For an API where most integrators are Brazilian backend engineers who have never integrated a real-time payments rail before, the quickstart isn't an onboarding aid. It's the only page that sells your product.</p>
<p>The integrator's manager has approved the project. They have one afternoon to decide whether your PSP is the right one, or whether they should give the next one on the procurement list a try. They land on your docs site, click "quickstart," and decide.</p>
<p>What that means in practice:</p>
<ul>
<li class="">The quickstart must produce a settled payment, on the sandbox, end-to-end. Not a token. Not a charge. A <em>settled payment with a webhook callback</em>. If they don't see the rail close the loop, they don't know the integration works.</li>
<li class="">The quickstart must work on the first try. Every command, every example, every credential. If step 4 of 7 has a typo, you've lost them.</li>
<li class="">The quickstart must be a single page. Not a series of linked pages. Integrators close the tab between page two and page three. A single page they can scroll, copy from, and tick off in their head wins.</li>
<li class="">The quickstart must take 15 to 30 minutes. Less than 15 means it skipped the hard parts (idempotency, webhook handling, signature verification) and the integrator will hit them in production. More than 30 means most readers bounce.</li>
</ul>
<p>We invested heavily in the quickstart and treated it like a marketing page — multiple drafts, peer review, dogfooding by engineers who hadn't seen our API before, A/B variants on the landing CTA. The conversion rate from "viewed quickstart" to "shipped first production payment" was the single best leading indicator of integration success that we tracked.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-id-do-differently-next-time">What I'd do differently next time<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#what-id-do-differently-next-time" class="hash-link" aria-label="Direct link to What I'd do differently next time" title="Direct link to What I'd do differently next time" translate="no">​</a></h2>
<p>The biggest thing I'd change is the order. We wrote the docs in roughly this sequence:</p>
<blockquote>
<p>Reference → Quickstart → Concepts → Errors → Webhooks (re-write) → Reconciliation patterns → Idempotency concept (extracted) → Wire-format glossary</p>
</blockquote>
<p>It would have been faster to get to the same place by writing in this order:</p>
<blockquote>
<p>Concepts → Quickstart → Webhooks (full) → Reconciliation patterns → Reference → Errors → Glossary</p>
</blockquote>
<p>Concepts first, because every later page references them. Quickstart second, because writing it forces every concept to be testable in 30 minutes. Webhooks third, because they are the surface area where integration succeeds or fails. Reference last, because once the surrounding structure is right, the reference is mostly mechanical.</p>
<p>The mistake we made was treating reference as the foundation. It isn't. Reference is the load-bearing wall, but it goes up after the foundation is poured.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-translates">What translates<a href="https://l-g99921.github.io/tw-portfolio/blog/documenting-pix-lessons#what-translates" class="hash-link" aria-label="Direct link to What translates" title="Direct link to What translates" translate="no">​</a></h2>
<p>Most of the lessons above generalize beyond PIX. The specifics that do:</p>
<ul>
<li class=""><strong>Any rail-level integration</strong>: the rail's canonical language belongs in your docs, not a translated abstraction. (PIX in Portuguese; SWIFT in English-with-codes; Open Banking in jurisdiction-specific JSON; CBDC pilots in whatever the local central bank publishes.)</li>
<li class=""><strong>Any high-volume webhook system</strong>: the webhook page should be three pages, not one, and the dedupe pattern should be a primary-key constraint at the storage layer.</li>
<li class=""><strong>Any developer-facing product where adoption is procurement-driven</strong>: the quickstart sells the product. Treat it like a landing page, with the same scrutiny you'd put on a hero block.</li>
</ul>
<p>The specifics that don't:</p>
<ul>
<li class="">The <code>txid</code> model is unusual. Most APIs assign IDs server-side; PIX deliberately doesn't. If your API does, you have less to explain.</li>
<li class="">The Portuguese-only standard is unusual. Most international standards publish in English first.</li>
<li class="">The 24-hour webhook retry window is unusual. Most APIs cap retries at 30 minutes or less.</li>
</ul>
<p>But those are mechanics. The structural lessons — reference is the floor, idempotency restructures the doc shape, localization isn't translation, webhooks are the support surface, the quickstart is the product page — those translate to anything with the same shape: a high-volume API with rail-level ground truth and a webhook callback model.</p>
<hr>
<p><em>About the author: I'm Leandro Gabriel, a Senior Technical Writer with 6+ years writing developer documentation across fintech, retail, and beauty data infrastructure. I owned the official PIX API documentation at Itaú Unibanco (via Zup Innovation, 2022–2024). If you're building docs for a payments rail or any high-volume API and want a second pair of eyes, <a href="https://www.linkedin.com/in/leandro-gabriel-8aab31167/" target="_blank" rel="noopener noreferrer" class="">I'm reachable on LinkedIn</a>. The portfolio this article is published on includes the structural samples I'd use to start: a <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/pix/about-pix">Diátaxis-organized PIX section</a>, a <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/api/pix-api/instant-payments-api-pix-sample">PIX-inspired OpenAPI sample</a>, and the <a href="https://github.com/L-G99921/tw-portfolio/blob/main/.github/workflows/docs-quality.yml" target="_blank" rel="noopener noreferrer" class="">docs-as-code pipeline</a> running Vale and Lychee on every change.</em></p>]]></content:encoded>
            <category>PIX</category>
            <category>API documentation</category>
            <category>Technical writing</category>
            <category>Brazil</category>
            <category>Fintech</category>
        </item>
        <item>
            <title><![CDATA[SmartLink Installation Guide and API Reference Now Available]]></title>
            <link>https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs</link>
            <guid>https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs</guid>
            <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Announcing the SmartLink Installation Guide and updated API Reference documentation for ConnectBox API and EnergyGrid Usage API.]]></description>
            <content:encoded><![CDATA[<p>Two new documentation sections are now available: the <strong>SmartLink Installation Guide</strong> and the updated <strong>API Reference</strong> for both the ConnectBox API and the Usage Data API.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="smartlink-installation-guide">SmartLink Installation Guide<a href="https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs#smartlink-installation-guide" class="hash-link" aria-label="Direct link to SmartLink Installation Guide" title="Direct link to SmartLink Installation Guide" translate="no">​</a></h2>
<p>The SmartLink is a compact smart plug that doubles as a whole-home energy meter. The new <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/smartlink/smartlink-installation-guide">SmartLink Installation Guide</a> walks you through the complete setup process, covering:</p>
<ul>
<li class=""><strong>Requirements and prerequisites</strong> — everything you need before starting, including device placement guidelines and Wi-Fi requirements.</li>
<li class=""><strong>Mobile app setup</strong> — step-by-step instructions for signing in, scanning the QR code, connecting to Wi-Fi, and binding to your smart meter.</li>
<li class=""><strong>Installation verification</strong> — how to confirm your SmartLink is online and reporting real-time energy data.</li>
<li class=""><strong>Troubleshooting</strong> — solutions for common issues such as connection failures, communication errors, and LED status indicators.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="api-reference-updates">API reference updates<a href="https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs#api-reference-updates" class="hash-link" aria-label="Direct link to API reference updates" title="Direct link to API reference updates" translate="no">​</a></h2>
<p>The API reference now covers two complete API systems:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="connectbox-api">ConnectBox API<a href="https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs#connectbox-api" class="hash-link" aria-label="Direct link to ConnectBox API" title="Direct link to ConnectBox API" translate="no">​</a></h3>
<p>The <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/api/powerbox-api">ConnectBox API</a> provides integration between utility backend systems and the EnergyGrid Platform. It includes:</p>
<ul>
<li class=""><strong>Customer Synchronization</strong> (<code>POST /powerbox/customer</code>) — sync customer account details, service addresses, and meter configurations from your utility CIS.</li>
<li class=""><strong>Hardware Binding</strong> (<code>POST /powerbox/bind</code>) — link a DataBridge or SmartLink device to an AMI meter over the utility's wireless mesh radio.</li>
</ul>
<p>Authentication uses OAuth 2.0 Bearer tokens in JWT format.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-api">Usage API<a href="https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs#usage-api" class="hash-link" aria-label="Direct link to Usage API" title="Direct link to Usage API" translate="no">​</a></h3>
<p>The <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/api/usage-api/energygrid-usage-api">Usage API</a> exposes endpoints for accessing energy usage data and insights. Categories include:</p>
<ul>
<li class=""><strong>Customer</strong> — login, profile management, budget settings, and home profile configuration.</li>
<li class=""><strong>Insights</strong> — energy usage breakdowns, main uses of energy, and message carousels.</li>
<li class=""><strong>Similar Homes</strong> — comparison data against similar households.</li>
<li class=""><strong>Usage</strong> — filtered energy usage data.</li>
<li class=""><strong>Metadata</strong> — thing types, categories, granularity types, property types, and metric types.</li>
<li class=""><strong>Rate Data</strong> — rate groups and billing cycle dates.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-guide">Integration Guide<a href="https://l-g99921.github.io/tw-portfolio/blog/2025/01/30/smartlink-and-api-docs#integration-guide" class="hash-link" aria-label="Direct link to Integration Guide" title="Direct link to Integration Guide" translate="no">​</a></h3>
<p>For a high-level walkthrough of how these APIs work together, see the <a class="" href="https://l-g99921.github.io/tw-portfolio/docs/integration-guide">Integration Guide</a>, which covers the full flow from hosting the ConnectBox middleware through OAuth setup, customer synchronization, bulk data ingestion, and hardware binding.</p>]]></content:encoded>
            <category>SmartLink</category>
            <category>API</category>
            <category>Documentation</category>
        </item>
    </channel>
</rss>