The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "",
"name": "05a - Listings Data API",
"active": true,
"nodes": [
{
"id": "wh-get-unscored",
"name": "Webhook: GET listings/unscored",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
],
"parameters": {
"httpMethod": "GET",
"path": "listings/unscored",
"responseMode": "responseNode",
"options": {}
}
},
{
"id": "pg-select-unscored",
"name": "Postgres: Select Unscored",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2,
"position": [
256,
0
],
"parameters": {
"operation": "executeQuery",
"query": "SELECT id, source, title, company, location, description, priority_bonus FROM listings WHERE scored_at IS NULL AND quarantine_reason IS NULL AND date_seen >= CURRENT_DATE - INTERVAL '8 days';",
"options": {}
},
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
},
{
"id": "filter-phantom",
"name": "Filter: Drop Phantom Rows",
"type": "n8n-nodes-base.filter",
"typeVersion": 2.2,
"position": [
512,
0
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "has-id",
"leftValue": "={{ $json.id }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gt"
}
}
],
"combinator": "and"
},
"options": {}
}
},
{
"id": "respond-unscored",
"name": "Respond: Send Unscored",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
768,
0
],
"parameters": {
"respondWith": "allIncomingItems",
"options": {}
}
},
{
"id": "wh-post-score",
"name": "Webhook: POST listings/score",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
256
],
"parameters": {
"httpMethod": "POST",
"path": "listings/score",
"responseMode": "lastNode",
"options": {}
}
},
{
"id": "pg-update-score",
"name": "Postgres: UPDATE Score",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2,
"position": [
256,
256
],
"parameters": {
"operation": "executeQuery",
"query": "UPDATE listings SET score = $1, rationale = $2, scored_at = NOW() WHERE id = $3 RETURNING id, score;",
"options": {
"queryReplacement": "={{ $json.body.score }},{{ $json.body.rationale }},{{ $json.body.id }}"
}
},
"credentials": {
"postgres": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Webhook: GET listings/unscored": {
"main": [
[
{
"node": "Postgres: Select Unscored",
"type": "main",
"index": 0
}
]
]
},
"Postgres: Select Unscored": {
"main": [
[
{
"node": "Filter: Drop Phantom Rows",
"type": "main",
"index": 0
}
]
]
},
"Filter: Drop Phantom Rows": {
"main": [
[
{
"node": "Respond: Send Unscored",
"type": "main",
"index": 0
}
]
]
},
"Webhook: POST listings/score": {
"main": [
[
{
"node": "Postgres: UPDATE Score",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"timezone": "Europe/Berlin",
"callerPolicy": "workflowsFromSameOwner"
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
postgres
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
05a - Listings Data API. Uses postgres. Webhook trigger; 6 nodes.
Source: https://github.com/ozlar34/job-match-radar/blob/main/workflows/05a-listings-api/listings-api.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Admin API - Analytics Dashboard. Uses postgres. Webhook trigger; 11 nodes.
This n8n template demonstrates how to create a comprehensive voice-powered restaurant assistant that handles table reservations, food orders, and restaurant information requests through natural langua
Acts as a virtual receptionist for the restaurant, handling incoming calls via VAPI without human intervention. It collects user details (name, booking time, number of people) for table bookings, chec