<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Emore Ogheneyoma Lawrence - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Emore Ogheneyoma Lawrence - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 22:24:01 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/Yoma/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Use Zod for React API Validation ]]>
                </title>
                <description>
                    <![CDATA[ In React applications, handling API (Application Programming Interface) responses can be challenging. You might encounter data that’s missing crucial fields, that’s formatted unexpectedly, or that simply doesn’t match what you anticipated. This incon... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-zod-for-react-api-validation/</link>
                <guid isPermaLink="false">67c1f994107ebba152ad9e79</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ zod ]]>
                    </category>
                
                    <category>
                        <![CDATA[ API ]]>
                    </category>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ frontend ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Emore Ogheneyoma Lawrence ]]>
                </dc:creator>
                <pubDate>Fri, 28 Feb 2025 17:59:48 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1740756200896/a57c4e95-b13e-412a-828e-09e97f22a6c4.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In React applications, handling API (Application Programming Interface) responses can be challenging. You might encounter data that’s missing crucial fields, that’s formatted unexpectedly, or that simply doesn’t match what you anticipated.</p>
<p>This inconsistency can lead to errors in your code and make it difficult to work with the data effectively. Imagine wrestling with unpredictable API responses as your application grows – it can quickly become a development nightmare!</p>
<p>This is where Zod comes in, offering a solution to effectively manage API data validation within React.</p>
<h3 id="heading-by-the-end-of-this-tutorial-youll-learn-how-to">By the end of this tutorial, you’ll learn how to:</h3>
<ol>
<li><p>Set up and use Zod for API response validation in React.</p>
</li>
<li><p>Define schemas to validate and transform incoming data.</p>
</li>
<li><p>integrate Zod into API calls to improve data handling and prevent UI crashes.</p>
</li>
</ol>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a class="post-section-overview" href="#heading-what-is-zod-and-why-use-it-for-react-api-calls">What is Zod, and Why Use it for React API Calls?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-generate-a-new-typescript-react-project">How to Generate a New TypeScript React Project</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-core-zod-concepts-basic-usage-types-and-validation">Core Zod Concepts: Basic Usage, Types, and Validation</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-build-zod-schemas-for-api-responses">How to Build Zod Schemas for API Responses</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-integrate-zod-with-react-api-calls">How to Integrate Zod with React API Calls</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-render-the-user-interface-ui-and-handle-errors-in-react">How to Render the User Interface (UI) and Handle Errors in React</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-what-is-zod-and-why-use-it-for-react-api-calls">What is Zod, and Why Use it for React API Calls?</h2>
<p>Zod is a powerful TypeScript-first library that simplifies data validation. It lets you define clear rules (schemas) for your expected data format.</p>
<p>Zod can then validate incoming data (often from API responses) to ensure it conforms to these rules. This validation process guarantees that the data adheres to your defined format, enhancing the reliability and integrity of your application.</p>
<p>Here's why Zod shines for React API validation:</p>
<ul>
<li><p>Clear schemas: Zod helps you define concise blueprints for API responses, enhancing readability and maintainability.</p>
</li>
<li><p>Data validation: It offers powerful validation methods for various data types, enforcing rules like required fields and specific formats.</p>
</li>
<li><p>Early error detection: It helps you detect data inconsistencies during API calls, preventing unexpected errors later in the application.</p>
</li>
<li><p>Improved developer experience: It promotes type-safe coding, streamlining development time by eliminating manual data type checks.</p>
</li>
<li><p>Single source of truth: And finally, Zod serves as a central point for data model definitions, ensuring consistency across the React application and reducing errors.</p>
</li>
</ul>
<p>Using Zod, you can transform unpredictable API responses into clean, structured data, setting the stage for a smoother and more efficient development experience in your React applications.</p>
<h2 id="heading-how-to-generate-a-new-typescript-react-project">How to Generate a New TypeScript React Project</h2>
<p>Creating a new React project with TypeScript is straightforward. Here's how to get started. Execute the following command in your terminal:</p>
<pre><code class="lang-bash">npm create vite@latest my-react-app -- --template react-ts
</code></pre>
<p>Once the project is generated, navigate to the projects directory:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> my-react-app
npm install
npm run dev
</code></pre>
<p>That’s it! Your React Project with TypeScript is now up and ready to use. Run the command below to install the Zod package:</p>
<pre><code class="lang-bash">npm install zod
</code></pre>
<h2 id="heading-core-zod-concepts-basic-usage-types-and-validation">Core Zod Concepts: Basic Usage, Types, and Validation</h2>
<p>Zod helps you define clear expectations for your API responses using <strong>schemas</strong>. These schemas act like blueprints, specifying the types of data you expect to receive.</p>
<h3 id="heading-how-to-build-schemas">How to Build Schemas</h3>
<p>Zod provides builder functions like <code>z.string()</code>, <code>z.number()</code>, and <code>z.object()</code> to create schemas. These functions define the data type you want for a specific field in your response.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { z } <span class="hljs-keyword">from</span> <span class="hljs-string">'zod'</span>;
<span class="hljs-comment">// Define basic data types</span>
<span class="hljs-keyword">const</span> userName = z.string().min(<span class="hljs-number">5</span>).max(<span class="hljs-number">10</span>); <span class="hljs-comment">// String with min 5 and max 10 characters</span>
<span class="hljs-keyword">const</span> userAge = z.number().positive().int();  <span class="hljs-comment">// Positive integer</span>
<span class="hljs-keyword">const</span> userEmail = z.string().email();        <span class="hljs-comment">// Ensures a valid email format</span>

