<?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: Mahmoud Sayed</title>
    <description>The latest articles on DEV Community by Mahmoud Sayed (@mahmoudsayed96).</description>
    <link>https://dev.to/mahmoudsayed96</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F459621%2Fb14b40cf-edc1-4a03-99a5-f0a9f0310de9.jpeg</url>
      <title>DEV Community: Mahmoud Sayed</title>
      <link>https://dev.to/mahmoudsayed96</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahmoudsayed96"/>
    <language>en</language>
    <item>
      <title>Apigee Logger Shared Flow - Implementation Guide</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Mon, 08 Sep 2025 20:45:33 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/apigee-logger-shared-flow-implementation-guide-3cbn</link>
      <guid>https://dev.to/mahmoudsayed96/apigee-logger-shared-flow-implementation-guide-3cbn</guid>
      <description>&lt;h1&gt;
  
  
  Apigee Logger Shared Flow - Implementation Guide
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This comprehensive logging solution provides structured logging for Apigee API proxies with support for both ELK (Elasticsearch, Logstash, Kibana) and Apache Spark. The solution includes advanced data masking capabilities to protect sensitive information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Functionality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dual Destination Logging&lt;/strong&gt;: Simultaneously logs to ELK and Spark platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request/Response Logging&lt;/strong&gt;: Captures complete API transaction details&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensitive Data Masking&lt;/strong&gt;: Automatically masks passwords, tokens, keys, PII data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Metrics&lt;/strong&gt;: Tracks latency and processing times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: Comprehensive error capture and logging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous Processing&lt;/strong&gt;: Non-blocking log transmission&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Masking Capabilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email Masking&lt;/strong&gt;: &lt;code&gt;john.doe@example.com&lt;/code&gt; → &lt;code&gt;jo***@example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone Masking&lt;/strong&gt;: &lt;code&gt;555-123-4567&lt;/code&gt; → &lt;code&gt;555***4567&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credit Card Masking&lt;/strong&gt;: &lt;code&gt;1234-5678-9012-3456&lt;/code&gt; → &lt;code&gt;1234****3456&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSN Masking&lt;/strong&gt;: &lt;code&gt;123-45-6789&lt;/code&gt; → &lt;code&gt;XXX-XX-6789&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token/Key Masking&lt;/strong&gt;: Full masking for security tokens and API keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password Masking&lt;/strong&gt;: Complete masking of password fields&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Deploy Shared Flow Components
&lt;/h3&gt;

&lt;p&gt;Create the following directory structure in your Apigee project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shared-flows/
└── logger-shared-flow/
    ├── sharedflowbundle/
    │   ├── logger-shared-flow.xml
    │   ├── policies/
    │   │   ├── Extract-Request-Data.xml
    │   │   ├── Mask-Sensitive-Request-Data.xml
    │   │   ├── Build-Request-Log-Payload.xml
    │   │   ├── Send-Request-Log-ELK.xml
    │   │   ├── Send-Request-Log-Spark.xml
    │   │   ├── Extract-Response-Data.xml
    │   │   ├── Mask-Sensitive-Response-Data.xml
    │   │   ├── Build-Response-Log-Payload.xml
    │   │   ├── Send-Response-Log-ELK.xml
    │   │   └── Send-Response-Log-Spark.xml
    │   └── resources/
    │       └── jsc/
    │           ├── mask-sensitive-data.js
    │           └── mask-sensitive-response-data.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure Environment Variables
&lt;/h3&gt;

&lt;p&gt;Create KVM (Key-Value Map) entries for your environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using Apigee Management API&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  https://api.enterprise.apigee.com/v1/organizations/&lt;span class="o"&gt;{&lt;/span&gt;org&lt;span class="o"&gt;}&lt;/span&gt;/environments/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/keyvaluemaps &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "name": "logger-config",
    "encrypted": false
  }'&lt;/span&gt;

&lt;span class="c"&gt;# Add configuration entries&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  https://api.enterprise.apigee.com/v1/organizations/&lt;span class="o"&gt;{&lt;/span&gt;org&lt;span class="o"&gt;}&lt;/span&gt;/environments/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/keyvaluemaps/logger-config/entries &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "name": "elk.logging.enabled",
    "value": "true"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Deploy the Shared Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Deploy using Apigee CLI&lt;/span&gt;
apigee sharedflows deploy &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;org&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; logger-shared-flow &lt;span class="nt"&gt;-f&lt;/span&gt; ./shared-flows/logger-shared-flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ELK Configuration Parameters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elk.logging.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable/disable ELK logging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elk.endpoint.url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Elasticsearch endpoint URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://elasticsearch.company.com:9200&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elk.index.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Index pattern for logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apigee-logs-{YYYY.MM.DD}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;elk.auth.token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bearer token for authentication&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIs...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Spark Configuration Parameters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark.logging.enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable/disable Spark logging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark.endpoint.url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Spark cluster endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://spark.company.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark.topic.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kafka topic for logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apigee-api-logs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark.partition.key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Partitioning strategy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark.auth.credentials&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base64 encoded credentials&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dXNlcjpwYXNzd29yZA==&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Usage in API Proxies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Request Logging (PreFlow)
&lt;/h3&gt;

&lt;p&gt;Add this FlowCallout policy in your API proxy's PreFlow Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;FlowCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Log-API-Request"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Log API Request&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SharedFlowBundle&amp;gt;&lt;/span&gt;logger-shared-flow&lt;span class="nt"&gt;&amp;lt;/SharedFlowBundle&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/FlowCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Response Logging (PostFlow)
&lt;/h3&gt;

&lt;p&gt;Add this FlowCallout policy in your API proxy's PostFlow Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;FlowCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Log-API-Response"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Log API Response&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SharedFlowBundle&amp;gt;&lt;/span&gt;logger-shared-flow&lt;span class="nt"&gt;&amp;lt;/SharedFlowBundle&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/FlowCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Complete API Proxy Integration Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ProxyEndpoint&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Description/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;FaultRules/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PreFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PreFlow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Request&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Log-API-Request&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.verb != "OPTIONS"&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Response/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/PreFlow&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PostFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PostFlow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Request/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Log-API-Response&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.verb != "OPTIONS"&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/PostFlow&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Flows/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;HTTPProxyConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;BasePath&amp;gt;&lt;/span&gt;/api/v1/users&lt;span class="nt"&gt;&amp;lt;/BasePath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;VirtualHost&amp;gt;&lt;/span&gt;secure&lt;span class="nt"&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/HTTPProxyConnection&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;RouteRule&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;TargetEndpoint&amp;gt;&lt;/span&gt;default&lt;span class="nt"&gt;&amp;lt;/TargetEndpoint&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/RouteRule&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ProxyEndpoint&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Log Structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Request Log Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01T12:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678-1234-1234-1234-123456789012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiProxy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"users-api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/v1/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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 class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Be***er token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"xApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ak_****5678"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payload"&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 class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jo***oe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jo***@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"********"&lt;/span&gt;&lt;span class="w"&gt;
    &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 class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"client"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.168.1.100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"userAgent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"masking"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01T12:00:00.000Z"&lt;/span&gt;&lt;span class="w"&gt;
  &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 class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Response Log Schema
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_response"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01T12:00:01.500Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678-1234-1234-1234-123456789012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"statusMessage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payload"&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 class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ey***abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"refresh_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt***xyz"&lt;/span&gt;&lt;span class="w"&gt;
    &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 class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"performance"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totalLatency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"targetLatency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&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 class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &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 class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sensitive Data Protection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All passwords are completely masked&lt;/li&gt;
&lt;li&gt;API keys and tokens show only prefix/suffix&lt;/li&gt;
&lt;li&gt;Email addresses mask the local part&lt;/li&gt;
&lt;li&gt;Phone numbers mask middle digits&lt;/li&gt;
&lt;li&gt;Credit cards show only first 4 and last 4 digits&lt;/li&gt;
&lt;li&gt;SSN shows only last 4 digits&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regular Token Rotation&lt;/strong&gt;: Rotate ELK and Spark authentication tokens regularly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Security&lt;/strong&gt;: Ensure encrypted connections (HTTPS/TLS) to logging endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Control&lt;/strong&gt;: Implement proper IAM policies for log access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Retention&lt;/strong&gt;: Configure appropriate log retention policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Set up alerts for logging failures&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Logging Disabled&lt;/strong&gt;: Check KVM configuration for enabled flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication Failures&lt;/strong&gt;: Verify bearer tokens and credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Timeouts&lt;/strong&gt;: Adjust timeout settings in ServiceCallout policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Masking Errors&lt;/strong&gt;: Check JavaScript policy execution logs&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Debug Mode
&lt;/h3&gt;

&lt;p&gt;Enable debug logging by adding this variable to your KVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;debug.logging.enabled = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Monitoring
&lt;/h3&gt;

&lt;p&gt;Monitor these metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log transmission latency&lt;/li&gt;
&lt;li&gt;Failed log deliveries&lt;/li&gt;
&lt;li&gt;Masking operation time&lt;/li&gt;
&lt;li&gt;Memory usage during processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Custom Masking Rules
&lt;/h3&gt;

&lt;p&gt;To add custom masking rules, modify the JavaScript resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add custom sensitive field&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;customSensitiveFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;custom_field&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proprietary_data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;sensitiveFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customSensitiveFields&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Add custom masking pattern&lt;/span&gt;
&lt;span class="nx"&gt;maskingPatterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;custom_field&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Custom masking logic&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;customMaskFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Environment-Specific Settings
&lt;/h3&gt;

&lt;p&gt;Create separate KVM configurations for different environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Development&lt;/span&gt;
logger-config-dev

&lt;span class="c"&gt;# Testing  &lt;/span&gt;
logger-config-test

&lt;span class="c"&gt;# Production&lt;/span&gt;
logger-config-prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integration with Monitoring Tools
&lt;/h3&gt;

&lt;p&gt;The logs can be integrated with various monitoring and alerting tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ELK Alerts&lt;/strong&gt;: Create Elasticsearch Watcher alerts for error conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spark Monitoring&lt;/strong&gt;: Use Spark Streaming for real-time analytics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana Dashboards&lt;/strong&gt;: Create visualization dashboards for log metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Splunk Integration&lt;/strong&gt;: Forward logs to Splunk for enterprise monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This comprehensive logging solution provides enterprise-grade logging capabilities while maintaining security and performance standards.&lt;/p&gt;

