{
  "meta": {
    "description": "Webhook \u2192 recommend \u2192 brief \u2192 shaped output. Drop into any AI-video pipeline. Hand the returned tiktok_sound_url and tiktok_music_id to your downstream uploader. Public proof is evidence of fit and momentum, not a guarantee of views.",
    "templateCredsSetupCompleted": true,
    "wouldliker_template_version": "1.3.2"
  },
  "name": "Wouldliker \u2014 AI product video music recommendation",
  "tags": [
    {
      "name": "wouldliker"
    },
    {
      "name": "tiktok"
    },
    {
      "name": "ai-video"
    },
    {
      "name": "product-video"
    },
    {
      "name": "sound-direction"
    }
  ],
  "nodes": [
    {
      "id": "note-how-it-works",
      "name": "How it works",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        -220
      ],
      "parameters": {
        "width": 460,
        "height": 360,
        "content": "## How it works\nThis workflow turns a product or short-form clip description into a Wouldliker sound pack.\n\n1. A webhook receives the clip or product description.\n2. The input is normalized into Wouldliker API fields.\n3. `/api/recommend` returns a recommended sound, TikTok sound URL, music ID, proof, and sound direction.\n4. `/api/brief` returns a video brief, captions, hashtags, and boundary copy.\n5. The final node shapes a flat object for downstream tools."
      },
      "typeVersion": 1
    },
    {
      "id": "note-setup",
      "name": "Set up steps",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        700,
        -220
      ],
      "parameters": {
        "width": 460,
        "height": 320,
        "content": "## Set up steps\nSetup time: about 5 minutes.\n\n1. Import this template.\n2. Execute the workflow once to enable the test webhook.\n3. Send a POST request to the webhook with `description`, `platform`, `content_type`, `language`, and `is_aigc`.\n4. Connect the final output to your own publisher, CMS, Slack, Notion, Airtable, Shopify, or content queue.\n\nNo credentials or API keys are required."
      },
      "typeVersion": 1
    },
    {
      "id": "note-boundaries",
      "name": "Boundaries",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1180,
        -220
      ],
      "parameters": {
        "width": 460,
        "height": 300,
        "content": "## Boundaries\nWouldliker returns recommendation data only.\n\n- No TikTok auto-posting.\n- No MP3 or audio file redistribution.\n- No guaranteed views.\n- The publisher attaches the returned `tiktok_sound_url` or `tiktok_music_id` in their own upload step.\n- If `is_aigc` is true, the publisher is responsible for platform disclosure and labeling."
      },
      "typeVersion": 1
    },
    {
      "id": "trigger",
      "name": "Webhook: product brief in",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        320
      ],
      "parameters": {
        "path": "wouldliker-product-video",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "lastNode"
      },
      "typeVersion": 1
    },
    {
      "id": "normalize",
      "name": "Normalize input",
      "type": "n8n-nodes-base.set",
      "position": [
        460,
        320
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "description",
              "value": "={{$json.body.description || $json.body.product_description}}"
            },
            {
              "name": "platform",
              "value": "={{$json.body.platform     || 'tiktok'}}"
            },
            {
              "name": "content_type",
              "value": "={{$json.body.content_type || 'product_reveal'}}"
            },
            {
              "name": "language",
              "value": "={{$json.body.language     || 'en'}}"
            }
          ],
          "boolean": [
            {
              "name": "is_aigc",
              "value": "={{$json.body.is_aigc === true || $json.body.is_aigc === 'true'}}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "recommend",
      "name": "Wouldliker: recommend sound",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        700,
        320
      ],
      "parameters": {
        "url": "https://wouldliker.com/api/recommend",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "json",
        "sendHeaders": true,
        "specifyBody": "keypair",
        "bodyParameters": {
          "parameters": [
            {
              "name": "description",
              "value": "={{ $json.description }}"
            },
            {
              "name": "platform",
              "value": "={{ $json.platform }}"
            },
            {
              "name": "content_type",
              "value": "={{ $json.content_type }}"
            },
            {
              "name": "duration_seconds",
              "value": 22
            },
            {
              "name": "language",
              "value": "={{ $json.language }}"
            },
            {
              "name": "is_aigc",
              "value": "={{ $json.is_aigc }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "brief",
      "name": "Wouldliker: generate brief + caption",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        940,
        320
      ],
      "parameters": {
        "url": "https://wouldliker.com/api/brief",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "json",
        "sendHeaders": true,
        "specifyBody": "keypair",
        "bodyParameters": {
          "parameters": [
            {
              "name": "sound_slug",
              "value": "={{ $json.primary_sound.sound_slug }}"
            },
            {
              "name": "description",
              "value": "={{ $node['Normalize input'].json.description }}"
            },
            {
              "name": "platform",
              "value": "={{ $node['Normalize input'].json.platform }}"
            },
            {
              "name": "duration_seconds",
              "value": 22
            },
            {
              "name": "language",
              "value": "={{ $node['Normalize input'].json.language }}"
            },
            {
              "name": "is_aigc",
              "value": "={{ $node['Normalize input'].json.is_aigc }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "shape",
      "name": "Shape final output",
      "type": "n8n-nodes-base.set",
      "position": [
        1180,
        320
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "sound_name",
              "value": "={{ $json.sound.name }}"
            },
            {
              "name": "sound_slug",
              "value": "={{ $json.sound.sound_slug }}"
            },
            {
              "name": "tiktok_sound_url",
              "value": "={{ $json.sound.tiktok_sound_url }}"
            },
            {
              "name": "tiktok_music_id",
              "value": "={{ $json.sound.tiktok_music_id }}"
            },
            {
              "name": "sound_direction",
              "value": "={{ $node['Wouldliker: recommend sound'].json.sound_direction ? $node['Wouldliker: recommend sound'].json.sound_direction.sonic_family : '' }}"
            },
            {
              "name": "clip_brief",
              "value": "={{ $json.clip_brief }}"
            },
            {
              "name": "caption_short",
              "value": "={{ $json.caption_pack.short }}"
            },
            {
              "name": "caption_mid",
              "value": "={{ $json.caption_pack.mid }}"
            },
            {
              "name": "caption_full",
              "value": "={{ $json.caption_pack.with_hashtags }}"
            },
            {
              "name": "hashtag_pack",
              "value": "={{ ($json.hashtag_pack || []).join(' ') }}"
            },
            {
              "name": "aigc_disclosure",
              "value": "={{ $json.aigc_disclosure_block || '' }}"
            },
            {
              "name": "copy_boundary",
              "value": "={{ $json.copy_boundary }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "wouldliker-v1.3.2",
  "connections": {
    "Normalize input": {
      "main": [
        [
          {
            "node": "Wouldliker: recommend sound",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook: product brief in": {
      "main": [
        [
          {
            "node": "Normalize input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wouldliker: recommend sound": {
      "main": [
        [
          {
            "node": "Wouldliker: generate brief + caption",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wouldliker: generate brief + caption": {
      "main": [
        [
          {
            "node": "Shape final output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}