<span class="hljs-built_in">console</span>.log(userName.parse(<span class="hljs-string">'John Doe'</span>));       <span class="hljs-comment">// Output: John Doe (valid)</span>
<span class="hljs-built_in">console</span>.log(userAge.parse(<span class="hljs-number">30</span>));              <span class="hljs-comment">// Output: 30 (valid)</span>
<span class="hljs-built_in">console</span>.log(userEmail.parse(<span class="hljs-string">"johnDoe@gmail.com"</span>)); <span class="hljs-comment">// Output: johnDoe@gmail.com (valid)</span>
</code></pre>
<p>The code above defines three basic data types:</p>
<ul>
<li><p><code>userName</code>: Represents a string with a minimum length of 5 characters and a maximum length of 10 characters.</p>
</li>
<li><p><code>userAge</code>: Represents a positive integer.</p>
</li>
<li><p><code>userEmail</code>: Ensures a valid email format.</p>
</li>
</ul>
<p>Here’s the result of the code above:  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1738857987322/55a5943c-6633-4432-a441-c3dfa9400d93.png" alt="Image of the resulting code above" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-add-validation-rules">How to Add Validation Rules</h3>
<p>Zod allows you to chain methods like <strong>min</strong>, <strong>max</strong>, <strong>positive</strong>, <strong>int</strong>, and <strong>email</strong> to enforce specific rules on these data types. Here’s an example of an invalid string exceeding the maximum length:</p>
<pre><code class="lang-typescript"><span class="hljs-built_in">console</span>.log(userName.parse(<span class="hljs-string">"Hello there, My Name is John Doe"</span>)); <span class="hljs-comment">// Throws ZodError</span>
</code></pre>
<p>The code throws a <code>ZodError</code> due to exceeding the maximum length of 10 strings, disrupting our application flow and eventually causing our application to break.  </p>
<p>Here’s the image of the resulting code error:  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1738859384410/27c2a5f3-2410-4709-ac27-8bf24f6c3fd8.png" alt="Image of the resulting code above" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-validating-and-parsing">Validating and Parsing</h3>
<p>Zod offers two ways to check data against your schema:</p>
<ul>
<li><p><code>schema.parse(data)</code><strong>:</strong> This method attempts to parse the data according to your schema. But if there's a validation error, it throws a <code>ZodError</code>. This can disrupt your application's flow, as illustrated in the previous example.</p>
</li>
<li><p><code>schema.safeParse(data)</code>: This is the recommended approach. it parses the data and returns a <code>ZodResult object</code>. This object contains some key properties:</p>
<ul>
<li><p><code>success</code>: A boolean indicating whether the parsing was successful.</p>
</li>
<li><p><code>data</code>: The parsed data itself (if the success property is true)</p>
</li>
<li><p><code>error</code>: An error message if validation fails (if success property is false)</p>
</li>
</ul>
</li>
</ul>
<p>Here are two examples showcasing the usage of <code>safeParse</code> with both valid and invalid data so you can see the resulting outcomes.  </p>
<p>First, lets see an example using <code>safeParse</code> with valid data:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> userSchema = z.object({
  name: userName,
  age: userAge,
  email: userEmail,
});

