Expedia

Brand Description

A travel booking platform that offers services for flights, hotels, car rentals, and vacation packages.

Associated Domains

Screenshot of expedia.com
expedia.com

IAB Categories:

TravelShopping

IAB Ad Products:

Travel and TourismTravel Agents and Online Travel ServicesTravel Packages
IDDomainSeatBidTimestampStatusAd FormatSub FormatSizeQuality ScoreData TransferredComputational Cost
cm861i34231$0.903/12/2025, 2:53:47 PM
Domain Capture: Success
Ad Rendering: Success
Brand Mapping: Success
Ad Analysis: Pending
Domain Analysis: Pending
3/5 complete
banner-300x250N/A1259.11 KB14647.00 ms
cm861i34231$0.903/12/2025, 2:53:47 PM
Domain Capture: Success
Ad Rendering: Success
Brand Mapping: Success
Ad Analysis: Failed: PrismaClientKnownRequestError: Invalid `s.chat.completions.create()` invocation in /var/task/dist/index.js:178:3157 175 Return the structured classification JSON as per the format. 176 `}};function k(e,a){let n=e==="creative"?Z.SUMMARY_TEXT:ee.SUMMARY_TEXT,i=!a||a.trim()===""?"NONE":a.substring(0,5e3);return{SYSTEM:n.SYSTEM,USER:`${n.USER} 177 → 178 ${i}`}}var E=async(e,a,n,i,t,s)=>{try{let g=(await s.chat.completions.create( An operation failed because it depends on one or more records that were required but not found. Expected 2 records to be connected, found only 0.
Domain Analysis: Failed: PrismaClientKnownRequestError: Invalid `e.domain.findUnique()` invocation in /var/task/dist/index.js:180:1316 177 178 ${i}`}}var E=async(e,a,n,i,t,s)=>{try{let g=(await s.chat.completions.create({...b,messages:[{role:"system",content:e.SYSTEM},{role:"user",content:[{type:"text",text:e.USER(a,n,i,t)}]}],response_format:{type:"json_schema",json_schema:{name:"contentClassification",description:"A structured JSON object containing an array of classified categories with confidence scores.",strict:!0,schema:{type:"object",properties:{classifications:{type:"array",items:{type:"object",properties:{category:{type:"string",description:"The assigned IAB or sensitive content category."},confidence:{type:"number",description:"The confidence score of the classification (0.0 - 1.0)."}},required:["category","confidence"],additionalProperties:!1}}},required:["classifications"],additionalProperties:!1}}}})).choices[0].message.content;if(!g)return[];let c=JSON.parse(g);return!c||!c.classifications||!Array.isArray(c.classifications)?[]:c.classifications.every(u=>typeof u.category=="string"&&typeof u.confidence=="number")?c.classifications:[]}catch(l){return console.error("Error in classifyContent:",l),[]}};async function v({type:e,summary:a,textFromImage:n,adomain:i,openai:t}){let s=await E(C.IAB,e,a,n,i,t);return console.log("IAB Classification: ",s),s}async function A({type:e,summary:a,textFromImage:n,adomain:i,openai:t}){let s=await E(C.IAB_AD_PRODUCT,e,a,n,i,t);return console.log("IAB Ad Product Classification: ",s),s}async function I({type:e,summary:a,textFromImage:n,adomain:i,openai:t}){let s=await E(C.SENSITIVE,e,a,n,i,t);return console.log("Sensitive Classification: ",s),s}async function te(e){let n=await(await fetch(e)).text();return n||(console.error(`Error getting HTML for ${e}`),"")}async function P(e,a,n,i="creative"){console.log("getting text and summary for type: ",i);let t=await te(a),s=k(i,t);console.log("Prompts: ",s);let l=[{type:"text",text:s.USER},{type:"image_url",image_url:{url:e}}],c=(await n.chat.completions.create({...b,messages:[{role:"system",content:s.SYSTEM},{role:"user",content:l}],response_format:{type:"json_schema",json_schema:{name:"extractedTextAndSummary",description:"A structured JSON object with extracted text and summary.",strict:!0,schema:{type:"object",properties:{extractedText:{type:"array",items:{type:"string"},description:"An array of strings, each representing a text element extracted from the image."},summary:{type:["string","null"],description:"A brief summary of the image."}},required:["extractedText","summary"],additionalProperties:!1}}}})).choices[0].message.content;if(!c)return{extractedText:[],summary:""};try{let r=JSON.parse(c);return console.log("Summary and text response-: ",i,r),r}catch(r){return console.error("Error parsing JSON response:",r,c),{extractedText:[],summary:""}}}var w=require("@aws-sdk/client-s3"),x=require("@aws-sdk/s3-request-presigner");var G=async(e,a,n)=>{let i=await e.creative.findUnique({where:{id:a},include:{auditResult:!1}});if(!i)throw console.error("Creative not found",a),new Error("Creative not found");console.log("Creative: ",i);let t=await ne({data:{creative:i,adomain:i.adomain},s3:n});return console.log("Creative analysis result:",t),await e.creative.update({where:{id:i.id},data:{summary:t.summary,iabCategories:{connect:t.iabCategoriesCodes.map(s=>({code:s.category}))},iabProducts:{connect:t.iabAdProductIds.map(s=>({id:s.id}))},tags:{connect:t.foundSensitiveTags.map(s=>({name:s.category}))}}}),t};async function ne({data:e,s3:a}){console.log("Analyzing with OpenAI:",e.creative.id);let n="creative",i=new U.default({apiKey:process.env.OPENAI_API_KEY}),{summary:t,textFromImage:s}=await ae(e,i,a),l=await v({type:n,summary:t,textFromImage:s,adomain:e.adomain,openai:i}),g=await A({type:n,summary:t,textFromImage:s,adomain:e.adomain,openai:i}),c=await I({type:n,summary:t,textFromImage:s,adomain:e.adomain,openai:i}),r=[];for(let[o,m]of Object.entries(S)){let d=l.find(p=>m.includes(p.category));d&&r.push({category:o,confidence:d.confidence})}let u=[];for(let[o,m]of Object.entries(f)){let d=g.find(p=>m===p.category);d&&u.push({id:parseInt(o),confidence:d.confidence})}return{iabCategoriesCodes:r.filter(o=>o.confidence>=.7),iabAdProductIds:u.filter(o=>o.confidence>=.5),foundSensitiveTags:c,summary:t}}async function ae(e,a,n){console.log("Getting summary and text from creative image:",e.creative.id);let i=null,t=[],s=null;if(e.creative.ad_format==="native"){let r=null,u=JSON.parse(JSON.parse(e.creative.raw_json).adm);for(let o=0;o<u.native.assets.length;o++){let m=u.native.assets[o];if(m.data&&m.data.value&&t.push(m.data.value),m.img&&m.img.url){let d=m.img.w*m.img.h;(!r||d>r.resolution)&&(r={url:m.img.url,resolution:d})}}if(r)i=r.url;else throw new Error("No image found in native creative")}t.length>0&&(s=` 179 (Parsed text from native assets: ${t.join(` → 180 - `)})`),i||(console.log("Getting non-native creative image URL"),i=await ie(e,n));let l=await se(e,n);console.log("Img URL: ",i),console.log("Html URL: ",l);let{summary:g,textFromImage:c}=await P(i,l,a,"creative");return{summary:`${g}${s}`,textFromImage:c}}async function ie(e,a){let n=`ads/${e.creative.id}/screenshot_0.jpg`,i=new w.GetObjectCommand({Bucket:process.env.R2_BUCKET||"",Key:n});try{return await(0,x.getSignedUrl)(a,i,{expiresIn:3600})}catch(t){console.error("Error getting creative image URL:",t)}return`${process.env.CDN_URL}/ads/${e.creative.id}/screenshot_0.jpg?${Math.random().toString(36).substring(2,15)}`}var se=async(e,a)=>{let n=`ads/${e.creative.id}/index.html`,i=new w.GetObjectCommand({Bucket:process.env.R2_BUCKET||"",Key:n});return await(0,x.getSignedUrl)(a,i,{expiresIn:3600})};var N=B(require("openai"));var R=require("@aws-sdk/client-s3"),D=require("@aws-sdk/s3-request-presigner");var L=async(e,a,n,i)=>{let t=null;if(n?t=await e.domain.findUnique( An operation failed because it depends on one or more records that were required but not found. Expected 3 records to be connected, found only 0.
3/5 complete, 2 failed
banner-300x250N/A1304.20 KB13772.00 ms
cm861i34231$0.903/12/2025, 2:53:47 PM
Ad Analysis: Success
Domain Analysis: Success
Domain Capture: Success
Ad Rendering: Success
Brand Mapping: Success
5/5 complete
banner-728x906/10724.24 KB12700.00 ms