&lt;p&gt;I'll create a comprehensive Apigee shared flow for logging to ELK and Spark with data masking capabilities. This will include request/response logging and sensitive data protection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apigee Logger Shared Flow - Main Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;revision=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"logger-shared-flow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;ELK Spark Logger Shared Flow&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Description&amp;gt;&lt;/span&gt;Comprehensive logging shared flow for ELK and Spark with data masking&lt;span class="nt"&gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Extract-Request-Data&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Mask-Sensitive-Request-Data&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Build-Request-Log-Payload&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Send-Request-Log-ELK&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS") and (elk.logging.enabled = true)&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Send-Request-Log-Spark&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS") and (spark.logging.enabled = true)&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Extract-Response-Data&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Mask-Sensitive-Response-Data&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Build-Response-Log-Payload&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS")&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Send-Response-Log-ELK&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS") and (elk.logging.enabled = true)&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Send-Response-Log-Spark&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;(request.verb != "OPTIONS") and (spark.logging.enabled = true)&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extract Request Data Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ExtractVariables&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Extract-Request-Data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Extract Request Data&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Extract basic request information --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Request Headers --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.header.content-type}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.header.authorization}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"User-Agent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.header.user-agent}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-API-Key"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.header.x-api-key}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Query Parameters --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;QueryParam&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"username"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.queryparam.username}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/QueryParam&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;QueryParam&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.queryparam.password}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/QueryParam&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;QueryParam&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"token"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.queryparam.token}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/QueryParam&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;QueryParam&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"api_key"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{request.queryparam.api_key}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/QueryParam&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- URI Path Parameters --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;URIPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;/v{version}/*/users/{user_id}/*&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/URIPath&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- JSON Path Extraction for Request Body --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;JSONPayload&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.username"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.username&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.password"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.password&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.email&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.phone"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.phone&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.ssn"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.ssn&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.credit_card"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.credit_card&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.api_key"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.api_key&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.access_token"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.access_token&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.refresh_token"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.refresh_token&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"req.client_secret"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.client_secret&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/JSONPayload&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Source&amp;gt;&lt;/span&gt;request&lt;span class="nt"&gt;&amp;lt;/Source&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ExtractVariables&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mask Sensitive Request Data Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Javascript&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Mask-Sensitive-Request-Data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Mask Sensitive Request Data&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ResourceURL&amp;gt;&lt;/span&gt;jsc://mask-sensitive-data.js&lt;span class="nt"&gt;&amp;lt;/ResourceURL&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Javascript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pwd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pass&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;social&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;refresh_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;localPart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; 
                &lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskedLocal&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;XXX-XX-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;lowerKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Check for specific masking patterns&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Check if it's a sensitive field&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sensitiveFields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskHeaders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-auth-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headerValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request.header.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headerValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;headerValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.request.header.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskQueryParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;paramName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;paramValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request.queryparam.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;paramName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paramValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paramName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;paramValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.request.queryparam.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;paramName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskJsonFields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.api_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.refresh_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.client_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fieldValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fieldValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;req.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fieldValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskRequestPayload&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;requestPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request.content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestPayload&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request.header.content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request.header.content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestPayload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.request.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maskedPayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.request.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;requestPayload&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.request.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error parsing request payload: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Execute masking&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;maskHeaders&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;maskQueryParams&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;maskJsonFields&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;maskRequestPayload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.request.status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.request.timestamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.request.status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.request.error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build Request Log Payload Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Build-Request-Log-Payload"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Build Request Log Payload&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignTo&lt;/span&gt; &lt;span class="na"&gt;createNew=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;transport=&lt;/span&gt;&lt;span class="s"&gt;"http"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"request"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;logRequest&lt;span class="nt"&gt;&amp;lt;/AssignTo&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;log.event.type&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;api_request&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;log.timestamp&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;{system.timestamp}&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;log.correlation.id&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Payload&lt;/span&gt; &lt;span class="na"&gt;contentType=&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="na"&gt;variablePrefix=&lt;/span&gt;&lt;span class="s"&gt;"@"&lt;/span&gt; &lt;span class="na"&gt;variableSuffix=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
{
  "eventType": "api_request",
  "timestamp": "@system.timestamp#",
  "correlationId": "@messageid#",
  "environment": "@environment.name#",
  "organization": "@organization.name#",
  "apiProxy": "@apiproxy.name#",
  "apiProxyRevision": "@apiproxy.revision#",
  "request": {
    "method": "@request.verb#",
    "uri": "@request.uri#",
    "path": "@request.path#",
    "queryString": "@request.querystring#",
    "protocol": "@request.scheme#",
    "headers": {
      "contentType": "@masked.request.header.content-type#",
      "userAgent": "@request.header.user-agent#",
      "authorization": "@masked.request.header.authorization#",
      "xApiKey": "@masked.request.header.x-api-key#",
      "host": "@request.header.host#",
      "accept": "@request.header.accept#",
      "acceptEncoding": "@request.header.accept-encoding#"
    },
    "queryParams": {
      "username": "@masked.request.queryparam.username#",
      "password": "@masked.request.queryparam.password#",
      "token": "@masked.request.queryparam.token#",
      "apiKey": "@masked.request.queryparam.api_key#"
    },
    "pathParams": {
      "version": "@version#",
      "userId": "@user_id#"
    },
    "payload": @masked.request.payload#,
    "size": "@request.header.content-length#"
  },
  "client": {
    "ip": "@client.ip#",
    "host": "@client.host#",
    "port": "@client.port#",
    "userAgent": "@request.header.user-agent#"
  },
  "security": {
    "authenticated": "@is.authenticated#",
    "userId": "@user.id#",
    "clientId": "@client_id#",
    "scopes": "@oauth.scope#"
  },
  "flow": {
    "name": "logger-shared-flow",
    "step": "request-logging",
    "executionTime": "@flow.execution.time#"
  },
  "masking": {
    "status": "@masking.request.status#",
    "timestamp": "@masking.request.timestamp#",
    "fieldsCount": "@masking.fields.count#"
  },
  "metadata": {
    "source": "apigee-gateway",
    "version": "1.0",
    "logLevel": "INFO",
    "component": "request-logger"
  }
}
    &lt;span class="nt"&gt;&amp;lt;/Payload&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send Request Log to ELK Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ServiceCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Send-Request-Log-ELK"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Send Request Log to ELK&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Request&lt;/span&gt; &lt;span class="na"&gt;clearPayload=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;variable=&lt;/span&gt;&lt;span class="s"&gt;"logRequest"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bearer {elk.auth.token}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Correlation-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;elkRequestResponse&lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Properties&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keepalive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"connect.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;5000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"io.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;30000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;{elk.endpoint.url}/{elk.index.name}/_doc&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/HTTPTargetConnection&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ServiceCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send Request Log to Spark Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ServiceCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Send-Request-Log-Spark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Send Request Log to Spark&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Request&lt;/span&gt; &lt;span class="na"&gt;clearPayload=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;variable=&lt;/span&gt;&lt;span class="s"&gt;"logRequest"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Basic {spark.auth.credentials}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Correlation-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Spark-Topic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{spark.topic.name}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;sparkRequestResponse&lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Properties&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keepalive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"connect.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"io.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;15000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;{spark.endpoint.url}/api/v1/logs/stream&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/HTTPTargetConnection&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ServiceCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extract Response Data Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ExtractVariables&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Extract-Response-Data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Extract Response Data&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Response Headers --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{response.header.content-type}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{response.header.authorization}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Set-Cookie"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{response.header.set-cookie}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Auth-Token"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{response.header.x-auth-token}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- JSON Path Extraction for Response Body --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;JSONPayload&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.access_token"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.access_token&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.refresh_token"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.refresh_token&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.api_key"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.api_key&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.client_secret"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.client_secret&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.password"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.password&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.username"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.username&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.email&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.phone"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.phone&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.ssn"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.ssn&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.credit_card"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.credit_card&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.session_id"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.session_id&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.user_id"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.user_id&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.status"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.status&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.message"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.message&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.error_code"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.error.code&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.error_message"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.error.message&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.expires_in"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"integer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.expires_in&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"resp.token_type"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.token_type&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/JSONPayload&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Source&amp;gt;&lt;/span&gt;response&lt;span class="nt"&gt;&amp;lt;/Source&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ExtractVariables&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mask Sensitive Response Data Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Javascript&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Mask-Sensitive-Response-Data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Mask Sensitive Response Data&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ResourceURL&amp;gt;&lt;/span&gt;jsc://mask-sensitive-response-data.js&lt;span class="nt"&gt;&amp;lt;/ResourceURL&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Javascript&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Reuse the masking functions from request masking&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pwd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pass&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;social&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;refresh_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;session_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sessionid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cookie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;localPart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; 
                &lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskedLocal&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;XXX-XX-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;session&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;lowerKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Check for specific masking patterns&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskingPatterns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Check if it's a sensitive field&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;sensitiveFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowerKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sensitiveFields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskResponseHeaders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;set-cookie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-auth-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;headerValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response.header.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headerValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;headerValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.response.header.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;headerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskResponseJsonFields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.refresh_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.api_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.client_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.phone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.ssn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.credit_card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.session_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jsonFields&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fieldValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fieldValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resp.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fieldValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maskedValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskResponsePayload&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;responsePayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response.content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responsePayload&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response.header.content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response.header.content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;responsePayload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.response.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maskedPayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.response.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;responsePayload&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masked.response.payload&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error parsing response payload: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maskedObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskObjectRecursively&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;maskSensitiveValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;maskedObj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Execute masking&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;maskResponseHeaders&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;maskResponseJsonFields&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;maskResponsePayload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.response.status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.response.timestamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.response.status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;masking.response.error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build Response Log Payload Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Build-Response-Log-Payload"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Build Response Log Payload&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignTo&lt;/span&gt; &lt;span class="na"&gt;createNew=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;transport=&lt;/span&gt;&lt;span class="s"&gt;"http"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"request"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;logResponse&lt;span class="nt"&gt;&amp;lt;/AssignTo&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt;log.response.event.type&lt;span class="nt"&gt;&amp;lt;/n&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;api_response&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt;log.response.timestamp&lt;span class="nt"&gt;&amp;lt;/n&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;{system.timestamp}&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;AssignVariable&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;n&amp;gt;&lt;/span&gt;log.response.latency&lt;span class="nt"&gt;&amp;lt;/n&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Value&amp;gt;&lt;/span&gt;{client.received.end.timestamp - client.received.start.timestamp}&lt;span class="nt"&gt;&amp;lt;/Value&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/AssignVariable&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Payload&lt;/span&gt; &lt;span class="na"&gt;contentType=&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt; &lt;span class="na"&gt;variablePrefix=&lt;/span&gt;&lt;span class="s"&gt;"@"&lt;/span&gt; &lt;span class="na"&gt;variableSuffix=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
{
  "eventType": "api_response",
  "timestamp": "@system.timestamp#",
  "correlationId": "@messageid#",
  "environment": "@environment.name#",
  "organization": "@organization.name#",
  "apiProxy": "@apiproxy.name#",
  "apiProxyRevision": "@apiproxy.revision#",
  "response": {
    "statusCode": @response.status.code#,
    "statusMessage": "@response.reason.phrase#",
    "headers": {
      "contentType": "@response.header.content-type#",
      "contentLength": "@response.header.content-length#",
      "server": "@response.header.server#",
      "cacheControl": "@response.header.cache-control#",
      "authorization": "@masked.response.header.authorization#",
      "setCookie": "@masked.response.header.set-cookie#",
      "xAuthToken": "@masked.response.header.x-auth-token#"
    },
    "payload": @masked.response.payload#,
    "size": "@response.header.content-length#"
  },
  "performance": {
    "totalLatency": "@client.received.end.timestamp - client.received.start.timestamp#",
    "targetLatency": "@target.received.end.timestamp - target.sent.start.timestamp#",
    "requestProcessingTime": "@request.processing.time#",
    "responseProcessingTime": "@response.processing.time#"
  },
  "backend": {
    "url": "@target.url#",
    "host": "@target.host#",
    "port": "@target.port#",
    "ssl": "@target.ssl#",
    "statusCode": "@target.response.status.code#"
  },
  "client": {
    "ip": "@client.ip#",
    "host": "@client.host#",
    "port": "@client.port#"
  },
  "security": {
    "authenticated": "@is.authenticated#",
    "userId": "@user.id#",
    "clientId": "@client_id#",
    "scopes": "@oauth.scope#"
  },
  "flow": {
    "name": "logger-shared-flow",
    "step": "response-logging",
    "executionTime": "@flow.execution.time#"
  },
  "masking": {
    "status": "@masking.response.status#",
    "timestamp": "@masking.response.timestamp#",
    "fieldsCount": "@masking.fields.count#"
  },
  "error": {
    "isError": @is.error#,
    "code": "@error.code#",
    "message": "@error.message#",
    "source": "@error.source#"
  },
  "analytics": {
    "apiProduct": "@apiproduct.name#",
    "developer": "@developer.email#",
    "app": "@client_id#"
  },
  "metadata": {
    "source": "apigee-gateway",
    "version": "1.0",
    "logLevel": "INFO",
    "component": "response-logger"
  }
}
    &lt;span class="nt"&gt;&amp;lt;/Payload&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send Response Log to ELK Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ServiceCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Send-Response-Log-ELK"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Send Response Log to ELK&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Request&lt;/span&gt; &lt;span class="na"&gt;clearPayload=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;variable=&lt;/span&gt;&lt;span class="s"&gt;"logResponse"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Bearer {elk.auth.token}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Correlation-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-ELK-Index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{elk.index.name}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;elkResponseResponse&lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Properties&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keepalive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"connect.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;5000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"io.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;30000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"retry.count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;2&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"retry.interval"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;{elk.endpoint.url}/{elk.index.name}/_doc&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/HTTPTargetConnection&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ServiceCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send Response Log to Spark Policy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ServiceCallout&lt;/span&gt; &lt;span class="na"&gt;async=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;continueOnError=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;enabled=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Send-Response-Log-Spark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Send Response Log to Spark&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Properties/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Request&lt;/span&gt; &lt;span class="na"&gt;clearPayload=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;variable=&lt;/span&gt;&lt;span class="s"&gt;"logResponse"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Basic {spark.auth.credentials}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Correlation-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Spark-Topic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{spark.topic.name}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Spark-Partition"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{spark.partition.key}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;Response&amp;gt;&lt;/span&gt;sparkResponseResponse&lt;span class="nt"&gt;&amp;lt;/Response&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Properties&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keepalive"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"connect.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"io.timeout.millis"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;15000&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"retry.count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Property&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"retry.interval"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;500&lt;span class="nt"&gt;&amp;lt;/Property&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;{spark.endpoint.url}/api/v1/logs/stream&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/HTTPTargetConnection&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ServiceCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration Files and Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- KVM Configuration for Environment Variables --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Create KVM entries for the following variables: --&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- ELK Configuration --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;KVM&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"logger-config"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"elk.logging.enabled"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"elk.endpoint.url"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;https://your-elasticsearch-cluster.com:9200&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"elk.index.name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;apigee-logs-{YYYY.MM.DD}&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"elk.auth.token"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;your-elk-bearer-token&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Spark Configuration --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"spark.logging.enabled"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"spark.endpoint.url"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;https://your-spark-cluster.com&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"spark.topic.name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;apigee-api-logs&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"spark.partition.key"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;default&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"spark.auth.credentials"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;base64-encoded-credentials&lt;span class="nt"&gt;&amp;lt;/Entry&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/KVM&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Shared Flow Deployment Descriptor --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlowBundle&lt;/span&gt; &lt;span class="na"&gt;revision=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"logger-shared-flow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ConfigurationVersion&lt;/span&gt; &lt;span class="na"&gt;majorVersion=&lt;/span&gt;&lt;span class="s"&gt;"4"&lt;/span&gt; &lt;span class="na"&gt;minorVersion=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;CreatedAt&amp;gt;&lt;/span&gt;2025-01-01T00:00:00.000Z&lt;span class="nt"&gt;&amp;lt;/CreatedAt&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;CreatedBy&amp;gt;&lt;/span&gt;api-developer@company.com&lt;span class="nt"&gt;&amp;lt;/CreatedBy&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Description&amp;gt;&lt;/span&gt;ELK Spark Logger Shared Flow with Data Masking&lt;span class="nt"&gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DisplayName&amp;gt;&lt;/span&gt;Logger Shared Flow&lt;span class="nt"&gt;&amp;lt;/DisplayName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LastModifiedAt&amp;gt;&lt;/span&gt;2025-01-01T00:00:00.000Z&lt;span class="nt"&gt;&amp;lt;/LastModifiedAt&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LastModifiedBy&amp;gt;&lt;/span&gt;api-developer@company.com&lt;span class="nt"&gt;&amp;lt;/LastModifiedBy&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ManifestVersion&lt;/span&gt; &lt;span class="na"&gt;majorVersion=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;minorVersion=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Policies&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Extract-Request-Data&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Mask-Sensitive-Request-Data&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Build-Request-Log-Payload&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Send-Request-Log-ELK&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Send-Request-Log-Spark&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Extract-Response-Data&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Mask-Sensitive-Response-Data&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Build-Response-Log-Payload&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Send-Response-Log-ELK&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Send-Response-Log-Spark&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Policies&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Resources&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Resource&amp;gt;&lt;/span&gt;jsc://mask-sensitive-data.js&lt;span class="nt"&gt;&amp;lt;/Resource&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Resource&amp;gt;&lt;/span&gt;jsc://mask-sensitive-response-data.js&lt;span class="nt"&gt;&amp;lt;/Resource&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Resources&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlowBundle&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- How to use this shared flow in your API Proxy --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- 