<span class="hljs-keyword">const</span> userData = {
  name: <span class="hljs-string">"John Doe"</span>,
  age: <span class="hljs-number">24</span>,
  email: <span class="hljs-string">"johndoe@gmail.com"</span>
};

<span class="hljs-keyword">const</span> result = userSchema.safeParse(userData);

<span class="hljs-built_in">console</span>.log(result); <span class="hljs-comment">// ZodObject containing data and success status</span>
</code></pre>
<p>This code defines a schema for user data using Zod, including properties for name, age, and email. It then attempts to parse a sample <code>userData</code> object using this schema via <code>safeParse()</code>. If successful, it prints the parsed data – otherwise, it logs an error message indicating the use of invalid data.  </p>
<p>Here’s the image of the resulting code above:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1738861119776/7f9cf3ec-fc83-452c-9477-1c7d6422efe3.png" alt="7f9cf3ec-fc83-452c-9477-1c7d6422efe3" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Let’s now see how <code>safeParse()</code> handles invalid data using the same example as above. We’ll pass invalid data to the <code>userSchema.safeParse()</code> function to observe its behaviour.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> userSchema = z.object({
  name: userName,
  age: userAge,
  email: userEmail,
});

<span class="hljs-keyword">const</span> userData = {
  name: <span class="hljs-string">"John Doe"</span>,
  age: <span class="hljs-number">24</span>,
  email: <span class="hljs-string">"johndoe.com"</span> <span class="hljs-comment">// invalid email</span>
};

<span class="hljs-keyword">const</span> result = userSchema.safeParse(userData);

<span class="hljs-built_in">console</span>.log(result); <span class="hljs-comment">// ZodObject containing error and success status</span>
</code></pre>
<p>In this code example, we defined the <code>userSchema</code>. Next, we attempted to parse the <code>userData</code> object. But the parsing failed because the email property was not correctly formatted. Here’s a visual representation of the resulting output:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1740502631913/25dead7a-ab09-4d1d-9dcc-fada38e7d4d6.png" alt="25dead7a-ab09-4d1d-9dcc-fada38e7d4d6" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Unlike using <code>parse</code>, which completely halts your application upon encountering validation errors and throws a <code>ZodError</code>, utilizing <code>safeParse</code> allows you to gracefully handle these errors, ensuring uninterrupted operation.</p>
<h2 id="heading-how-to-build-zod-schemas-for-api-responses">How to Build Zod Schemas for API Responses</h2>
<p>Building on our understanding of Zod’s core concepts, let’s create Zod schemas specifically for data received from API calls. We’ll leverage data from <a target="_blank" href="https://jsonplaceholder.typicode.com/posts">JSONPlaceholder</a>, which offers information about posts.  </p>
<p>Here’s a sample JSON response representing a post from JSONPlaceholder:</p>
<pre><code class="lang-typescript">{
  <span class="hljs-string">"userId"</span>: <span class="hljs-number">1</span>,
  <span class="hljs-string">"id"</span>: <span class="hljs-number">3</span>,
  <span class="hljs-string">"title"</span>: <span class="hljs-string">"ea molestias quasi exercitationem repellat qui ipsa sit aut"</span>,
  <span class="hljs-string">"body"</span>: <span class="hljs-string">"et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut"</span>
}
</code></pre>
<p>Create a React component (give it a name that fits your project structure) to demonstrate building and utilizing Zod schemas for API validation. In this article, for illustrative purposes, we’ll call it the <code>ZodApi</code> component.</p>
<pre><code class="lang-typescript"> <span class="hljs-keyword">import</span> { z } <span class="hljs-keyword">from</span> <span class="hljs-string">'zod'</span>;

  <span class="hljs-keyword">const</span> postSchema = z.object({
  userId: z.number().positive().int(),
  id: z.number().positive().int(),
  title: z.string(),
  body: z.string()
});

