{
  "name": "Upwork Job Finder with AI Qualification",
  "nodes": [
    {
      "parameters": {
        "resume": "webhook",
        "httpMethod": "POST",
        "options": {}
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        240,
        -80
      ],
      "id": "e5466d3e-e669-42c6-8c65-da41a5ced722",
      "name": "Wait",
      "webhookId": "232d9194-2dd1-42c6-9db3-4b5bd947a7c0"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/matthewjames~upwork-job-scraper/runs",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "webhooks",
              "value": "={{ `[ { \"eventTypes\": [\"ACTOR.RUN.SUCCEEDED\"], \"requestUrl\": \"${$execution.resumeUrl}\" } ]`.base64Encode() }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "{\n  \"jobsPerPage\": \"10\",\n  \"scrapePages\": 6,\n  \"startUrls\": \"https://www.upwork.com/nx/search/jobs?&proposals=0-4,5-9,10-14&q=(automation%20OR%20automate)&t=0,1\",\n  \"paymentVerified\": \"Yes\"\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        20,
        -80
      ],
      "id": "610b8445-ef7c-4e38-9aa8-1d58289df8bd",
      "name": "Scrape UW Jobs Apify"
    },
    {
      "parameters": {
        "url": "=https://api.apify.com/v2/datasets/{{ $('Scrape UW Jobs Apify').item.json.data.defaultDatasetId }}/items",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "format",
              "value": "json"
            },
            {
              "name": "limit",
              "value": "100"
            },
            {
              "name": "clean",
              "value": "true"
            },
            {
              "name": "simplified",
              "value": "false"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        -80
      ],
      "id": "3854cb8a-3fdc-446c-b976-60e2a571be97",
      "name": "Get Dataset Items Apify",
      "alwaysOutputData": false
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "gpt-4o",
          "mode": "list",
          "cachedResultName": "GPT-4O"
        },
        "messages": {
          "values": [
            {
              "content": "=We're an operations agency that builds outreach systems, CRM systems, project management systems, no-code systems, and integrations.\n\nBelow is a job description. Filter it for relevance (true or false) in JSON. Some of the platforms we use include Airtable, ClickUp, ChatGPT, Make, Monday, Zapier, LinkedIn, Google Sheets. If relevant, write a short introductory icebreaker. If a job post mentions other platforms, that's fine, as long as it's not part of the list of platforms we explicitly don't use.\n\nNote:\n- API integrations are good, since we can develop them using no-code. \n- We don't develop full-stack apps.\n- Platforms we explicitly don't use: Python, Telegram, Whatsapp, Facebook, Bubble.io, Softr, Google Apps scripts, or chatbots\n- We're not VAs/virtual assistants,\n- We don't work on very tiny projects (like integrations that will take less than 10 minutes to do) or those that require extremely fast, same-day or 24hr delivery.\n\nExample client projects:\n- End to end project management for a $1M/yr copywriting agency\n- Outbound acquisition system that grew a content company from $10K/mo to $90K/mo in 12 mo\n- Monday.com CRM and PM for a recruiting company doing >$1M/yr\n- Automated content generation system for an SEO agency doing >$10M/yr\n- ClickUp CRM build for a marketing company doing $1M/yr\n\n---\n\nProduct Review Writer\n\nSee attached doc before responding. I need an excellent writer to do 2 product reviews 600-800 words each. I'll provide the products/sites to review.\n\nProduct 1: https://trycortexi.com/\nProduct 2: https://quietumplus.com/\n\nBudget: $300\nPosted On: April 11, 2023 22:07 UTC\nCategory: Product Reviews\nSkills: Writing, English, Proofreading, Content Writing, Review, Creative Writing\nCountry: United States"
            },
            {
              "content": "{\"result\":\"false\", \"reason\": \"This is about writing. Nothing to do with systems.\", \"icebreaker\":\"\"}",
              "role": "assistant"
            },
            {
              "content": "TikTok Media Buyer\n\nWe're looking for a media buyer to specialize in running TikTok ads and other social media platforms.\n\nYou need to be proficient in English.\n\nBudget: $200"
            },
            {
              "content": "{\"result\":\"false\", \"reason\": \"Focuses on social media marketing—not ops.\", \"icebreaker\":\"\"}",
              "role": "assistant"
            },
            {
              "content": "Airtable Expert Needed\n\nNeed help linking things in Airtable and using interfaces for my company. Content is already in Airtable, just need help maximizing what Airtable can do and organizing it so it's easier to manage. \n\nHourly Range: $30.00-$60.00"
            },
            {
              "content": "{\"result\":\"true\", \"reason\": \"Involves automating Airtable, which aligns with our expertise in systems and no-code tools.\", \"icebreaker\":\"Confident I'm the man you're looking for. I use Airtable to manage a copywriting company that does ~$1M/yr. We make heavy use of interfaces & some less known Airtable features. I also routinely build Airtable flows, databases, etc.\"}",
              "role": "assistant"
            },
            {
              "content": "={{ $('Get Dataset Items Apify').item.json.Title }}\n\n{{ $('Get Dataset Items Apify').item.json.Description }}"
            }
          ]
        },
        "jsonOutput": true,
        "options": {
          "maxTokens": 350,
          "temperature": 0.7
        }
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        1700,
        0
      ],
      "id": "890e2fcd-af18-4b21-9bcf-888ca373a1e0",
      "name": "OpenAI"
    },
    {
      "parameters": {
        "operation": "create",
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_AIRTABLE_BASE_ID"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_AIRTABLE_TABLE_ID"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Title": "={{ $('Get Dataset Items Apify').item.json.Title }}",
            "Description": "={{ $('Get Dataset Items Apify').item.json.Description }}",
            "URL": "={{ $('Get Dataset Items Apify').item.json.URL }}",
            "Status": "Intake",
            "Date Posted": "={{ $('Set Vars 3').item.json.timePosted }}",
            "Country": "={{ $('Get Dataset Items Apify').item.json.Location }}",
            "Project Type": "={{ $('Get Dataset Items Apify').item.json[\"Project Payment Type\"] }}",
            "Budget Estimate": "={{ $('Set Vars 3').item.json.projectBudget || null}}",
            "Min Budget": "={{ $('Set Vars 3').item.json.hourlyMin || null }}",
            "Max Budget": "={{ $('Set Vars 3').item.json.hourlyMax || null }}",
            "Icebreaker": "={{ $json.message.content.icebreaker }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Id",
              "displayName": "Id",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": true
            },
            {
              "id": "Date Added",
              "displayName": "Date Added",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": true
            },
            {
              "id": "Title",
              "displayName": "Title",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Description",
              "displayName": "Description",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "URL",
              "displayName": "URL",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "Aplied",
                  "value": "Aplied"
                },
                {
                  "name": "Intake",
                  "value": "Intake"
                },
                {
                  "name": "Not relevant",
                  "value": "Not relevant"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Date Posted",
              "displayName": "Date Posted",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "dateTime",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Country",
              "displayName": "Country",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Project Type",
              "displayName": "Project Type",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "Hourly",
                  "value": "Hourly"
                },
                {
                  "name": "Project",
                  "value": "Project"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Budget Estimate",
              "displayName": "Budget Estimate",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Min Budget",
              "displayName": "Min Budget",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Max Budget",
              "displayName": "Max Budget",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Hours since posted",
              "displayName": "Hours since posted",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": true
            },
            {
              "id": "Copyable Message",
              "displayName": "Copyable Message",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Icebreaker",
              "displayName": "Icebreaker",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Loom URL",
              "displayName": "Loom URL",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Application Template",
              "displayName": "Application Template",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "typecast": true
        }
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        2260,
        0
      ],
      "id": "db34bf60-ed7d-4720-8486-e11231a61c6b",
      "name": "Airtable"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        1480,
        0
      ],
      "id": "1ad7b7ef-a08e-443d-a60e-76973aaf7f82",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "3076072e-6741-48f5-a35d-d485999caa68",
              "name": "project",
              "value": "={{ $json.Budget.indexOf(\"-\") === -1 }}",
              "type": "boolean"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        860,
        0
      ],
      "id": "a2cc402a-4ebc-45b4-b311-5c4f7372848d",
      "name": "Set Vars 1"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "715d4289-cdd3-4ba0-a741-9538ef0ab5e4",
              "name": "timePosted",
              "value": "={{ $now.minus($json.amountAgo, $json.unitAgo) }}",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1240,
        0
      ],
      "id": "8473ce58-5339-4ab7-a1c0-2d4c869ccfbe",
      "name": "Set Vars 3"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c74e13ef-6f97-413f-950b-8ba89b18218b",
              "name": "amountAgo",
              "value": "={{ $json[\"Time Posted\"].split(\" \")[1] }}",
              "type": "string"
            },
            {
              "id": "9505c427-6ffc-47e2-a84c-1b94d1405315",
              "name": "unitAgo",
              "value": "={{ $json[\"Time Posted\"].split(\" \")[2] }}",
              "type": "string"
            },
            {
              "id": "fe0750f0-1f12-4cda-bcd1-9a7d7953a215",
              "name": "projectBudget",
              "value": "={{ ($json.project ? $('Get Dataset Items Apify').item.json.Budget : null)  }}",
              "type": "number"
            },
            {
              "id": "5fe7ca6e-c77e-4d32-bef6-c9ddc312abf6",
              "name": "hourlyMin",
              "value": "={{ $json.project ? null : $json.Budget.split(\"-\")[0].replaceAll(\"$\", \"\").split(\".\")[0] }}",
              "type": "number"
            },
            {
              "id": "11ce8a91-8d35-4bd6-9ee1-4d9117b085fe",
              "name": "hourlyMax",
              "value": "={{ $json.project ? null : $json.Budget.split(\"-\")[1].replaceAll(\"$\", \"\").split(\".\")[0] }}",
              "type": "number"
            }
          ]
        },
        "options": {
          "ignoreConversionErrors": true
        }
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1060,
        0
      ],
      "id": "5bf7f053-5d95-4d39-b09f-b72cc3193174",
      "name": "Set Vars 2"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "b4acbcab-fad5-45f2-a2a6-299a5744e4b6",
              "leftValue": "={{ $json.message.content.result.toBoolean() }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        2060,
        0
      ],
      "id": "e781d578-fce4-4e69-83ca-9786e547419a",
      "name": "Relevant?"
    },
    {
      "parameters": {
        "operation": "search",
        "base": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_AIRTABLE_BASE_ID"
        },
        "table": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_AIRTABLE_TABLE_ID"
        },
        "filterByFormula": "{Status} = \"Intake\"",
        "options": {}
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        440,
        120
      ],
      "id": "cc75dbf8-1f44-42f1-9656-8e60c98e937b",
      "name": "Get Jobs"
    },
    {
      "parameters": {
        "mode": "combine",
        "advanced": true,
        "mergeByFields": {
          "values": [
            {
              "field1": "Job ID",
              "field2": "Job ID"
            }
          ]
        },
        "joinMode": "keepNonMatches",
        "outputDataFrom": "input1",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        680,
        0
      ],
      "id": "f82bb81a-3bab-40d2-929d-00a1d46da8e4",
      "name": "Merge"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -200,
        -80
      ],
      "id": "44db8538-ada0-46d4-bf48-eb9af1829cee",
      "name": "Schedule Trigger"
    }
  ],
  "connections": {
    "Scrape UW Jobs Apify": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Get Dataset Items Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Dataset Items Apify": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI": {
      "main": [
        [
          {
            "node": "Relevant?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Vars 1": {
      "main": [
        [
          {
            "node": "Set Vars 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Vars 3": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Vars 2": {
      "main": [
        [
          {
            "node": "Set Vars 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Relevant?": {
      "main": [
        [
          {
            "node": "Airtable",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Jobs": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Set Vars 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Scrape UW Jobs Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false
}