1. Deploy the shared flow to your Apigee environment
2. Add FlowCallout policies in your API proxy to call the shared flow

Example FlowCallout for Request logging:
&amp;lt;FlowCallout async="false" continueOnError="true" enabled="true" name="Log-Request"&amp;gt;
    &amp;lt;DisplayName&amp;gt;Log Request&amp;lt;/DisplayName&amp;gt;
    &amp;lt;SharedFlowBundle&amp;gt;logger-shared-flow&amp;lt;/SharedFlowBundle&amp;gt;
&amp;lt;/FlowCallout&amp;gt;

Add this in the PreFlow Request section of your API proxy.

Example FlowCallout for Response logging:
&amp;lt;FlowCallout async="false" continueOnError="true" enabled="true" name="Log-Response"&amp;gt;
    &amp;lt;DisplayName&amp;gt;Log Response&amp;lt;/DisplayName&amp;gt;
    &amp;lt;SharedFlowBundle&amp;gt;logger-shared-flow&amp;lt;/SharedFlowBundle&amp;gt;
&amp;lt;/FlowCallout&amp;gt;

Add this in the PostFlow Response section of your API proxy.
--&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Environment-specific configuration --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- 
For different environments (dev, test, prod), create separate KVM entries:

DEV Environment:
- elk.endpoint.url: https://dev-elasticsearch.company.com:9200
- spark.endpoint.url: https://dev-spark.company.com

TEST Environment:
- elk.endpoint.url: https://test-elasticsearch.company.com:9200
- spark.endpoint.url: https://test-spark.company.com

PROD Environment:
- elk.endpoint.url: https://prod-elasticsearch.company.com:9200
- spark.endpoint.url: https://prod-spark.company.com
--&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>apigee</category>
      <category>apigeelog</category>
      <category>api</category>
      <category>apigateway</category>
    </item>
    <item>
      <title>Essential Apigee Shared Flows and Policies</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Mon, 08 Sep 2025 19:58:06 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/essential-apigee-shared-flows-and-policies-9f9</link>
      <guid>https://dev.to/mahmoudsayed96/essential-apigee-shared-flows-and-policies-9f9</guid>
      <description>&lt;h1&gt;
  
  
  Essential Apigee Shared Flows and Policies
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Core Shared Flows You Should Build
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Security Enforcement Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Centralized security validation including API key validation, OAuth token verification, and IP restrictions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Security-Enforcement-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Security-Enforcement-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;IP-Whitelist-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;API-Key-Validation&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;OAuth-Token-Validation&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.header.authorization != null&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Rate-Limiting-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Quota-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;IP Whitelist Policy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- IP-Whitelist-Policy.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AccessControl&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"IP-Whitelist-Policy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;IPRules&lt;/span&gt; &lt;span class="na"&gt;noRuleMatchAction=&lt;/span&gt;&lt;span class="s"&gt;"DENY"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;MatchRule&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"ALLOW"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;SourceAddress&lt;/span&gt; &lt;span class="na"&gt;mask=&lt;/span&gt;&lt;span class="s"&gt;"24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;192.168.1.0&lt;span class="nt"&gt;&amp;lt;/SourceAddress&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/MatchRule&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;MatchRule&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"ALLOW"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;SourceAddress&lt;/span&gt; &lt;span class="na"&gt;mask=&lt;/span&gt;&lt;span class="s"&gt;"16"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;10.0.0.0&lt;span class="nt"&gt;&amp;lt;/SourceAddress&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/MatchRule&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/IPRules&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AccessControl&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;API Key Validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- API-Key-Validation.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;VerifyAPIKey&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"API-Key-Validation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;APIKey&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"request.queryparam.apikey"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VerifyAPIKey&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OAuth Token Validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- OAuth-Token-Validation.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;OAuthV2&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"OAuth-Token-Validation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Operation&amp;gt;&lt;/span&gt;VerifyAccessToken&lt;span class="nt"&gt;&amp;lt;/Operation&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;AccessToken&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"request.header.authorization"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OAuthV2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Request Validation Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Validate request headers, parameters, and payload structure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Request-Validation-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Request-Validation-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Content-Type-Validation&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Request-Size-Check&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;JSON-Schema-Validation&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.header.content-type = "application/json"&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Required-Headers-Check&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Request-Sanitization&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Content Type Validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Content-Type-Validation.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;RaiseFault&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type-Validation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.header.content-type != "application/json" AND request.verb != "GET"&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;FaultResponse&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;StatusCode&amp;gt;&lt;/span&gt;400&lt;span class="nt"&gt;&amp;lt;/StatusCode&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ReasonPhrase&amp;gt;&lt;/span&gt;Bad Request&lt;span class="nt"&gt;&amp;lt;/ReasonPhrase&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Payload&lt;/span&gt; &lt;span class="na"&gt;contentType=&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        {
          "error": {
            "code": "INVALID_CONTENT_TYPE",
            "message": "Content-Type must be application/json"
          }
        }
      &lt;span class="nt"&gt;&amp;lt;/Payload&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/FaultResponse&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/RaiseFault&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request Size Check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Request-Size-Check.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;RaiseFault&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Request-Size-Check"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.header.content-length &amp;gt; 1048576&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;FaultResponse&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;StatusCode&amp;gt;&lt;/span&gt;413&lt;span class="nt"&gt;&amp;lt;/StatusCode&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ReasonPhrase&amp;gt;&lt;/span&gt;Payload Too Large&lt;span class="nt"&gt;&amp;lt;/ReasonPhrase&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Payload&lt;/span&gt; &lt;span class="na"&gt;contentType=&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        {
          "error": {
            "code": "PAYLOAD_TOO_LARGE",
            "message": "Request payload exceeds 1MB limit"
          }
        }
      &lt;span class="nt"&gt;&amp;lt;/Payload&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/FaultResponse&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/RaiseFault&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JSON Schema Validation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- JSON-Schema-Validation.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;JSONThreatProtection&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"JSON-Schema-Validation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ArrayElementCount&amp;gt;&lt;/span&gt;100&lt;span class="nt"&gt;&amp;lt;/ArrayElementCount&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ContainerDepth&amp;gt;&lt;/span&gt;10&lt;span class="nt"&gt;&amp;lt;/ContainerDepth&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ObjectEntryCount&amp;gt;&lt;/span&gt;50&lt;span class="nt"&gt;&amp;lt;/ObjectEntryCount&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ObjectEntryNameLength&amp;gt;&lt;/span&gt;100&lt;span class="nt"&gt;&amp;lt;/ObjectEntryNameLength&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StringValueLength&amp;gt;&lt;/span&gt;500&lt;span class="nt"&gt;&amp;lt;/StringValueLength&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/JSONThreatProtection&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Error Handling Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Standardize error responses across all APIs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Error-Handling-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Error-Handling-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Extract-Error-Details&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Log-Error&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Format-Error-Response&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Set-CORS-Headers&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Extract Error Details:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Extract-Error-Details.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ExtractVariables&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Extract-Error-Details"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Source&amp;gt;&lt;/span&gt;message&lt;span class="nt"&gt;&amp;lt;/Source&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;VariablePrefix&amp;gt;&lt;/span&gt;error&lt;span class="nt"&gt;&amp;lt;/VariablePrefix&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;JSONPayload&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"code"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.fault.detail.errorcode&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;JSONPath&amp;gt;&lt;/span&gt;$.fault.faultstring&lt;span class="nt"&gt;&amp;lt;/JSONPath&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/JSONPayload&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ExtractVariables&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Log Error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Log-Error.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;MessageLogging&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Log-Error"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Syslog&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Message&amp;gt;&lt;/span&gt;API Error - Code: {error.code}, Message: {error.message}, API: {apiproxy.name}, Client: {client_ip}&lt;span class="nt"&gt;&amp;lt;/Message&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Host&amp;gt;&lt;/span&gt;logs.company.com&lt;span class="nt"&gt;&amp;lt;/Host&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Port&amp;gt;&lt;/span&gt;514&lt;span class="nt"&gt;&amp;lt;/Port&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Protocol&amp;gt;&lt;/span&gt;TCP&lt;span class="nt"&gt;&amp;lt;/Protocol&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Syslog&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/MessageLogging&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Format Error Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Format-Error-Response.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Format-Error-Response"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;application/json&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Payload&lt;/span&gt; &lt;span class="na"&gt;contentType=&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {
        "error": {
          "code": "{error.code}",
          "message": "{error.message}",
          "timestamp": "{system.timestamp}",
          "path": "{request.uri}",
          "requestId": "{messageid}"
        }
      }
    &lt;span class="nt"&gt;&amp;lt;/Payload&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Response Enhancement Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Add consistent response headers, CORS support, and response transformation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Response-Enhancement-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Response-Enhancement-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Add-Response-Headers&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;CORS-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Remove-Sensitive-Headers&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Response-Cache-Control&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Add Response Headers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Add-Response-Headers.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Add-Response-Headers"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-API-Version"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{apiproxy.revision}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Request-ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{messageid}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Response-Time"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{client.received.end.timestamp - client.received.start.timestamp}ms&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Rate-Limit-Remaining"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{ratelimit.Quota-Policy.remaining.count}&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CORS Policy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- CORS-Policy.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"CORS-Policy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Headers&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Access-Control-Allow-Origin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;*&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Access-Control-Allow-Methods"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;GET, POST, PUT, DELETE, OPTIONS&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Access-Control-Allow-Headers"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content-Type, Authorization, X-API-Key&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Access-Control-Max-Age"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3628800&lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Headers&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/IgnoreUnresolvedVariables&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Logging and Analytics Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Centralized logging for monitoring, debugging, and analytics.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Logging-Analytics-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Logging-Analytics-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Extract-Request-Data&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Log-Request-Response&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Custom-Analytics&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Performance-Metrics&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Extract Request Data:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Extract-Request-Data.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ExtractVariables&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Extract-Request-Data"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Source&amp;gt;&lt;/span&gt;request&lt;span class="nt"&gt;&amp;lt;/Source&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"user-agent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{user_agent}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Header&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"x-forwarded-for"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{client_ip}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;QueryParam&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"version"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Pattern&lt;/span&gt; &lt;span class="na"&gt;ignoreCase=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{api_version}&lt;span class="nt"&gt;&amp;lt;/Pattern&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/QueryParam&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ExtractVariables&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Log Request Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Log-Request-Response.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;MessageLogging&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Log-Request-Response"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Syslog&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Message&amp;gt;&lt;/span&gt;
      {
        "timestamp": "{system.timestamp}",
        "apiproxy": "{apiproxy.name}",
        "method": "{request.verb}",
        "uri": "{request.uri}",
        "client_ip": "{client_ip}",
        "user_agent": "{user_agent}",
        "response_code": "{response.status.code}",
        "response_time": "{client.received.end.timestamp - client.received.start.timestamp}",
        "request_id": "{messageid}"
      }
    &lt;span class="nt"&gt;&amp;lt;/Message&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Host&amp;gt;&lt;/span&gt;logs.company.com&lt;span class="nt"&gt;&amp;lt;/Host&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Port&amp;gt;&lt;/span&gt;514&lt;span class="nt"&gt;&amp;lt;/Port&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Protocol&amp;gt;&lt;/span&gt;TCP&lt;span class="nt"&gt;&amp;lt;/Protocol&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Syslog&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/MessageLogging&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Traffic Management Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Handle rate limiting, quotas, and traffic shaping.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Traffic-Management-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Traffic-Management-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Spike-Arrest&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Rate-Limit-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Quota-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Concurrent-Rate-Limit&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Policies:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Spike Arrest:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Spike-Arrest.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SpikeArrest&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Spike-Arrest"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Rate&amp;gt;&lt;/span&gt;100pm&lt;span class="nt"&gt;&amp;lt;/Rate&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Identifier&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"client_ip"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SpikeArrest&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rate Limit Policy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Rate-Limit-Policy.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Quota&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Rate-Limit-Policy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Allow&lt;/span&gt; &lt;span class="na"&gt;count=&lt;/span&gt;&lt;span class="s"&gt;"1000"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Interval&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/Interval&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TimeUnit&amp;gt;&lt;/span&gt;hour&lt;span class="nt"&gt;&amp;lt;/TimeUnit&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Identifier&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"verifyapikey.API-Key-Validation.client_id"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Quota&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Advanced Shared Flows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7. Circuit Breaker Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Implement circuit breaker pattern for backend service resilience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Circuit-Breaker-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Circuit-Breaker-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Check-Circuit-State&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Record-Success&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;response.status.code &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; 400&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Record-Failure&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;response.status.code &amp;gt;= 500&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Update-Circuit-State&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Request Transformation Shared Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Handle common request/response transformations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Request-Transformation-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Request-Transformation-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;JSON-to-XML&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;request.header.accept = "application/xml"&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Add-Default-Parameters&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Normalize-Headers&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How to Build and Deploy Shared Flows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create Shared Flow Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create directory structure&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;shared-flows/Security-Enforcement-SF
