AutomationFlowsEmail & Gmail › Extract Organizations & Summarize Documents with Foxit and Diffbot

Extract Organizations & Summarize Documents with Foxit and Diffbot

ByRaymond Camden @raymondcamden on n8n.io

This N8N template demonstrates using Foxit's Extraction API to get information from an incoming document and then using Diffbot's APIs to turn the text into a list of organizations mentioned in the document and create a summary. Listen for a new file added to a Google Drive…

Event trigger★★★★☆ complexity16 nodesGoogle Drive TriggerGoogle DriveHTTP RequestGmail
Email & Gmail Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #6286 — we link there as the canonical source.

This workflow follows the Gmail → Google Drive recipe pattern — see all workflows that pair these two integrations.

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 →

Download .json
{
  "id": "jq3ISjs9Ah5SrJEl",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Intelligent Document Flow",
  "tags": [],
  "nodes": [
    {
      "id": "e0e1f4a8-973f-44cc-9103-b2a92fa0cd0c",
      "name": "Fire on New File in Google Drive Folder",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "position": [
        -480,
        -140
      ],
      "parameters": {
        "event": "fileCreated",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": {
          "__rl": true,
          "mode": "url",
          "value": "https://drive.google.com/drive/folders/1yHMr9A68V4QLtd6fIKuM7BE1U4mpN6cD"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1a016850-c310-43a6-9925-538086367d4f",
      "name": "Download File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -260,
        -140
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "8a1bf842-514e-4f28-b799-989de5ee2dae",
      "name": "Upload to Foxit",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -40,
        -140
      ],
      "parameters": {
        "url": "https://na1.fusion.foxit.com/pdf-services/api/documents/upload",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "file",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            }
          ]
        },
        "genericAuthType": "httpCustomAuth"
      },
      "credentials": {
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e5227af7-afff-4f6e-af71-097b9b8b414e",
      "name": "Kick off Foxit Extract",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        180,
        -140
      ],
      "parameters": {
        "url": "https://na1.fusion.foxit.com/pdf-services/api/documents/modify/pdf-extract",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"documentId\": \"{{ $json.documentId }}\",\n  \"extractType\":\"TEXT\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth"
      },
      "credentials": {
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f0c75b63-c65e-4dc3-acc2-83ba5b7557f2",
      "name": "Check Task",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        620,
        -140
      ],
      "parameters": {
        "url": "=https://na1.fusion.foxit.com/pdf-services/api/tasks/{{$json.taskId}}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth"
      },
      "credentials": {
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d6c0040f-8453-4502-b24c-7ea4fb151b93",
      "name": "Is the job done?",
      "type": "n8n-nodes-base.if",
      "position": [
        -420,
        140
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "fa958cdc-d7a8-49b9-b577-13429bd7bcf5",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "COMPLETED"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "07a33ebd-53bd-49f9-967e-7c802b8fa162",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -160,
        380
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "535c42f4-bd75-4ab4-8468-5ce253db452f",
      "name": "Download Extracted Text",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -180,
        100
      ],
      "parameters": {
        "url": "=https://na1.fusion.foxit.com/pdf-services/api/documents/{{ $('Check Task').item.json.resultDocumentId }}/download",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth"
      },
      "credentials": {
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f4804b68-db6d-4fa0-9d38-e8d339ed949a",
      "name": "Get Diffbot Entities",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        80,
        100
      ],
      "parameters": {
        "url": "https://nl.diffbot.com/v1/?fields=entities,summary",
        "method": "POST",
        "options": {},
        "jsonBody": "=[{\n  \"content\":{{ JSON.stringify($json.data) }},\n  \"lang\":\"en\",\n  \"format\":\"plain text\"\n}]",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpQueryAuth"
      },
      "credentials": {
        "httpQueryAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e3f7c3da-cda6-4039-84de-b162dae71b64",
      "name": "Shape Data",
      "type": "n8n-nodes-base.code",
      "position": [
        300,
        100
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\n/*\nfor (const item of $input.all()) {\n  console.log('in loop', item);\n  item.json.myNewField = 1;\n}\n*/\nconsole.log('hello ray');\n\nlet organizations = $input.all()[0].json.entities.filter(d => {\n  let hasOrg = false;\n  let isConfident = false;\n  let types = d.allTypes.reduce((names, i) => {\n    names.push(i.name);\n    return names;\n  },[]);\n  if(types.indexOf('organization') >= 0) hasOrg = true;\n  isConfident = d.confidence >= 0.85;\n  return (hasOrg && isConfident);\n});\n\nlet orgNames = organizations.reduce((names, o) => {\n  names.push(o.name);\n  return names;\n}, []);\n\nreturn { organizations:orgNames, summary:$input.all()[0].json.summary }\n"
      },
      "typeVersion": 2
    },
    {
      "id": "540a774b-82ee-41b2-9ac1-b21e30bfa71a",
      "name": "Gmail",
      "type": "n8n-nodes-base.gmail",
      "position": [
        720,
        100
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.html }}",
        "options": {},
        "subject": "intelligent Document Report on Upload"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "eed7c59c-124e-461c-a7d0-1100376470f1",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        -320
      ],
      "parameters": {
        "width": 320,
        "content": "## Ingestion\n\nThe workflow kicks off when a new file is added to Google Drive in a particular folder. The data is downloaded to n8n."
      },
      "typeVersion": 1
    },
    {
      "id": "9a39a52d-4765-47ce-91d2-f61b6df47838",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        -320
      ],
      "parameters": {
        "width": 760,
        "content": "## Uploading and Extracting\nNext, the document is uploaded to Foxit and the Extraction API is fired to get the text. This is an async job so we check the status in a loop."
      },
      "typeVersion": 1
    },
    {
      "id": "fae16938-8a56-45b7-b3cf-87ee7a17ab09",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        280
      ],
      "parameters": {
        "content": "## Analyzing\n\nAfter the Extract result is downloaded, Diffbot is called and asked to analyze and summarize the contents."
      },
      "typeVersion": 1
    },
    {
      "id": "574e824b-1f88-469c-b3e1-662ed7a653c0",
      "name": "Make Email Contents",
      "type": "n8n-nodes-base.code",
      "position": [
        520,
        100
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nlet input = $input.all()[0].json;\nlet doc = $('Fire on New File in Google Drive Folder').first().json.name;\nlet link = $('Fire on New File in Google Drive Folder').first().json.webViewLink;\n\nlet html = `\n<h2>Docucument Report for <a href=\"${link}\">${doc}</a></h2>\n\n<p>\nThis document discussed the following organizations:\n<ul>\n`;\nlet orgs = input.organizations.reduce((s, o) => {\n  return s + `<li>${o}</li>`;\n},'');\n\nhtml += orgs + `\n</ul>\n\n<p>\nSummary for this document:\n</p>\n<p>\n${input.summary}\n</p>\n`;\n\nreturn { html };"
      },
      "typeVersion": 2
    },
    {
      "id": "bb085e4b-04b3-4d6e-b1a0-722766490849",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        280
      ],
      "parameters": {
        "width": 500,
        "content": "## Shaping and Emailing\n\nFinally, we shape the result from Diffbot and create an HTML string that can be used in the email stage."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "85760a47-a1c3-4928-8065-23bd5de0b437",
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Check Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Task": {
      "main": [
        [
          {
            "node": "Is the job done?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shape Data": {
      "main": [
        [
          {
            "node": "Make Email Contents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download File": {
      "main": [
        [
          {
            "node": "Upload to Foxit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload to Foxit": {
      "main": [
        [
          {
            "node": "Kick off Foxit Extract",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is the job done?": {
      "main": [
        [
          {
            "node": "Download Extracted Text",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Make Email Contents": {
      "main": [
        [
          {
            "node": "Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Diffbot Entities": {
      "main": [
        [
          {
            "node": "Shape Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Kick off Foxit Extract": {
      "main": [
        [
          {
            "node": "Check Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Extracted Text": {
      "main": [
        [
          {
            "node": "Get Diffbot Entities",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fire on New File in Google Drive Folder": {
      "main": [
        [
          {
            "node": "Download File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This N8N template demonstrates using Foxit's Extraction API to get information from an incoming document and then using Diffbot's APIs to turn the text into a list of organizations mentioned in the document and create a summary. Listen for a new file added to a Google Drive…

Source: https://n8n.io/workflows/6286/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Email & Gmail

This automation template streamlines the process of capturing screenshots for multiple URLs. Instead of manually visiting each URL, taking a screenshot, and organizing the results, this workflow autom

HTTP Request, Google Sheets, Google Drive +2
Email & Gmail

Recruiting agency. Uses typeformTrigger, airtable, httpRequest, googleDrive. Event-driven trigger; 36 nodes.

Typeform Trigger, Airtable, HTTP Request +4
Email & Gmail

🎥 Analyze YouTube Video for Summaries, Transcripts & Content + Google Gemini AI. Uses stickyNote, httpRequest, googleDrive, gmail. Event-driven trigger; 33 nodes.

HTTP Request, Google Drive, Gmail +2
Email & Gmail

Client Form → Draft → Approve → Sign → Deliver, fully automated

Jot Form Trigger, Gmail, Google Drive +4
Email & Gmail

This workflow is perfect for content creators, international teams, and businesses that need to translate documents into multiple languages automatically. Whether you're localizing documentation, tran

Google Drive Trigger, Google Drive, Write Binary File +3