<span class="hljs-keyword">const</span> postSchemaArray = z.array(postSchema); <span class="hljs-comment">// Schema for array of posts</span>
</code></pre>
<p>This code defines the expected structure of a single post object (<code>postSchema</code>) and an array of posts (<code>postSchemaArray</code>).</p>
<p>The following sections will explore integrating Zod with React components for API call handling and error management.</p>
<h2 id="heading-how-to-integrate-zod-with-react-api-calls">How to Integrate Zod with React API Calls</h2>
<p>Let's bridge the gap between your defined Zod schemas and real API interactions.</p>
<p>We’ll need to update the code we wrote in the previous section to achieve our desired result in this section.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { z } <span class="hljs-keyword">from</span> <span class="hljs-string">'zod'</span>;
<span class="hljs-keyword">import</span> { useEffect } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-keyword">const</span> postSchema = z.object({
  userId: z.number().positive().int(),
  id: z.number().positive().int(),
  title: z.string(),
  body: z.string()
});

<span class="hljs-keyword">const</span> postSchemaArray = z.array(postSchema); <span class="hljs-comment">// schema for an array of posts</span>

<span class="hljs-keyword">type</span> Posts = z.infer&lt;<span class="hljs-keyword">typeof</span> postSchemaArray&gt;; <span class="hljs-comment">// type of the posts</span>