&lt;span class="nb"&gt;cd &lt;/span&gt;shared-flows/Security-Enforcement-SF

&lt;span class="c"&gt;# Create required directories&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;policies
&lt;span class="nb"&gt;mkdir &lt;/span&gt;sharedflowbundle
&lt;span class="nb"&gt;mkdir &lt;/span&gt;sharedflowbundle/policies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create Shared Flow Bundle
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- sharedflowbundle/Security-Enforcement-SF.xml --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SharedFlowBundle&lt;/span&gt; &lt;span class="na"&gt;revision=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Security-Enforcement-SF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Description&amp;gt;&lt;/span&gt;Centralized security enforcement&lt;span class="nt"&gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SharedFlows&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;SharedFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;API-Key-Validation&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Rate-Limiting-Policy&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/SharedFlow&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/SharedFlows&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Policies&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;API-Key-Validation&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Policy&amp;gt;&lt;/span&gt;Rate-Limiting-Policy&lt;span class="nt"&gt;&amp;lt;/Policy&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Policies&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SharedFlowBundle&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Using Apigee CLI (Recommended)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Apigee CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apigeecli

&lt;span class="c"&gt;# Authenticate&lt;/span&gt;
apigeecli token gen &lt;span class="nt"&gt;-a&lt;/span&gt;

&lt;span class="c"&gt;# Deploy shared flow&lt;/span&gt;
apigeecli sharedflows create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; Security-Enforcement-SF &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; ./sharedflowbundle &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; your-org

