{
  "id":"port13UgcRenderCallback","name":"Portfolio 13B - UGC Render Callback and Delivery","active":false,
  "nodes":[
    {"parameters":{"httpMethod":"POST","path":"portfolio-ugc-render-callback","responseMode":"responseNode","options":{}},"webhookId":"f1320000-0000-4000-8000-000000000098","id":"f1320000-0000-4000-8000-000000000001","name":"Provider Callback","type":"n8n-nodes-base.webhook","typeVersion":2.1,"position":[-760,0]},
    {"parameters":{"jsCode":"const i=$json.body??$json; const required=['renderJobId','campaignId','callbackStatus','providerVideoUrl']; const missing=required.filter(k=>i[k]===undefined||i[k]===null||i[k]===''); if(missing.length)return[{json:{valid:false,error:`Missing callback fields: ${missing.join(', ')}`}}]; return[{json:{valid:true,renderJobId:String(i.renderJobId),campaignId:String(i.campaignId),callbackStatus:String(i.callbackStatus),providerVideoUrl:String(i.providerVideoUrl),idempotencyKey:`ugc:delivery:${i.renderJobId}`}}];"},"id":"f1320000-0000-4000-8000-000000000002","name":"Verify Callback Contract","type":"n8n-nodes-base.code","typeVersion":2,"position":[-540,0]},
    {"parameters":{"conditions":{"options":{"caseSensitive":true,"typeValidation":"strict","version":2},"conditions":[{"id":"f1320000-0000-4000-8000-000000000003","leftValue":"={{ $json.valid && $json.callbackStatus === 'completed' }}","rightValue":true,"operator":{"type":"boolean","operation":"true","singleValue":true}}],"combinator":"and"},"options":{}},"id":"f1320000-0000-4000-8000-000000000004","name":"Completed Callback?","type":"n8n-nodes-base.if","typeVersion":2.2,"position":[-300,0]},
    {"parameters":{"method":"POST","url":"http://127.0.0.1:8787/ugc/deliveries","sendBody":true,"contentType":"raw","rawContentType":"application/json","body":"={{ JSON.stringify({...$json,captions:true,branding:true,storageProvider:'configured-cloud-storage'}) }}","options":{"timeout":15000}},"id":"f1320000-0000-4000-8000-000000000005","name":"Assemble Caption Brand and Deliver","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[-60,-100],"retryOnFail":true,"maxTries":3,"waitBetweenTries":1000},
    {"parameters":{"respondWith":"json","responseBody":"={{ JSON.stringify({ok:true,status:'ugc-video-delivered',delivery:$json}) }}","options":{"responseCode":200}},"id":"f1320000-0000-4000-8000-000000000006","name":"Return Delivery","type":"n8n-nodes-base.respondToWebhook","typeVersion":1.4,"position":[180,-100]},
    {"parameters":{"respondWith":"json","responseBody":"={{ JSON.stringify({ok:false,status:$json.valid?'render-not-complete':'invalid-callback',error:$json.error||'Render provider reported an incomplete or failed job'}) }}","options":{"responseCode":409}},"id":"f1320000-0000-4000-8000-000000000007","name":"Return Callback Failure","type":"n8n-nodes-base.respondToWebhook","typeVersion":1.4,"position":[-60,120]}
  ],
  "connections":{"Provider Callback":{"main":[[{"node":"Verify Callback Contract","type":"main","index":0}]]},"Verify Callback Contract":{"main":[[{"node":"Completed Callback?","type":"main","index":0}]]},"Completed Callback?":{"main":[[{"node":"Assemble Caption Brand and Deliver","type":"main","index":0}],[{"node":"Return Callback Failure","type":"main","index":0}]]},"Assemble Caption Brand and Deliver":{"main":[[{"node":"Return Delivery","type":"main","index":0}]]}},
  "settings":{"executionOrder":"v1"},"pinData":{},"versionId":"f1320000-0000-4000-8000-000000000099","meta":{"templateCredsSetupCompleted":true},"tags":[]
}