<span class="hljs-keyword">const</span> ZodApi = <span class="hljs-function">() =&gt;</span> {
  useEffect(<span class="hljs-function">() =&gt;</span> {
    fetch(<span class="hljs-string">"https://jsonplaceholder.typicode.com/posts"</span>)
      .then(<span class="hljs-function">(<span class="hljs-params">response</span>) =&gt;</span> response.json())
      .then(<span class="hljs-function">(<span class="hljs-params">posts: Posts</span>) =&gt;</span> {
        <span class="hljs-keyword">const</span> validatedPosts = postSchemaArray.safeParse(posts); <span class="hljs-comment">// remember to use safeParse instead of parse</span>

        <span class="hljs-keyword">if</span> (validatedPosts.success === <span class="hljs-literal">false</span>) {
          <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Validation Error:"</span>validatedPosts.error);
          <span class="hljs-keyword">return</span>;
        }

        <span class="hljs-comment">// we can now safely use the posts</span>
        <span class="hljs-built_in">console</span>.log(validatedPosts.data);
      });
  }, []);
  <span class="hljs-keyword">return</span> &lt;div&gt;ZodApi&lt;/div&gt;;
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> ZodApi;
</code></pre>
<p>The <code>ZodApi</code> component demonstrates:</p>
<ul>
<li><p>Fetching data: Uses <code>useEffect</code> and <code>fetch</code> to get data from the API.</p>
</li>
<li><p>Type safety: <code>type Posts = z.infer&lt;typeof postSchemaArray&gt;;</code> ensures type safety by defining the <code>Posts type</code> inferred from the schema <code>postSchemaArray</code>.</p>
</li>
<li><p>Parsing with Zod: Validates the fetched data against the <code>postSchemaArray</code> using <code>safeParse</code>.</p>
</li>
<li><p>Handling success: If validation succeeds, it provides access to clean data in <code>validatedPosts.data</code> for use in your component (UI, state, and so on).</p>
</li>
</ul>
<p>Error handling: The <code>if</code> statement showcases a simple approach to Zod error handling. In a case where the validation is not successful (<code>validatedPosts.success === false</code>), a ZodError message is logged to the console.  </p>
<p>Here’s a snapshot showing the resulting output in the console.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1740504815204/45ce101a-4e8c-475b-ad4d-783b0940710b.png" alt="45ce101a-4e8c-475b-ad4d-783b0940710b" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-render-the-user-interface-ui-and-handle-errors-in-react">How to Render the User Interface (UI) and Handle Errors in React</h2>
<p>In this section, you’ll learn how to render the UI based on our validated data and implement the error-handling mechanism using React states.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { z } <span class="hljs-keyword">from</span> <span class="hljs-string">"zod"</span>;
<span class="hljs-keyword">import</span> { useEffect, useState } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;

<span class="hljs-keyword">const</span> postSchema = z.object({
  userId: z.number().positive().int(),
  id: z.number().positive().int(),
  title: z.string(),
  body: z.string(),
});

<span class="hljs-keyword">const</span> postSchemaArray = z.array(postSchema); <span class="hljs-comment">// schema for an array of posts</span>

<span class="hljs-keyword">type</span> Posts = z.infer&lt;<span class="hljs-keyword">typeof</span> postSchemaArray&gt;; <span class="hljs-comment">// type of the posts</span>

<span class="hljs-keyword">const</span> ZodApi = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> [posts, setPosts] = useState&lt;Posts&gt;([]); <span class="hljs-comment">// State to store validated posts</span>
  <span class="hljs-keyword">const</span> [error, setError] = useState(<span class="hljs-string">""</span>); <span class="hljs-comment">// State to store any errors</span>
  useEffect(<span class="hljs-function">() =&gt;</span> {
    fetch(<span class="hljs-string">"https://jsonplaceholder.typicode.com/posts"</span>)
      .then(<span class="hljs-function">(<span class="hljs-params">response</span>) =&gt;</span> response.json())
      .then(<span class="hljs-function">(<span class="hljs-params">posts: Posts</span>) =&gt;</span> {
        <span class="hljs-keyword">const</span> validatedPosts = postSchemaArray.safeParse(posts); <span class="hljs-comment">// remember to use safeParse instead of parse</span>

        <span class="hljs-keyword">if</span> (validatedPosts.success === <span class="hljs-literal">false</span>) {
          <span class="hljs-built_in">console</span>.log(validatedPosts.error.name);
          setError(validatedPosts.error.message); <span class="hljs-comment">// set error state</span>
          <span class="hljs-keyword">return</span>;
        }

        <span class="hljs-comment">// we can now safely use the validatedPosts </span>
        <span class="hljs-built_in">console</span>.log(validatedPosts.data);
        setPosts(validatedPosts.data)
      });
  }, []);

  <span class="hljs-comment">// Handle loading state (optional)</span>
  <span class="hljs-keyword">if</span> (!posts.length &amp;&amp; !error) {
    <span class="hljs-keyword">return</span> &lt;div&gt;Loading posts...&lt;/div&gt;;
  }

  <span class="hljs-comment">// Handle error state</span>
  <span class="hljs-keyword">if</span> (error) {
    <span class="hljs-keyword">return</span> &lt;div&gt;<span class="hljs-built_in">Error</span> fetching Data&lt;<span class="hljs-regexp">/div&gt;; /</span><span class="hljs-regexp">/ Display user-friendly error message
  }

  return (
    &lt;div&gt;
      &lt;h1&gt;Posts&lt;/</span>h1&gt;
      &lt;ol&gt;
        {posts.map(<span class="hljs-function">(<span class="hljs-params">post</span>) =&gt;</span> (
          &lt;li key={post.id}&gt;
            {post.title}
          &lt;/li&gt;
        ))}
      &lt;/ol&gt;
    &lt;/div&gt;
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> ZodApi;
</code></pre>
<p>In the code above, we’ve updated the <code>ZodApi</code> component to perform the following tasks:</p>
<ul>
<li><p>State declaration: The <code>posts</code> and <code>error</code> states hold the data and error (if any) gotten from the fetch request.</p>
</li>
<li><p>Error handling: We use the <code>posts</code> and <code>error</code> state to show a “Loading posts…” message when the posts are being fetched and no error occurs, and display an error message when an error occurs.</p>
</li>
<li><p>Rendering posts: It maps through the fetched posts and renders them on the UI.</p>
</li>
</ul>
<p>Output:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1740506104138/f2afac53-e312-4a40-af01-500e0dd349f7.gif" alt="f2afac53-e312-4a40-af01-500e0dd349f7" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>After fetching the results, you should see the 100 posts displayed on your screen. If you followed the steps correctly, you'll find all 100 posts visible. If you encounter any issues, make sure the fetching process was successful.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>By incorporating Zod into your React development workflow, you can build more robust and reliable applications.</p>
<p>Zod empowers you to catch mismatched data early on, preventing errors and saving valuable debugging time. Also, the user-friendly error messages given by Zod validation enhance your application’s overall user experience.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