&lt;span class="c"&gt;# Deploy to environment&lt;/span&gt;
apigeecli sharedflows deploy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; Security-Enforcement-SF &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; your-org &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Using in API Proxy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- In your API Proxy flow --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Flow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PreFlow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Request&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Security-Flow-Callout&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Request&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Flow&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Flow Callout Policy --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;FlowCallout&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Security-Flow-Callout"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SharedFlowBundle&amp;gt;&lt;/span&gt;Security-Enforcement-SF&lt;span class="nt"&gt;&amp;lt;/SharedFlowBundle&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/FlowCallout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices for Shared Flows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Design Principles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single Responsibility:&lt;/strong&gt; Each shared flow should have one clear purpose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameterization:&lt;/strong&gt; Use flow variables for configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling:&lt;/strong&gt; Always include proper error handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; Maintain clear documentation for each shared flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Variable Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Use consistent variable naming --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Set-Shared-Flow-Variables"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"sf.security.enabled"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"sf.ratelimit.count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1000&lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"sf.ratelimit.timeunit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;hour&lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Conditional Execution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Make shared flows conditional --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Step&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;Security-Enforcement&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Condition&amp;gt;&lt;/span&gt;sf.security.enabled = true&lt;span class="nt"&gt;&amp;lt;/Condition&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Step&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Version Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use semantic versioning (v1.0.0, v1.1.0)&lt;/li&gt;
&lt;li&gt;Maintain backward compatibility&lt;/li&gt;
&lt;li&gt;Document breaking changes&lt;/li&gt;
&lt;li&gt;Use environment-specific configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Testing Strategy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example test for shared flow&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Security-Enforcement-SF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should validate API key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Test API key validation&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should enforce rate limits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Test rate limiting&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Deployment Pipeline Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CI/CD Pipeline (GitHub Actions)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/deploy-shared-flows.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy Shared Flows&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;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shared-flows/**'&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;deploy&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@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&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@v2&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;16'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Apigee CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g apigeecli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy to Test&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;|&lt;/span&gt;
          &lt;span class="s"&gt;apigeecli sharedflows create -o ${{ secrets.APIGEE_ORG }} -n Security-Enforcement-SF -p ./shared-flows/Security-Enforcement-SF&lt;/span&gt;
          &lt;span class="s"&gt;apigeecli sharedflows deploy -o ${{ secrets.APIGEE_ORG }} -e test -n Security-Enforcement-SF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monitoring and Maintenance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Health Checks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monitor shared flow usage across proxies&lt;/li&gt;
&lt;li&gt;Track error rates and performance impact&lt;/li&gt;
&lt;li&gt;Set up alerts for shared flow failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Performance Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Add performance tracking --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Track-Shared-Flow-Performance"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"sf.start.time"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{system.timestamp}&lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- At the end of shared flow --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;AssignMessage&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Calculate-SF-Performance"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Set&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Variable&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"sf.execution.time"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{system.timestamp - sf.start.time}&lt;span class="nt"&gt;&amp;lt;/Variable&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Set&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/AssignMessage&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Documentation Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Shared Flow: Security-Enforcement-SF&lt;/span&gt;

&lt;span class="gu"&gt;## Purpose&lt;/span&gt;
Centralized security validation for all API proxies.

&lt;span class="gu"&gt;## Features&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; API key validation
&lt;span class="p"&gt;-&lt;/span&gt; OAuth token verification
&lt;span class="p"&gt;-&lt;/span&gt; Rate limiting
&lt;span class="p"&gt;-&lt;/span&gt; IP whitelisting

&lt;span class="gu"&gt;## Usage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
xml&lt;br&gt;
&lt;br&gt;
  Security-Enforcement-SF&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Configuration Variables
- `sf.security.enabled`: Enable/disable security checks
- `sf.ratelimit.count`: Rate limit threshold

## Dependencies
- OAuth provider configuration
- API product configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These shared flows will significantly accelerate your API development and ensure consistency across your API ecosystem. Start with the core flows (Security, Error Handling, Logging) and gradually build more specialized ones based on your specific needs.&lt;/p&gt;

</description>
      <category>apigee</category>
      <category>sharedflows</category>
      <category>api</category>
      <category>apigateway</category>
    </item>
    <item>
      <title>Apigee API Product Design</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Sun, 07 Sep 2025 14:27:19 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/apigee-api-product-design-4pnd</link>
      <guid>https://dev.to/mahmoudsayed96/apigee-api-product-design-4pnd</guid>
      <description>&lt;p&gt;API Product Design in Apigee is a crucial strategic step that goes far beyond just bundling proxies. It's about &lt;strong&gt;designing a product line&lt;/strong&gt; for your APIs, focusing on the consumer's needs, business value, and monetization.&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the key aspects, considerations, and examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is API Product Design?
&lt;/h3&gt;

&lt;p&gt;It's the process of defining how your API capabilities are packaged, priced, presented, and governed for different audiences. It answers questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Who is this product for?&lt;/li&gt;
&lt;li&gt;  What capabilities do they get?&lt;/li&gt;
&lt;li&gt;  How much does it cost?&lt;/li&gt;
&lt;li&gt;  What are the usage limits?&lt;/li&gt;
&lt;li&gt;  How is it differentiated from other products?&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Key Dimensions of API Product Design
&lt;/h3&gt;

&lt;p&gt;You can think of designing an API product across four main dimensions:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Functional Scope (The "What")
&lt;/h4&gt;

&lt;p&gt;This defines the actual API resources (proxies, endpoints, and operations) included in the product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;By Capability:&lt;/strong&gt; Grouping related functionality.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;Example:&lt;/em&gt; A &lt;code&gt;Weather-Data-Product&lt;/code&gt; includes &lt;code&gt;/forecast&lt;/code&gt;, &lt;code&gt;/current&lt;/code&gt;, and &lt;code&gt;/alerts&lt;/code&gt; endpoints.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;By Data Source:&lt;/strong&gt; Grouping access to different datasets.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;Example:&lt;/em&gt; A &lt;code&gt;Financial-Data-Product&lt;/code&gt; includes &lt;code&gt;stock-prices&lt;/code&gt;, &lt;code&gt;forex-rates&lt;/code&gt;, and &lt;code&gt;crypto-feed&lt;/code&gt; proxies.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;By Granularity:&lt;/strong&gt; Offering different levels of data detail.

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;Example:&lt;/em&gt; A &lt;code&gt;User-Data-Basic&lt;/code&gt; product returns standard user fields, while a &lt;code&gt;User-Data-Premium&lt;/code&gt; product includes sensitive data like email and phone number (with proper security!).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Design Choice:&lt;/strong&gt; Do we create one giant product with everything, or many small, focused products? (Hint: Usually, many small products are better for targeting different audiences).&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Audience &amp;amp; Access (The "Who")
&lt;/h4&gt;

&lt;p&gt;This defines who can see and use the product. Apigee manages this through &lt;strong&gt;API Product visibility and API Key verification.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Public:&lt;/strong&gt; Anyone on the developer portal can see and request it. (e.g., &lt;code&gt;Free-Tier&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Private:&lt;/strong&gt; Only visible to specific individuals, groups, or teams. You must explicitly invite a developer. (e.g., &lt;code&gt;Partner-Access&lt;/code&gt;, &lt;code&gt;Internal-Apps&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Internal:&lt;/strong&gt; A product not on the portal at all, only accessible by directly creating an App and Key in the Apigee admin UI. Used for internal service-to-service communication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Design Choice:&lt;/strong&gt; Is this product for external third-party developers, specific partners, or our own internal mobile apps?&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Commercial &amp;amp; Usage Model (The "How Much")
&lt;/h4&gt;

&lt;p&gt;This is where you define the business model and operational limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Quotas &amp;amp; Rate Limits:&lt;/strong&gt; The most common way to differentiate tiers.

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Free Tier:&lt;/strong&gt; &lt;code&gt;100 requests/day&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Bronze Tier:&lt;/strong&gt; &lt;code&gt;1,000 requests/day&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Silver Tier:&lt;/strong&gt; &lt;code&gt;10,000 requests/day&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gold Tier:&lt;/strong&gt; &lt;code&gt;100,000 requests/day&lt;/code&gt; + &lt;code&gt;10 requests/second&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Monetization:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Freemium:&lt;/strong&gt; Free tier with paid upgrades (very common).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pay-as-you-go:&lt;/strong&gt; Price per X number of API calls.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tiered Subscription:&lt;/strong&gt; Fixed monthly price for a quota package.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Revenue Share:&lt;/strong&gt; For partners driving transactions via your API.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Service Level Agreement (SLA):&lt;/strong&gt; Higher-tier products can be associated with stricter SLAs (e.g., 99.95% uptime), though this is often managed operationally outside of Apigee.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Design Choice:&lt;/strong&gt; How do we make money from this? How do we prevent abuse and ensure fair use?&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Operational &amp;amp; Security Policy (The "Rules")
&lt;/h4&gt;

&lt;p&gt;This defines the policies enforced on the API product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Security:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;OAuth Scopes:&lt;/strong&gt; A premium product might require a specific scope (e.g., &lt;code&gt;scope=premium_data&lt;/code&gt;) in the OAuth token.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;IP Whitelisting:&lt;/strong&gt; A product for a trusted partner might have a policy that only allows calls from their known IP addresses.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Traffic Management:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Spike Arrest:&lt;/strong&gt; Protect your backend from traffic spikes (e.g., &lt;code&gt;15 requests per second&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Response Caching:&lt;/strong&gt; A product offering static reference data might have a cache applied to improve performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Design Choice:&lt;/strong&gt; What extra policies (beyond quotas) are needed to protect the backend for this specific audience?&lt;/p&gt;




&lt;h3&gt;
  
  
  Practical Design Examples
&lt;/h3&gt;

&lt;p&gt;Let's design a product line for a hypothetical &lt;code&gt;CompanyX&lt;/code&gt; API platform that offers Weather, News, and Currency data.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 1: The Onboarding Product&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Product Name:&lt;/strong&gt; &lt;code&gt;CompanyX-Explorer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Audience:&lt;/strong&gt; &lt;strong&gt;Public&lt;/strong&gt;. New, unverified developers trying out the APIs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Functional Scope:&lt;/strong&gt; Read-only access to basic endpoints.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;weather-api:/v1/current/{city}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;news-api:/v1/headlines&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;currency-api:/v1/convert?from=USD&amp;amp;to=EUR&lt;/code&gt; (limited)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Commercial Model:&lt;/strong&gt; &lt;strong&gt;Freemium&lt;/strong&gt;. Free, no revenue.&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Policies &amp;amp; Limits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Quota:&lt;/strong&gt; &lt;code&gt;100 requests/day&lt;/code&gt;, &lt;code&gt;5 requests/minute&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Spike Arrest:&lt;/strong&gt; &lt;code&gt;5 requests/second&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Caching:&lt;/strong&gt; None.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Purpose:&lt;/strong&gt; Remove friction for sign-ups, let developers experiment and see value.&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 2: The Targeted B2B Product&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Product Name:&lt;/strong&gt; &lt;code&gt;CompanyX-Weather-Enterprise&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Audience:&lt;/strong&gt; &lt;strong&gt;Private&lt;/strong&gt;. Specific enterprise customers who have signed a contract.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Functional Scope:&lt;/strong&gt; Full access to all weather capabilities.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;weather-api:/v1/current/{city}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;weather-api:/v1/forecast/{city}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;weather-api:/v1/historical/{city}&lt;/code&gt; (premium endpoint)&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;weather-api:/v1/alerts&lt;/code&gt; (premium endpoint)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Commercial Model:&lt;/strong&gt; &lt;strong&gt;Tiered Subscription&lt;/strong&gt;. $999/month.&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Policies &amp;amp; Limits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Quota:&lt;/strong&gt; &lt;code&gt;500,000 requests/month&lt;/code&gt;, &lt;code&gt;50 requests/second&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Spike Arrest:&lt;/strong&gt; &lt;code&gt;50 requests/second&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security:&lt;/strong&gt; May require a valid OAuth token with the &lt;code&gt;historical_data&lt;/code&gt; scope.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Purpose:&lt;/strong&gt; A high-value, revenue-generating product for serious business customers.&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 3: The Internal Product&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Product Name:&lt;/strong&gt; &lt;code&gt;internal-currency-data-consumer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Audience:&lt;/strong&gt; &lt;strong&gt;Internal&lt;/strong&gt;. The company's own mobile app team.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Functional Scope:&lt;/strong&gt; Full access to currency data for the app.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;currency-api:/v1/convert&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;currency-api:/v1/history&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Commercial Model:&lt;/strong&gt; Not applicable. Internal cost.&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Policies &amp;amp; Limits:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Quota:&lt;/strong&gt; Very high or none. Trusted internal consumer.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security:&lt;/strong&gt; Might use a simpler authentication method or be whitelisted.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Purpose:&lt;/strong&gt; Enable internal applications to consume APIs without going through the public developer portal.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Design Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Identify Personas:&lt;/strong&gt; Who are your developers? (e.g., hobbyists, startups, enterprises).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Map Capabilities to Needs:&lt;/strong&gt; What does each persona need? What are they willing to pay for?&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Bundle &amp;amp; Price:&lt;/strong&gt; Create product bundles that meet those needs and assign a commercial model.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Define Policies:&lt;/strong&gt; Add the necessary quotas, security, and traffic rules to enforce the product design.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Publish &amp;amp; Iterate:&lt;/strong&gt; Publish the products to the portal, gather feedback, and adapt your product lineup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In essence, API Product Design in Apigee is where &lt;strong&gt;business strategy&lt;/strong&gt; meets &lt;strong&gt;technical implementation&lt;/strong&gt;. It transforms your APIs from technical endpoints into valuable, marketable products.&lt;/p&gt;

</description>
      <category>apigee</category>
      <category>api</category>
      <category>apigateway</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Apigee API Products, Developer, Apps and API Keys</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Sun, 07 Sep 2025 13:57:55 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/apigee-api-products-developer-apps-and-api-keys-2paa</link>
      <guid>https://dev.to/mahmoudsayed96/apigee-api-products-developer-apps-and-api-keys-2paa</guid>
      <description>&lt;h3&gt;
  
  
  The Big Picture: The Apigee Security Model
&lt;/h3&gt;

&lt;p&gt;Apigee uses a &lt;strong&gt;API Key&lt;/strong&gt; as the primary credential for API access. This key is not created in isolation; it's the result of a relationship between a &lt;strong&gt;Developer&lt;/strong&gt;, their &lt;strong&gt;App&lt;/strong&gt;, and the &lt;strong&gt;API Products&lt;/strong&gt; that app is authorized to consume.&lt;/p&gt;

&lt;p&gt;Here’s the flow of how they work together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;You&lt;/strong&gt; (the API provider) publish an &lt;strong&gt;API Product&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; A &lt;strong&gt;Developer&lt;/strong&gt; registers in your developer portal.&lt;/li&gt;
&lt;li&gt; The Developer creates an &lt;strong&gt;App&lt;/strong&gt; and selects which API Products it needs access to.&lt;/li&gt;
&lt;li&gt; Apigee generates a unique &lt;strong&gt;API Key&lt;/strong&gt; for that App.&lt;/li&gt;
&lt;li&gt; The Developer includes this key in the requests their App makes.&lt;/li&gt;
&lt;li&gt; Apigee checks if the key is valid and if it provides access to the requested API Product.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  1. API Product
&lt;/h3&gt;

&lt;p&gt;An API Product is a &lt;strong&gt;bundle of API resources (proxies)&lt;/strong&gt; that you, as the API provider, offer to developers. It's the main &lt;strong&gt;commercial and legal unit&lt;/strong&gt; of consumption. It defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Which Proxies/Endpoints:&lt;/strong&gt; Which API proxies (and their specific paths) are included.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quotas:&lt;/strong&gt; How many requests can be made per minute, hour, day, etc.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Access Policies:&lt;/strong&gt; Who can access it (e.g., internal vs. external developers).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think of it like a **"cable TV package"&lt;/strong&gt;. You don't buy individual channels; you buy a package (e.g., "Sports Lite" or "Movie Lover Bundle").**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
You work at &lt;code&gt;CompanyX&lt;/code&gt; and have built several APIs. You create two products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;CompanyX-Free-Tier&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Proxies Included:&lt;/strong&gt; &lt;code&gt;weather-api&lt;/code&gt;, &lt;code&gt;news-api&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quota:&lt;/strong&gt; 100 calls per day, 5 calls per minute&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environments:&lt;/strong&gt; &lt;code&gt;test&lt;/code&gt; (for trying it out)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;CompanyX-Premium-Weather&lt;/code&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Proxies Included:&lt;/strong&gt; &lt;code&gt;weather-api&lt;/code&gt; (includes all endpoints, even the premium ones like historical data)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quota:&lt;/strong&gt; 10,000 calls per day, 100 calls per minute&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environments:&lt;/strong&gt; &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  2. Developer
&lt;/h3&gt;

&lt;p&gt;A Developer represents a &lt;strong&gt;user or a company&lt;/strong&gt; that consumes your APIs. They are typically registered through your developer portal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  They are the entity that owns Apps.&lt;/li&gt;
&lt;li&gt;  They have a profile with contact information (email, name).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think of them as the **"account holder"&lt;/strong&gt; for the cable TV subscription.**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Developer Name:&lt;/strong&gt; &lt;code&gt;Jane Smith&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Email:&lt;/strong&gt; &lt;code&gt;jane.smith@example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Company:&lt;/strong&gt; &lt;code&gt;Cool Mobile Apps Inc.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  3. App
&lt;/h3&gt;

&lt;p&gt;An App is a &lt;strong&gt;specific project or application&lt;/strong&gt; created by a Developer that needs to call your APIs. A single Developer can have multiple Apps (e.g., an iOS app and an Android app).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The App is the entity that is granted access to &lt;strong&gt;API Products&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  When an App is approved for an API Product, Apigee generates &lt;strong&gt;credentials (API Keys)&lt;/strong&gt; for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think of it as the **"set-top box"&lt;/strong&gt; in a specific room. The account holder (Developer) can have multiple set-top boxes (Apps), each with its own remote (API Key), all under the same subscription plan (API Products).**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Developer &lt;em&gt;Jane Smith&lt;/em&gt; creates two apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;App Name:&lt;/strong&gt; &lt;code&gt;Weather-Widget-iOS&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Purpose:&lt;/strong&gt; Her company's iOS weather application.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;App Name:&lt;/strong&gt; &lt;code&gt;Weather-Widget-Android&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Purpose:&lt;/strong&gt; Her company's Android weather application.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  4. API Key
&lt;/h3&gt;

&lt;p&gt;The API Key is a &lt;strong&gt;unique string&lt;/strong&gt; (like a password) that is generated for a specific &lt;strong&gt;App&lt;/strong&gt;. It is the secret token that must be presented in every API request to Apigee (usually in the &lt;code&gt;x-apikey&lt;/code&gt; header or as a query parameter).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Apigee validates this key to:

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Authenticate:&lt;/strong&gt; Is this a key I issued? Is it active?&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Authorize:&lt;/strong&gt; Does the App that owns this key have permission to access the specific API Product that contains the requested API proxy?&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think of it as the **"unique signal"&lt;/strong&gt; or "authorization card" for that specific set-top box (App). Without it, you can't get the channels (APIs) you subscribed to.**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  For the App &lt;code&gt;Weather-Widget-iOS&lt;/code&gt;, Apigee generates:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;API Key:&lt;/strong&gt; &lt;code&gt;Rz4uP91KQ2m5cLb3Fv6Hs8dJqA0xWnEy&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This key is configured in the app's code. Every API call includes it:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-apikey: Rz4uP91KQ2m5cLb3Fv6Hs8dJqA0xWnEy"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://companyx.apigee.net/v1/weather/forecast?city=London"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  How It All Fits Together: A Practical Example
&lt;/h3&gt;

&lt;p&gt;Let's walk through the entire lifecycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: API Provider (You) creates API Products.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You create &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt; and &lt;code&gt;CompanyX-Premium-Weather&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Developer (Jane) signs up.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Jane signs up on &lt;code&gt;dev.companyx.com&lt;/code&gt; and her account is created.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Developer (Jane) creates an App.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Jane logs in, goes to her dashboard, and clicks "New App".&lt;/li&gt;
&lt;li&gt;  She names it &lt;code&gt;Weather-Widget-iOS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  She checks the box to request access to the &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt; product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4: API Provider (You) approves the request.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  (This can also be automatic). You approve her app's access to the free tier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Apigee generates Credentials.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  In Jane's developer portal dashboard, she can now see her App &lt;code&gt;Weather-Widget-iOS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  On its details page, a new &lt;strong&gt;API Key&lt;/strong&gt; (e.g., &lt;code&gt;Rz4uP91KQ2m5cLb3Fv6Hs8dJqA0xWnEy&lt;/code&gt;) is displayed. This key is automatically approved for the &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt; product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 6: The App makes a call.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Jane's iOS developer codes the app to include the API key in all requests.&lt;/li&gt;
&lt;li&gt;  The app calls: &lt;code&gt;https://companyx.apigee.net/v1/weather/forecast?city=London&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Apigee validates the call.&lt;/strong&gt;&lt;br&gt;
When the request hits Apigee, it performs these checks almost instantly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;"Is the key &lt;code&gt;Rz4uP91KQ2m5cLb3Fv6Hs8dJqA0xWnEy&lt;/code&gt; valid and active?"&lt;/strong&gt; -&amp;gt; Yes, it belongs to the App &lt;code&gt;Weather-Widget-iOS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;"What API Products is this App approved for?"&lt;/strong&gt; -&amp;gt; &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;"Does the &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt; product include the proxy and path being called (&lt;code&gt;/v1/weather/forecast&lt;/code&gt;)?"&lt;/strong&gt; -&amp;gt; Yes, it includes the &lt;code&gt;weather-api&lt;/code&gt; proxy.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;"Has the App exceeded its quota (100/day)?"&lt;/strong&gt; -&amp;gt; No, it's only made 50 calls today.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;✅ Validation passed!&lt;/strong&gt; The request is forwarded to the backend weather service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If Jane had tried to call a premium endpoint like &lt;code&gt;/v1/weather/historical&lt;/code&gt;, step 3 would have failed because her &lt;code&gt;CompanyX-Free-Tier&lt;/code&gt; product does not include that endpoint. Apigee would block the request and return a &lt;code&gt;403 Forbidden&lt;/code&gt; error.&lt;/p&gt;

&lt;p&gt;This model provides a powerful, flexible, and auditable way to manage and monetize API access.&lt;/p&gt;

&lt;p&gt;Here are flowcharts that visualize the relationships between API Products, Developers, Apps, and API Keys in Apigee, from both the provider's and consumer's perspectives.&lt;/p&gt;
&lt;h3&gt;
  
  
  Flowchart 1: Provider's Administrative View (How Things Are Built)
&lt;/h3&gt;

&lt;p&gt;This chart shows how you, the API provider, assemble and offer an API Product.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[API Provider] --&amp;gt; B[Create API Proxies]

    subgraph Proxies [Backend Services]
        B1[weather-api]
        B2[news-api]
        B3[payment-api]
    end

    B --&amp;gt; Proxies

    Proxies --&amp;gt; C[Bundle into API Products]

    subgraph Products [API Products - The 'Packages']
        P1[Free-Tier]&amp;lt;br&amp;gt;Includes: B1, B2&amp;lt;br&amp;gt;Quota: 100/day
        P2[Premium-Weather]&amp;lt;br&amp;gt;Includes: B1 all endpoints&amp;lt;br&amp;gt;Quota: 10,000/day
    end

    C --&amp;gt; Products
    Products --&amp;gt; D[Publish to Developer Portal]
    D --&amp;gt; E[Developers Discover &amp;amp; Subscribe]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Flowchart 2: Consumer's Journey (How Access is Granted)
&lt;/h3&gt;

&lt;p&gt;This chart shows the process a developer follows to get and use an API key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[Developer] --&amp;gt; B[Signs up on Developer Portal]
    B --&amp;gt; C[Creates an 'App' e.g. Weather-Widget-iOS]
    C --&amp;gt; D[Requests access to an API Product e.g. Free-Tier]
    D --&amp;gt; E{Provider Approval&amp;lt;br&amp;gt;Auto or Manual}
    E -- Approved --&amp;gt; F
    E -- Rejected --&amp;gt; G[Access Denied]
    F[Apigee Generates Unique API Key for that App] --&amp;gt; H[Developer embeds Key in App Code]
    H --&amp;gt; I[App makes API call with Key]
    I --&amp;gt; J{Apigee Verification}

    subgraph J [Verification Steps]
        J1[Key Valid?]
        J2[Product Approved?]
        J3[URL Path Included?]
        J4[Quota Available?]
    end

    J -- All Checks Pass --&amp;gt; K[Request forwarded to Backend]
    J -- Any Check Fails --&amp;gt; L[Error e.g. 403 Forbidden]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Flowchart 3: Runtime Request Flow (What Happens on Every API Call)
&lt;/h3&gt;

&lt;p&gt;This chart details the specific verification steps Apigee performs for every incoming request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[Incoming API Request&amp;lt;br&amp;gt;with API Key] --&amp;gt; B{Verify API Key}
    B -- Invalid/Revoked --&amp;gt; C[Block Request: 401 Unauthorized]
    B -- Valid --&amp;gt; D[Look Up App &amp;amp; Developer Details]
    D --&amp;gt; E{Check API Product Access}
    E -- Product not approved&amp;lt;br&amp;gt;for this URL --&amp;gt; F[Block Request: 403 Forbidden]
    E -- Product approved --&amp;gt; G{Check Quota &amp;amp; Rate Limits}
    G -- Quota Exceeded --&amp;gt; H[Block Request: 429 Too Many Requests]
    G -- Quota Available --&amp;gt; I[Allow Request to Backend]
    I --&amp;gt; J[Log Analytics Data&amp;lt;br&amp;gt;e.g. for App, Developer, Product]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Relationships Visualized
&lt;/h3&gt;

&lt;p&gt;The core relationship between the entities can be summarized in this hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Product (The "Package")
    ^
    | contains
    |
API Proxies (The "Channels")
    ^
    | is accessed via
    |
App (The "Set-Top Box")
    ^
    | owns
    |
Developer (The "Account Holder")
    ^
    | uses
    |
API Key (The "Signal"/Password)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows that an &lt;strong&gt;API Product&lt;/strong&gt; bundles &lt;strong&gt;Proxies&lt;/strong&gt;. An &lt;strong&gt;App&lt;/strong&gt; (owned by a &lt;strong&gt;Developer&lt;/strong&gt;) is approved for a product. The &lt;strong&gt;API Key&lt;/strong&gt; is the credential for that specific App, granting it the rights of the product it's approved for.&lt;/p&gt;

</description>
      <category>apigee</category>
      <category>apigateway</category>
      <category>api</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Apigee Target Servers VS. Target Endpoints</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Wed, 03 Sep 2025 15:32:30 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/apigee-target-servers-vs-target-endpoints-lmc</link>
      <guid>https://dev.to/mahmoudsayed96/apigee-target-servers-vs-target-endpoints-lmc</guid>
      <description>&lt;p&gt;Let's break down the difference between Target Servers and Target Endpoints, complete with examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Difference: Abstraction vs. Implementation
&lt;/h3&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Target Server:&lt;/strong&gt; A &lt;strong&gt;named, reusable configuration object&lt;/strong&gt; that defines &lt;em&gt;where&lt;/em&gt; your backend service is (host, port, TLS settings). It's about the &lt;strong&gt;destination&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Target Endpoint:&lt;/strong&gt; An XML configuration block &lt;em&gt;inside your API Proxy&lt;/em&gt; that defines &lt;em&gt;how&lt;/em&gt; to call the backend. It's about the &lt;strong&gt;operation&lt;/strong&gt; (the request/response). It often &lt;em&gt;uses&lt;/em&gt; a Target Server to know where to send the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can achieve the same result without Target Servers by defining the backend URL directly in the Target Endpoint. Target Servers add a layer of abstraction that provides significant benefits.&lt;/p&gt;




&lt;h3&gt;
  
  
  Target Endpoint (The "How")
&lt;/h3&gt;

&lt;p&gt;A Target Endpoint is a fundamental building block of an Apigee API proxy. It's defined in an XML file (e.g., &lt;code&gt;default.xml&lt;/code&gt;) within the proxy bundle and represents the outbound connection to your backend service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Proxy-Specific:&lt;/strong&gt; Defined within a single API proxy.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Defines the HTTP Interaction:&lt;/strong&gt; It contains the configuration for the actual request and response flow to the backend, including:

&lt;ul&gt;
&lt;li&gt;  Pre-processing logic (with &lt;code&gt;&amp;lt;PreFlow&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;  Post-processing logic (with &lt;code&gt;&amp;lt;PostFlow&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;  Fault rules for backend errors&lt;/li&gt;
&lt;li&gt;  The crucial &lt;strong&gt;&lt;code&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/code&gt;&lt;/strong&gt; element which points to the actual backend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example 1: Target Endpoint WITHOUT a Target Server (Direct URL)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is often called a "pass-through" or directly configured target.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- File: /targets/default.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;TargetEndpoint&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PreFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PreFlow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- You can add policies here, like adding an API key to the backend request --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/PreFlow&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;HttpTargetConnection&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- The backend URL is hardcoded right here --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;https://api.my-internal-service.com/v1/orders&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/HttpTargetConnection&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PostFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PostFlow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- You can add policies here to process the backend response --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/PostFlow&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/TargetEndpoint&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2: Target Endpoint WITH a Target Server (Using Abstraction)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This endpoint doesn't know the exact URL; it knows the &lt;em&gt;name&lt;/em&gt; of a Target Server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- File: /targets/default.xml --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;TargetEndpoint&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PreFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PreFlow"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;HttpTargetConnection&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- It references a Target Server by name --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- The environment (e.g., 'test', 'prod') is determined at runtime --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;LoadBalancer&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Server&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"target-server-orders"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/LoadBalancer&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- You can still add a path to the base URL defined in the Target Server --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Path&amp;gt;&lt;/span&gt;/v1/orders&lt;span class="nt"&gt;&amp;lt;/Path&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/HttpTargetConnection&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PostFlow&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PostFlow"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/TargetEndpoint&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Target Server (The "Where")
&lt;/h3&gt;

&lt;p&gt;A Target Server is an environment-specific entity that you create and manage &lt;em&gt;outside&lt;/em&gt; of any individual API proxy. It's a reusable definition of a backend host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Environment-Specific &amp;amp; Reusable:&lt;/strong&gt; Created once in an environment (e.g., &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;) and can be used by &lt;em&gt;many&lt;/em&gt; different API proxies.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Defines Connection Details:&lt;/strong&gt; It holds the low-level network information:

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;Host&lt;/code&gt;: The backend server's hostname or IP.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;Port&lt;/code&gt;: The port number (e.g., &lt;code&gt;443&lt;/code&gt; for HTTPS, &lt;code&gt;80&lt;/code&gt; for HTTP).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;SSLInfo&lt;/code&gt;: Configuration for TLS/SSL (e.g., whether to ignore validation errors for self-signed certs in dev).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Enables Load Balancing:&lt;/strong&gt; You can define multiple Target Servers with the same name to form a load balancing group.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Create a Target Server:&lt;/strong&gt;&lt;br&gt;
You create it via the Apigee UI (Admin -&amp;gt; Environments -&amp;gt; Target Servers) or the Management API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Creating a Target Server for Dev&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;target-server-orders&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Host:&lt;/strong&gt; &lt;code&gt;orders-service.dev.mycompany.net&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Port:&lt;/strong&gt; &lt;code&gt;443&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;SSL Info:&lt;/strong&gt; &lt;code&gt;Enabled&lt;/code&gt; (This is the default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: Creating a Target Server for Prod (with Load Balancing)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You would create two or more Target Servers with the &lt;strong&gt;exact same name&lt;/strong&gt; but different hosts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Server 1:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;target-server-orders-prod-lb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Host:&lt;/strong&gt; &lt;code&gt;orders-service-prod-1.mycompany.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Port:&lt;/strong&gt; &lt;code&gt;443&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Server 2:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;target-server-orders-prod-lb&lt;/code&gt;  &amp;lt;!-- Same name! --&amp;gt;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Host:&lt;/strong&gt; &lt;code&gt;orders-service-prod-2.mycompany.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Port:&lt;/strong&gt; &lt;code&gt;443&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Apigee will automatically load balance requests between these two hosts.&lt;/p&gt;




&lt;h3&gt;
  
  
  Side-by-Side Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Target Endpoint&lt;/th&gt;
&lt;th&gt;Target Server&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;API Proxy&lt;/strong&gt; (defined inside a proxy)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Environment&lt;/strong&gt; (defined outside proxies, reusable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define the &lt;strong&gt;how&lt;/strong&gt; (request/response flow, policies).&lt;/td&gt;
&lt;td&gt;Define the &lt;strong&gt;where&lt;/strong&gt; (host, port, TLS settings).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XML file in the proxy bundle.&lt;/td&gt;
&lt;td&gt;Admin UI or Management API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PreFlow, PostFlow, Fault Rules, &lt;strong&gt;&lt;code&gt;&amp;lt;HTTPTargetConnection&amp;gt;&lt;/code&gt;&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Host, Port, SSL Info.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configures the &lt;strong&gt;strategy&lt;/strong&gt; (e.g., round-robin) in the XML.&lt;/td&gt;
&lt;td&gt;Provides the &lt;strong&gt;members&lt;/strong&gt; (the actual servers) of the pool.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Example Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adding headers, transforming the request, handling errors.&lt;/td&gt;
&lt;td&gt;Staging vs. Production backend URLs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Which?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use a Target Endpoint (with a direct URL) when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You are prototyping quickly.&lt;/li&gt;
&lt;li&gt;  The backend URL is simple and unlikely to change.&lt;/li&gt;
&lt;li&gt;  The proxy is tightly coupled to a single, specific backend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Use a Target Endpoint WITH a Target Server when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Different Backends for Different Environments:&lt;/strong&gt; You have a different backend URL for your &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;stage&lt;/code&gt;, and &lt;code&gt;prod&lt;/code&gt; environments. This is the &lt;strong&gt;most common&lt;/strong&gt; and recommended reason.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reusability:&lt;/strong&gt; The same backend host is used by multiple API proxies (e.g., a shared authentication service).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Load Balancing:&lt;/strong&gt; You need to distribute traffic across multiple instances of your backend.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Operational Decoupling:&lt;/strong&gt; You want to change the backend host/port (e.g., during a migration) without redeploying any API proxies. You just update the Target Server configuration.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;The Target Endpoint is the &lt;strong&gt;"what to do"&lt;/strong&gt; when calling the backend. The Target Server is the &lt;strong&gt;"where to do it."&lt;/strong&gt; By using them together, you create a clean separation of concerns, making your API proxies more portable, reusable, and easier to manage across different environments.&lt;/p&gt;

</description>
      <category>apigee</category>
      <category>apidevlopment</category>
      <category>apigateway</category>
    </item>
    <item>
      <title>Apigee Organization Components</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Thu, 13 Feb 2025 21:25:34 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/apigee-organization-components-30e6</link>
      <guid>https://dev.to/mahmoudsayed96/apigee-organization-components-30e6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Apigee Organization Components&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Apigee Organization Components&lt;/strong&gt; (With Images &amp;amp; Charts)
&lt;/h3&gt;

&lt;p&gt;Apigee, Google's API Management platform, is structured into different organizational components that help manage APIs efficiently. Below is an overview of these components with explanations and visual representations.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Apigee Organization (Org)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Organization (Org)&lt;/strong&gt; is the highest-level entity in Apigee and represents a company or business that owns and manages APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 &lt;strong&gt;Key Features:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contains environments, APIs, users, and policies.&lt;/li&gt;
&lt;li&gt;Defines security and governance policies.&lt;/li&gt;
&lt;li&gt;Linked to a &lt;strong&gt;Google Cloud Project&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Visualization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------+
|       Apigee Org           |
|----------------------------|
| - API Proxies              |
| - Environments             |
| - Developers               |
| - Developer Apps           |
| - API Products             |
+----------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;2. Environments &amp;amp; Environment Groups&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Environments allow you to separate different stages of API development (e.g., &lt;strong&gt;Development, Staging, Production&lt;/strong&gt;). &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each environment can have its own configurations.&lt;/li&gt;
&lt;li&gt;APIs are deployed in different environments for better control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Visualization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------+
|        Apigee Org            |
|------------------------------|
| Environments                 |
| - Dev (Development)          |
| - Test (Testing)             |
| - Prod (Production)          |
+------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔗 &lt;strong&gt;Environment Groups&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment Groups&lt;/strong&gt; allow multiple environments to be grouped and exposed under a single domain.&lt;/li&gt;
&lt;li&gt;Example: You can have &lt;code&gt;api.mycompany.com&lt;/code&gt; serving requests from different environments dynamically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Environment Group Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------+
| Environment Group: api.mycompany.com     |
|------------------------------------------|
| - Dev (api-dev.mycompany.com)           |
| - Test (api-test.mycompany.com)         |
| - Prod (api.mycompany.com)              |
+------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;3. API Proxies&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;API Proxy&lt;/strong&gt; is an abstraction layer that enables developers to expose backend services in a controlled manner.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acts as a gateway to manage API traffic.&lt;/li&gt;
&lt;li&gt;Helps enforce security, rate limiting, and analytics.&lt;/li&gt;
&lt;li&gt;Supports transformation via policies (e.g., XML to JSON).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;How API Proxies Work:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client Request → Apigee API Proxy → Backend Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📊 &lt;strong&gt;Diagram:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------+
|        API Proxy          |
|---------------------------|
| - Request Processing      |
| - Policies (Security, Caching) |
| - Response Handling       |
+---------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;4. API Products&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;API Product&lt;/strong&gt; is a bundle of API Proxies that are exposed to developers under a single plan.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helps group APIs based on functionality.&lt;/li&gt;
&lt;li&gt;Used to apply rate limiting and access control.&lt;/li&gt;
&lt;li&gt;Allows monetization of APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Example API Product Structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------+
|       API Product         |
|---------------------------|
| - API Proxy 1 (User Data) |
| - API Proxy 2 (Payments)  |
| - Rate Limit: 1000 calls/day |
+---------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;5. Developer &amp;amp; Developer Apps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Apigee allows external developers to register and obtain API keys.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt;: Individuals or companies using the APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Apps&lt;/strong&gt;: Applications created by developers that consume API Products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Keys&lt;/strong&gt;: Each app gets a unique key to access APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Diagram:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+--------------------------+
|       Developer          |
|--------------------------|
| - Name: John Doe        |
| - Apps: MyMobileApp     |
+--------------------------+

        |
        v

+--------------------------+
|    Developer App        |
|--------------------------|
| - API Key: XYZ123       |
| - API Product: Payments |
+--------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;6. Policies &amp;amp; Flows&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Apigee uses &lt;strong&gt;Policies&lt;/strong&gt; to enforce security, transformation, and traffic management.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Types of Policies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security Policies&lt;/strong&gt;: OAuth, API Key validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic Management&lt;/strong&gt;: Rate limiting, caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transformation&lt;/strong&gt;: XML to JSON conversion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging &amp;amp; Analytics&lt;/strong&gt;: Debugging and monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Example API Flow with Policies:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client Request → Security Policy → Traffic Control Policy → Backend Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📊 &lt;strong&gt;Diagram:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+---------------------------+
|       API Proxy          |
|---------------------------|
| 1. Verify API Key Policy |
| 2. Rate Limiting Policy  |
| 3. Transform JSON Policy |
+---------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Final Apigee Organization Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here's an overview of the entire Apigee structure:&lt;/p&gt;

&lt;p&gt;📊 &lt;strong&gt;Full Architecture:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------+
|                    Apigee Org                        |
|------------------------------------------------------|
| - Environments (Dev, Test, Prod)                    |
| - Environment Groups (api.mycompany.com)            |
| - API Proxies (User API, Payments API)              |
| - API Products (Subscription Plan, Free Plan)       |
| - Developers &amp;amp; Apps (App1, App2, API Keys)          |
| - Policies (Security, Rate Limiting, Caching)       |
+------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Apigee is structured to &lt;strong&gt;efficiently manage APIs&lt;/strong&gt;, enforce &lt;strong&gt;security&lt;/strong&gt;, and provide &lt;strong&gt;scalability&lt;/strong&gt;. The main components are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Organization&lt;/strong&gt;: The top-level container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environments &amp;amp; Groups&lt;/strong&gt;: Staging areas for APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Proxies&lt;/strong&gt;: Entry points for requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Products&lt;/strong&gt;: Bundles of APIs with access control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers &amp;amp; Apps&lt;/strong&gt;: Users consuming APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policies&lt;/strong&gt;: Traffic control, security, and transformation.
🚀&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>apigateway</category>
      <category>apigee</category>
      <category>programming</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Acquia Certification: What You Need to Know</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Wed, 07 Jun 2023 19:15:32 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/acquia-certification-what-you-need-to-know-3j49</link>
      <guid>https://dev.to/mahmoudsayed96/acquia-certification-what-you-need-to-know-3j49</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Acquia certification is one way to demonstrate your expertise in Drupal development and increase your chances of landing a job. In this blog post, we will discuss everything you need to know about Acquia certification and why it's worth pursuing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Acquia Certification
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acquia Certified Drupal Developer&lt;/li&gt;
&lt;li&gt;Acquia Certified Drupal Site Builder&lt;/li&gt;
&lt;li&gt;Acquia Certified Acquia Cloud Pro&lt;/li&gt;
&lt;li&gt;Acquia Certified Campaign Studio Marketing Pro&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Acquia Certified
&lt;/h2&gt;

&lt;p&gt;To become Acquia certified, you must pass the relevant exam. Before taking the exam, you should prepare by studying the exam objectives and taking practice tests.&lt;br&gt;
Make account on ACQUIA academy following this link&lt;br&gt;
&lt;a href="https://community.acquiaacademy.com/learn" rel="noopener noreferrer"&gt;https://community.acquiaacademy.com/learn&lt;/a&gt;&lt;br&gt;
and select which type of certificate and learning path you need.&lt;br&gt;
&lt;a href="https://docs.acquia.com/certification/study-guides/d10-site-builder/" rel="noopener noreferrer"&gt;https://docs.acquia.com/certification/study-guides/d10-site-builder/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources for prepare to exam (Drupal Site Builder)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Druplizeme &lt;a href="https://drupalize.me/guide/build-drupal-sites" rel="noopener noreferrer"&gt;https://drupalize.me/guide/build-drupal-sites&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ACQUIA Academy &lt;a href="https://community.acquiaacademy.com/learn" rel="noopener noreferrer"&gt;https://community.acquiaacademy.com/learn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OS Training &lt;a href="https://www.youtube.com/watch?v=-DYSucV1_9w&amp;amp;list=PLtaXuX0nEZk9MKY_ClWcPkGtOEGyLTyCO" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=-DYSucV1_9w&amp;amp;list=PLtaXuX0nEZk9MKY_ClWcPkGtOEGyLTyCO&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>acquia</category>
      <category>drupal</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Drupal Learning Resources</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Sun, 12 Mar 2023 19:19:14 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/drupal-learning-resources-7bc</link>
      <guid>https://dev.to/mahmoudsayed96/drupal-learning-resources-7bc</guid>
      <description>&lt;p&gt;This resources links for learning Drupal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Site Building&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Drupalizme (Recommanded)&lt;/strong&gt;
&lt;a href="https://drupalize.me/guide/build-drupal-sites" rel="noopener noreferrer"&gt;https://drupalize.me/guide/build-drupal-sites&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACQUIA&lt;/strong&gt; &lt;a href="https://community.acquiaacademy.com/learn/lp/85/Drupal%2520Site%2520Builder%2520Certification%2520Learning%2520Plan" rel="noopener noreferrer"&gt;https://community.acquiaacademy.com/learn/lp/85/Drupal%2520Site%2520Builder%2520Certification%2520Learning%2520Plan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OSTrining&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://ostraining.com/courses/the-beginners-guide-to-drupal-8/" rel="noopener noreferrer"&gt;https://ostraining.com/courses/the-beginners-guide-to-drupal-8/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLtaXuX0nEZk9MKY_ClWcPkGtOEGyLTyCO" rel="noopener noreferrer"&gt;https://www.youtube.com/playlist?list=PLtaXuX0nEZk9MKY_ClWcPkGtOEGyLTyCO&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Webwash&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.webwash.net/courses/drupal-8-site-building/" rel="noopener noreferrer"&gt;https://www.udemy.com/course/drupal-8-site-building/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.webwash.net/course-list/" rel="noopener noreferrer"&gt;https://www.webwash.net/course-list/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;** Drupalizme.com** &lt;a href="https://drupalize.me/guide/develop-drupal-sites" rel="noopener noreferrer"&gt;Backend Development&lt;/a&gt;.
&lt;a href="https://drupalize.me/series/drupal-and-reactjs" rel="noopener noreferrer"&gt;React + Drupal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACQUIA&lt;/strong&gt;      &lt;a href="https://community.acquiaacademy.com/learn/lp/94/Drupal%2520Developer%2520Certification%2520Learning%2520Plan" rel="noopener noreferrer"&gt;https://community.acquiaacademy.com/learn/lp/94/Drupal%2520Developer%2520Certification%2520Learning%2520Plan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YouTube&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=1DfVIJivjT4&amp;amp;list=PLICin5QDejMvFIuW4SI6N6Whq8Ru0OaPl&amp;amp;index=1" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=1DfVIJivjT4&amp;amp;list=PLICin5QDejMvFIuW4SI6N6Whq8Ru0OaPl&amp;amp;index=1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@sachinsharmaacademy" rel="noopener noreferrer"&gt;https://www.youtube.com/@sachinsharmaacademy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@d4drupal324/playlists" rel="noopener noreferrer"&gt;https://www.youtube.com/@d4drupal324/playlists&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@Drupal-up/videos" rel="noopener noreferrer"&gt;https://www.youtube.com/@Drupal-up/videos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@drupal-academy/playlists" rel="noopener noreferrer"&gt;https://www.youtube.com/@drupal-academy/playlists&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code-Snippets&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/selwynpolit/d9book/tree/gh-pages/book" rel="noopener noreferrer"&gt;https://github.com/selwynpolit/d9book/tree/gh-pages/book&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MahmoudSayed96/drupal-code-snippets" rel="noopener noreferrer"&gt;https://github.com/MahmoudSayed96/drupal-code-snippets&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles/Blogs&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.hashbangcode.com/category/drupal" rel="noopener noreferrer"&gt;https://www.hashbangcode.com/category/drupal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codimth.com/category/web/drupal" rel="noopener noreferrer"&gt;https://codimth.com/category/web/drupal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gkapoor121212/drupal9-links" rel="noopener noreferrer"&gt;https://github.com/gkapoor121212/drupal9-links&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.specbee.com/blogs" rel="noopener noreferrer"&gt;https://www.specbee.com/blogs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Theme Development&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.drupal.org/docs/develop/theming-drupal" rel="noopener noreferrer"&gt;Drupal Theming&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.tutsplus.com/courses/how-to-build-a-custom-theme-for-drupal-8/lessons/introduction" rel="noopener noreferrer"&gt;https://code.tutsplus.com/courses/how-to-build-a-custom-theme-for-drupal-8/lessons/using-partials&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>drupal</category>
      <category>php</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Remove /web from URL in Drupal</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Tue, 20 Sep 2022 17:30:16 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/remove-web-from-url-in-drupal-gki</link>
      <guid>https://dev.to/mahmoudsayed96/remove-web-from-url-in-drupal-gki</guid>
      <description>&lt;p&gt;By default, when you create your Drupal project using composer it will create project under &lt;code&gt;/web&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;When you’re using shared hosting for your Drupal website which points your domain to &lt;code&gt;/public_html&lt;/code&gt; folder and you’re not allow to change that pointing directory&lt;/p&gt;

&lt;p&gt;Now whenever your targeted audience will have to visit your website, they must open it like this &lt;code&gt;http://example.com/web&lt;/code&gt;. and which is not a good user experience to add /web at the end of your URL to view home page of your website.&lt;/p&gt;

&lt;p&gt;So, how can we serve our website from &lt;code&gt;/public_html/web&lt;/code&gt; folder but no need to append /web in URL by your targeted audience?&lt;/p&gt;

&lt;p&gt;Here is the summary, which I learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1- Move all files and folders from &lt;code&gt;web&lt;/code&gt; to root folder&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2- Open &lt;code&gt;composer.json&lt;/code&gt; remove &lt;code&gt;/web&lt;/code&gt; and add &lt;code&gt;./&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"drupal-scaffold": {
 "locations": {
    "web-root": "./"
 }
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3- Remove &lt;code&gt;/web&lt;/code&gt; from composer.json in &lt;code&gt;installer-paths&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"installer-paths": {
  "core": [
    "type:drupal-core"
   ],
  "libraries/{$name}": [
   "type:drupal-library"
  ],
   "modules/contrib/{$name}": [
     "type:drupal-module"
   ],
   "profiles/contrib/{$name}": [
     "type:drupal-profile"
    ],
    "themes/contrib/{$name}": [
     "type:drupal-theme"
     ],
     "drush/Commands/contrib/{$name}": [
      "type:drupal-drush"
     ],
     "modules/custom/{$name}": [
       "type:drupal-custom-module"
     ],
     "profiles/custom/{$name}": [
       "type:drupal-custom-profile"
    ],
    "themes/custom/{$name}": [
       "type:drupal-custom-theme"
      ]
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4- Open file &lt;code&gt;autoload.php&lt;/code&gt; replace code with:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5- Remove &lt;code&gt;vendor&lt;/code&gt; and &lt;code&gt;core&lt;/code&gt; folders and run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$composer&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="nv"&gt;$drush&lt;/span&gt; cr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If there is a better way than this, please let me know in the comments. Thanks&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>php</category>
      <category>drupa</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Drupal Seed Data</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Sun, 14 Aug 2022 22:47:09 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/drupal-seed-data-4g63</link>
      <guid>https://dev.to/mahmoudsayed96/drupal-seed-data-4g63</guid>
      <description>&lt;p&gt;&lt;strong&gt;Seed Data&lt;/strong&gt;&lt;br&gt;
You use seeding to provide initial values for lookup lists,&lt;br&gt;
for demo purposes, proof of concepts and of course for development.&lt;/p&gt;

&lt;p&gt;To &lt;strong&gt;modules\custom\my_module\src&lt;/strong&gt; we add a directory called &lt;strong&gt;SeedData&lt;/strong&gt;. We add a file&lt;br&gt;
called &lt;strong&gt;SeedDataGenerator.php&lt;/strong&gt; to modules\custom\offer\src\SeedData.&lt;br&gt;
The class will for now just create a dummy user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Drupal\my_module\SeedData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\user\Entity\User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drush\Drush&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 * SeedDataGenerator.
 *
 * @package Drupal\my_module
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SeedDataGenerator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * Function to create a seed data.
   *
   * @param string $entity
   *   The type of entity that needs to be created.
   *
   * @return null|int
   *   The number of entities created.
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;seedUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * @return int
   *   The number of users created.
   * @throws \Drupal\Core\Entity\EntityStorageException
   */&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;seedUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setUsername&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'testUser'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'P@ssw0rd'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;activate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enforceIsNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;Drush&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;writeln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;comment&amp;gt;Creating user test&amp;lt;/comment&amp;gt;'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Proceed with adding a drush command that will trigger the class:&lt;br&gt;
