<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gökhan Kurt</title>
    <description>The latest articles on DEV Community by Gökhan Kurt (@gokhan_kurt).</description>
    <link>https://dev.to/gokhan_kurt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F96499%2F7146bf0c-4926-4ac7-9d6f-396a7f6ee0fb.JPG</url>
      <title>DEV Community: Gökhan Kurt</title>
      <link>https://dev.to/gokhan_kurt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gokhan_kurt"/>
    <language>en</language>
    <item>
      <title>Validate Google Hotel Center, Wego and trivago hotel feeds from CI</title>
      <dc:creator>Gökhan Kurt</dc:creator>
      <pubDate>Fri, 09 Oct 2026 18:27:54 +0000</pubDate>
      <link>https://dev.to/metasearch/validate-google-hotel-center-wego-and-trivago-hotel-feeds-from-ci-4jk1</link>
      <guid>https://dev.to/metasearch/validate-google-hotel-center-wego-and-trivago-hotel-feeds-from-ci-4jk1</guid>
      <description>&lt;h1&gt;
  
  
  Validate Google Hotel Center, Wego and trivago hotel feeds from CI
&lt;/h1&gt;

&lt;p&gt;Hotel distribution feeds look simple until you need to send the same property data to multiple platforms.&lt;/p&gt;

&lt;p&gt;A typical hotel feed may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;property ID&lt;/li&gt;
&lt;li&gt;hotel name&lt;/li&gt;
&lt;li&gt;address&lt;/li&gt;
&lt;li&gt;country&lt;/li&gt;
&lt;li&gt;latitude and longitude&lt;/li&gt;
&lt;li&gt;phone number&lt;/li&gt;
&lt;li&gt;property type&lt;/li&gt;
&lt;li&gt;star rating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is that every distribution platform has its own contract.&lt;/p&gt;

&lt;p&gt;A feed that looks complete internally may still fail onboarding or require additional mapping for Google Hotel Center, Wego, or trivago.&lt;/p&gt;

&lt;p&gt;I wanted a simple way to catch these differences before a feed reaches a partner integration, so I built an open-source CLI:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/metasearchcomtr/feed-validator" rel="noopener noreferrer"&gt;&lt;code&gt;@metasearch/feed-validator&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It currently supports published-contract validation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Hotel Center&lt;/li&gt;
&lt;li&gt;Wego Hotels&lt;/li&gt;
&lt;li&gt;trivago&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also includes readiness checks for Meta and Criteo, plus a generic hotel master-data quality check.&lt;/p&gt;

&lt;p&gt;The distinction is intentional: readiness checks are not presented as official certification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate a hotel feed
&lt;/h2&gt;

&lt;p&gt;You can run the validator directly with &lt;code&gt;npx&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator validate hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; google-hotel-center
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same feed can be checked against Wego:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator validate hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; wego
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or trivago:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator validate hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; trivago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The public repository also includes synthetic hotel feeds, so the examples can be reproduced without using production hotel or customer data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare the same feed across platforms
&lt;/h2&gt;

&lt;p&gt;In practice, the comparison workflow is often more useful than validating a single target.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator compare hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--targets&lt;/span&gt; google-hotel-center,wego,trivago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes platform-specific gaps visible before implementation or onboarding.&lt;/p&gt;

&lt;p&gt;The goal is not to force every platform into a fake universal schema.&lt;/p&gt;

&lt;p&gt;Instead, the validator normalizes common hotel fields while keeping destination-specific validation rules separate.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Canonicalization answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can heterogeneous supplier records be represented consistently?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Validation answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this data sufficient for this particular destination?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use validation as a CI gate
&lt;/h2&gt;

&lt;p&gt;Feed validation can also run as part of a pull-request workflow.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate hotel feed&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validate-feed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v5&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="s"&gt;npx @metasearch/feed-validator&lt;/span&gt;
          &lt;span class="s"&gt;validate path/to/hotels.csv&lt;/span&gt;
          &lt;span class="s"&gt;--target google-hotel-center&lt;/span&gt;
          &lt;span class="s"&gt;--fail-on error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI uses deterministic exit codes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; — validation passed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; — configured validation threshold failed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;2&lt;/code&gt; — input, fetch, parsing, or CLI error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For pipelines that need structured output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator validate hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; google-hotel-center &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also make the pipeline stricter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @metasearch/feed-validator validate hotels.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target&lt;/span&gt; google-hotel-center &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--fail-on&lt;/span&gt; warning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Supported input formats
&lt;/h2&gt;

&lt;p&gt;The validator currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSV&lt;/li&gt;
&lt;li&gt;TSV&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;NDJSON&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Input can come from a local file, a public HTTP/HTTPS URL, or stdin.&lt;/p&gt;

&lt;p&gt;That makes the same validation engine usable locally, in CI, or through the Node.js SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why platform-specific rules matter
&lt;/h2&gt;

&lt;p&gt;One of the main design decisions was not pretending that every hotel distribution platform has the same schema.&lt;/p&gt;

&lt;p&gt;Google Hotel Center, Wego, and trivago have different field expectations and integration models.&lt;/p&gt;

&lt;p&gt;A universal "hotel feed score" can hide exactly the differences an integration engineer needs to understand.&lt;/p&gt;

&lt;p&gt;The validator therefore uses target-specific rule packs.&lt;/p&gt;

&lt;p&gt;Published-contract validation is only used where maintainable first-party technical requirements are available.&lt;/p&gt;

&lt;p&gt;When a public contract is not sufficient for a true validator, the feature is explicitly labeled as a readiness check instead.&lt;/p&gt;

&lt;p&gt;No undocumented mandatory fields are invented.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same workflow is also available over MCP
&lt;/h2&gt;

&lt;p&gt;The validation engine is also exposed through a &lt;a href="https://metasearch.com.tr/en/mcp?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=feed-validator-launch-2026&amp;amp;utm_content=mcp-guide" rel="noopener noreferrer"&gt;public remote MCP server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That allows MCP-compatible clients to perform workflows such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Detect this feed format, normalize the hotel records, compare Google Hotel Center, Wego and trivago requirements, and explain what should be fixed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The MCP server currently exposes 12 tools covering feed detection, normalization, validation, platform comparison, and remediation suggestions.&lt;/p&gt;

&lt;p&gt;So the same underlying workflow can be used from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the CLI&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://metasearch.com.tr/en/tools/hotel-feed-validator?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=feed-validator-launch-2026&amp;amp;utm_content=ci-example" rel="noopener noreferrer"&gt;browser tool&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP-compatible AI clients&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;The Feed Validator and MCP companion project are both open source.&lt;/p&gt;

&lt;p&gt;The repository contains synthetic sample feeds and copy-paste CI examples, so you can try the workflow without preparing a real supplier feed.&lt;/p&gt;

&lt;p&gt;I'm especially interested in feedback from developers working with hotel distribution, channel management, OTA connectivity, metasearch, or travel-tech data pipelines.&lt;/p&gt;

&lt;p&gt;If you work in this area, I'd be curious to hear which feed validation problems cause the most friction in your integrations.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>travel</category>
      <category>githubactions</category>
    </item>
  </channel>
</rss>