Add &lt;strong&gt;custom/my_module/src/Commands/SeedGeneratorCommand.php&lt;/strong&gt; and configure&lt;br&gt;
further. The final file looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Drupal\my_module\Commands&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nf"&gt;Drupal\my_module&lt;/span&gt;&lt;span class="nc"&gt;\SeedData\SeedDataGenerator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drush\Commands\DrushCommands&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drush\Drush&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 * Class SeedGeneratorCommand.
 *
 * @package Drupal\my_module\Commands
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SeedGeneratorCommand&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;DrushCommands&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * Runs the mymoduleCreateSeeds command.
   *
   * @command mymodule-create-seeds
   * @aliases mymodulecs
   * @usage drush mymodule-create-seeds
   * Display 'Seed data created'
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;mymoduleCreateSeeds&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SeedDataGenerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$seed&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Drush&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;writeln&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;info&amp;gt;'&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$count&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' user(s) created&amp;lt;/info&amp;gt;'&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One more thing. Add a file &lt;strong&gt;custom/my_module/my_module.services.yml&lt;/strong&gt; and add:&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;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;offer.commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Drupal\offer\Commands\SeedGeneratorCommand&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;drush.command&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it! Clear cache and see if our system has registered our command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$drush&lt;/span&gt; offer-create-seeds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stefvanlooveren.me/courses/drupal-9-framework" rel="noopener noreferrer"&gt;Learning drupal 9 as a framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>deupal</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Drupal Interview questions</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Tue, 19 Jul 2022 21:58:29 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/drupal-interview-questions-42n6</link>
      <guid>https://dev.to/mahmoudsayed96/drupal-interview-questions-42n6</guid>
      <description>&lt;p&gt;&lt;strong&gt;- What is the entity in Drupal?&lt;/strong&gt;&lt;br&gt;
In Drupal, &lt;strong&gt;entity&lt;/strong&gt; is a general concept that represents a noun (person, place, or thing). Out of the box, there are a number of different types of entities in Drupal, _each meant to represent a specific type of data. _&lt;br&gt;
Such as &lt;strong&gt;user&lt;/strong&gt; and &lt;strong&gt;Content&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entity has two types &lt;strong&gt;Configuration&lt;/strong&gt; and &lt;strong&gt;Content&lt;/strong&gt;&lt;br&gt;
Content such as [User, Node, Taxonomy]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bundle&lt;/strong&gt; is a subtype of content entity such as [Article, Basic page, Term]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Difference between Field Types, Field Formatters and Field Widgets?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Field Types&lt;/em&gt; this defines the type of value that will be stored in database [integer, string...].&lt;br&gt;
&lt;em&gt;Field Widgets&lt;/em&gt; this using in edit value and configured from form display.&lt;br&gt;
&lt;em&gt;Field Formatter&lt;/em&gt; this defines how value will be rendered and displayed configured from manage display.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- What is rendered array?&lt;/strong&gt;&lt;br&gt;
The core structure of Drupal's Render API is the render array, which is a hierarchical associative array containing data to be rendered and properties describing how the data should be rendered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Cache in Drupal&lt;/strong&gt;&lt;br&gt;
A cache stores frequently requested pages or the parts of the pages, and these pages can be shown to users with fewer resources and with a faster speed than usual.&lt;/p&gt;

&lt;p&gt;Drupal 8 enables two modules: Internal Page Cache and Internal Dynamic Page Cache. Internal Page Cache caches pages for anonymous users. Internal Dynamic Page Cache caches contents of the page except for the personalized pieces, so they can be used for anonymous and authorized users. Each object of the page contains metadata, and this piece of metadata tells the Internal Dynamic Page Cache module if it must cache the page or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Create custom token&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://codimth.com/blog/web/drupal/how-create-custom-token-drupal-8-9" rel="noopener noreferrer"&gt;Create custom token&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Create custom Drush command&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.specbee.com/blogs/writing-your-own-custom-drush-9-and-10-commands" rel="noopener noreferrer"&gt;Drush command&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;- Can we optimize any Drupal website? If yes, then how? *&lt;/em&gt;&lt;br&gt;
Ans: Yes, we can do it. The steps are given below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable page caching&lt;/li&gt;
&lt;li&gt;Compress CSS files&lt;/li&gt;
&lt;li&gt;JS Aggregation&lt;/li&gt;
&lt;li&gt;Moving media files and static files to CDN&lt;/li&gt;
&lt;li&gt;Theme optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;- How hooks working in Drupal?&lt;/strong&gt;&lt;br&gt;
Hooks are how modules can interact with the core code of Drupal.&lt;br&gt;
Hooks allow modules to alter and extend the behavior of Drupal core, or another module. They are one of the various ways that code components in Drupal can communicate with one another. Using hooks, a module developer can change how core, or another module works -- without changing the existing code.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;- How Drupal handles the page request: Bootstrap Process? *&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.valuebound.com/resources/blog/how-drupal-handles-page-request-bootstrap-process" rel="noopener noreferrer"&gt;LINK&lt;/a&gt;&lt;br&gt;
What Drupal does:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separates the internal path from the full URL.&lt;/li&gt;
&lt;li&gt;Bootstraps and initialize the database, sessions etc.&lt;/li&gt;
&lt;li&gt;Maps the path to a callback function.&lt;/li&gt;
&lt;li&gt;Modules can hook into the process and extend functionality and 
alter the content.&lt;/li&gt;
&lt;li&gt;The Theme System generates the HTML and styles it.&lt;/li&gt;
&lt;li&gt;Drupal returns a fully formed HTML page to the browser&lt;/li&gt;
&lt;li&gt;The browser renders the HTML page for the user&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to use multiple databases in Drupal 8&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://codimth.com/blog/web/drupal/how-use-multiple-databases-drupal-8" rel="noopener noreferrer"&gt;Article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal Event Subscriber&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.daggerhartlab.com/drupal-8-hooks-events-event-subscribers/" rel="noopener noreferrer"&gt;Article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are we using module &lt;code&gt;config ignore&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
Ignore config files you don't need to upload it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://drupalize.me/blog/201401/introduction-restful-web-services-drupal-8" rel="noopener noreferrer"&gt;Rest API in Drupal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Apigee With Drupal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.drupal.org/docs/contributed-modules/apigee-edge" rel="noopener noreferrer"&gt;Apigee Edge&lt;/a&gt;&lt;/strong&gt; : &lt;br&gt;
The Apigee Edge module lets you connect your Drupal developer portal site with Apigee Edge, Apigee X, and Apigee hybrid organizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.drupal.org/docs/contributed-modules/apigee-api-catalog" rel="noopener noreferrer"&gt;Apigee API Catalog&lt;/a&gt;&lt;/strong&gt;: &lt;br&gt;
Apigee’s API Catalog module lets you document your APIs in your Drupal developer portal using OpenAPI specifications and Apigee SmartDocs. Publishing API documentation to your portals makes it easy for your developers to learn, test, and evaluate your APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.drupal.org/docs/contributed-modules/apigee-monetization" rel="noopener noreferrer"&gt;Apigee Monetization&lt;/a&gt;&lt;/strong&gt;: &lt;br&gt;
The Apigee Monetization module lets you integrate a Drupal developer portal with a monetized organization in Apigee Edge, hybrid, or Apigee X.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.drupal.org/docs/contributed-modules/apigee-developer-portal-kickstart" rel="noopener noreferrer"&gt;Apigee Developer Portal Kickstart&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
The Apigee Developer Portal Kickstart distribution enables you to quickly evaluate and create a new Apigee developer portal using Drupal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.adaface.com/blog/drupal-interview-questions" rel="noopener noreferrer"&gt;https://www.adaface.com/blog/drupal-interview-questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>interview</category>
      <category>php</category>
      <category>drupal</category>
    </item>
    <item>
      <title>Drupal - API Resources for Custom login</title>
      <dc:creator>Mahmoud Sayed</dc:creator>
      <pubDate>Mon, 18 Jul 2022 22:29:22 +0000</pubDate>
      <link>https://dev.to/mahmoudsayed96/drupal-api-resources-for-custom-login-2da8</link>
      <guid>https://dev.to/mahmoudsayed96/drupal-api-resources-for-custom-login-2da8</guid>
      <description>&lt;p&gt;Drupal 9 rest custom login resource, return session data to build cookie in frontend.&lt;br&gt;
missing csrf (can be obtained at &lt;code&gt;/session/token&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create rest plugin using Drush command.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;$ drush generate plugin-rest-resource&lt;/code&gt;&lt;br&gt;
Or using an alias&lt;br&gt;
&lt;code&gt;$ drush gen rest-resource&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a &lt;code&gt;POST&lt;/code&gt; resource, so run &lt;code&gt;$ drush cr&lt;/code&gt;&lt;br&gt;
Using &lt;a href="https://www.drupal.org/project/restui" rel="noopener noreferrer"&gt;Rest UI&lt;/a&gt; enable resource and add a permission for anonymous role.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Drupal\custom_rest_api\Plugin\rest\resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\Core\Session\AccountProxyInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\rest\ModifiedResourceResponse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\rest\Plugin\ResourceBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Psr\Log\LoggerInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\DependencyInjection\ContainerInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\Core\Session\SessionManagerInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\Core\Extension\ModuleHandlerInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Drupal\Core\Password\PasswordInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\HttpKernel\Exception\BadRequestHttpException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 * Represents Custom login resource records as resources.
 *
 * @RestResource (
 *   id = "custom_rest_api_custom_login_resource",
 *   label = @Translation("Custom login resource"),
 *   uri_paths = {
 *     "create" = "/api/custom/login"
 *   }
 * )
 *
 * @DCG
 * This plugin exposes database records as REST resources. In order to enable it
 * import the resource configuration into active configuration storage. You may
 * find an example of such configuration in the following file:
 * core/modules/rest/config/optional/rest.resource.entity.node.yml.
 * Alternatively you can make use of REST UI module.
 * @see https://www.drupal.org/project/restui
 * For accessing Drupal entities through REST interface use
 * \Drupal\rest\Plugin\rest\resource\EntityResource plugin.
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomLoginResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ResourceBase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cd"&gt;/**
   * A current user instance.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$currentUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$sessionManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$moduleHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * Constructs a new CustomLoginResource object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param array $serializer_formats
   *   The available serialization formats.
   * @param \Psr\Log\LoggerInterface $logger
   *   A logger instance.
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   *   A current user instance.
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nv"&gt;$plugin_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nv"&gt;$plugin_definition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$serializer_formats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;LoggerInterface&lt;/span&gt; &lt;span class="nv"&gt;$logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;AccountProxyInterface&lt;/span&gt; &lt;span class="nv"&gt;$current_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;SessionManagerInterface&lt;/span&gt; &lt;span class="nv"&gt;$session_manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;ModuleHandlerInterface&lt;/span&gt; &lt;span class="nv"&gt;$module_handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;PasswordInterface&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$plugin_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$plugin_definition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$serializer_formats&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$logger&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;currentUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$current_user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sessionManager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$session_manager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;moduleHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$module_handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * {@inheritdoc}
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ContainerInterface&lt;/span&gt; &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$plugin_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$plugin_definition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nv"&gt;$configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;$plugin_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;$plugin_definition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'serializer.formats'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'logger.factory'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'exp_fs'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'current_user'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'session_manager'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'module_handler'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nv"&gt;$container&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * Responds to POST requests.
   *
   * @return \Drupal\rest\ModifiedResourceResponse
   *   The HTTP response object.
   *
   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
   *   Throws exception expected.
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$pass_check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;$pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'pass'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nv"&gt;$account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;user_load_by_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$pass_check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pass&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPassword&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Wrong username and/or password.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pass_check&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Wrong username and/or password..'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;\Drupal&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'session'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$session&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'uid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;moduleHandler&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;invokeAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_login'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="nf"&gt;user_login_finalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nv"&gt;$sess_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sessionManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$sess_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sessionManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="nv"&gt;$body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'sess_name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$sess_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'sess_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$sess_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'current_user'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAccountName&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="s1"&gt;'uid'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
          &lt;span class="s1"&gt;'roles'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRoles&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ModifiedResourceResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
   * Validates incoming record.
   *
   * @param mixed $record
   *   Data to validate.
   *
   * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
   */&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;is_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BadRequestHttpException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'No record content received'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BadRequestHttpException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'name id is required'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$record&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'pass'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BadRequestHttpException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Password date is required'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>drupal</category>
      <category>php</category>
      <category>rest</category>
      <category>api</category>
    </item>
  </channel>
</rss>
