<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tideline Data</title>
    <description>The latest articles on DEV Community by Tideline Data (@tidelinedata).</description>
    <link>https://dev.to/tidelinedata</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4235740%2F0b74a08d-52bb-401a-ad6f-670686f57340.png</url>
      <title>DEV Community: Tideline Data</title>
      <link>https://dev.to/tidelinedata</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tidelinedata"/>
    <language>en</language>
    <item>
      <title>How to turn scanned invoices and receipt photos into spreadsheet rows (no OCR setup)</title>
      <dc:creator>Tideline Data</dc:creator>
      <pubDate>Wed, 11 Nov 2026 04:34:40 +0000</pubDate>
      <link>https://dev.to/tidelinedata/how-to-turn-scanned-invoices-and-receipt-photos-into-spreadsheet-rows-no-ocr-setup-4d42</link>
      <guid>https://dev.to/tidelinedata/how-to-turn-scanned-invoices-and-receipt-photos-into-spreadsheet-rows-no-ocr-setup-4d42</guid>
      <description>&lt;p&gt;You have a folder of scanned invoices, or a stack of receipt photos from your phone, and you need the line items in a spreadsheet: item, quantity, price, amount.&lt;/p&gt;

&lt;p&gt;Most OCR tools give you one block of text. The words are all there, but the columns are gone: "Toner cartridge K-220 2 64.90 129.80" lands on one line, and on a photo the prices often end up on a different line from their items. Then you fix it by hand.&lt;/p&gt;

&lt;p&gt;This guide uses a ready-made tool on Apify that returns each table as &lt;strong&gt;rows of cells&lt;/strong&gt;, also for scans and photos. You paste links to your files, click Start, and get rows like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Unit price&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A4 copy paper, box&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;21.50&lt;/td&gt;
&lt;td&gt;86.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toner cartridge K-220&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;64.90&lt;/td&gt;
&lt;td&gt;129.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desk organiser&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;12.75&lt;/td&gt;
&lt;td&gt;38.25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's the real output for the scanned invoice in the cover image (an invented sample).&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A free Apify account. The free plan includes $5 of usage every month, enough for over 1,500 pages.&lt;/li&gt;
&lt;li&gt;Your files as links (Google Drive or Dropbox share links work), or one file to upload.&lt;/li&gt;
&lt;li&gt;About 5 minutes. Step 4 uses Python, but it's optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open the tool
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://apify.com/tidelinedata/pdf-image-to-text-ocr" rel="noopener noreferrer"&gt;PDF &amp;amp; Image to Text OCR – Tables as Rows&lt;/a&gt; on the Apify Store and click &lt;strong&gt;Try for free&lt;/strong&gt;. Sign up or log in, and the tool opens on its &lt;strong&gt;Input&lt;/strong&gt; page. It comes with a sample scanned invoice and a receipt photo already filled in, so you can click &lt;strong&gt;Start&lt;/strong&gt; once just to see what comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Add your files
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;File links&lt;/strong&gt;, paste one link per line. PDFs, JPG, PNG, TIFF, WebP and BMP all work: digital PDFs, scans, phone photos and screenshots. For Google Drive or Dropbox, share the file so that "anyone with the link" can open it, then paste the share link. The tool turns it into a download.&lt;/li&gt;
&lt;li&gt;Or use &lt;strong&gt;Or upload one file&lt;/strong&gt; to upload a single file from your computer.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Languages in the documents&lt;/strong&gt;, pick only the languages your files use. English alone is the most accurate setting for English receipts and photos. Adding more languages than you need makes the results worse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Read the results
&lt;/h2&gt;

&lt;p&gt;When the run finishes, the &lt;strong&gt;Output&lt;/strong&gt; tab shows &lt;strong&gt;one row per page&lt;/strong&gt;. Each page has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text&lt;/code&gt;: the whole page in reading order. Table cells are separated by tabs, so if you paste it into a spreadsheet, the columns line up.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tables&lt;/code&gt;: every table on the page as a list of rows, and &lt;code&gt;tablesCsv&lt;/code&gt;, the same tables as CSV.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;source&lt;/code&gt;: &lt;code&gt;text_layer&lt;/code&gt; for digital PDF pages (read directly, exact) or &lt;code&gt;ocr&lt;/code&gt; for scans and photos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;confidence&lt;/code&gt; and &lt;code&gt;empty&lt;/code&gt;: so you can spot faint scans and blank pages. Blank pages are not charged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a receipt photo, the items keep their prices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"tables"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"rows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Milk 1L"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1.29"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bread"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2.10"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Apples 1kg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3.45"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Coffee 250g"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4.99"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"TOTAL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"11.83"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CARD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"11.83"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can download the output as JSON, CSV or Excel from the Output tab. That gives one row per page. For one spreadsheet row per &lt;strong&gt;line item&lt;/strong&gt;, use step 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 (optional): One CSV with every line item
&lt;/h2&gt;

&lt;p&gt;This short Python script runs the tool on your files and writes every table row from every file into one &lt;code&gt;line-items.csv&lt;/code&gt;, with the file name and page in front.&lt;/p&gt;

&lt;p&gt;Install the client with &lt;code&gt;pip install apify-client&lt;/code&gt;, and copy your API token from &lt;strong&gt;Settings → API &amp;amp; Integrations&lt;/strong&gt; in the Apify Console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_APIFY_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"tidelinedata/pdf-image-to-text-ocr"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"fileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"https://example.com/invoice-001.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"https://example.com/receipt-photo.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"languages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"eng"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"line-items.csv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"defaultDatasetId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"tables"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"rows"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the two sample files, the CSV looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scanned&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Qty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Unit&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Amount&lt;/span&gt;
&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scanned&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"A4 copy paper, box"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;21.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;86.00&lt;/span&gt;
&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scanned&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Toner&lt;/span&gt; &lt;span class="n"&gt;cartridge&lt;/span&gt; &lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;64.90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;129.80&lt;/span&gt;
&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scanned&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Desk&lt;/span&gt; &lt;span class="n"&gt;organiser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;12.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;38.25&lt;/span&gt;
&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;photo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Milk&lt;/span&gt; &lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.29&lt;/span&gt;
&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;receipt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;photo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Bread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2.10&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open it in Excel or Google Sheets, filter by file, and add up the amounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on a schedule (no code)
&lt;/h2&gt;

&lt;p&gt;If new invoices land in the same place every day, save your input as a &lt;strong&gt;task&lt;/strong&gt; (top right on the Input page, &lt;strong&gt;Save as a new task&lt;/strong&gt;), then add it to a schedule under &lt;strong&gt;Schedules&lt;/strong&gt;. The task's &lt;strong&gt;Integrations&lt;/strong&gt; tab can upload the results to Google Drive or email them through Gmail. Make and Zapier can also start runs and pick up the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;$3 per 1,000 pages that contain text ($0.003 a page). Blank pages and files that fail to open are free, and there's no separate OCR fee.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One receipt photo: $0.003&lt;/li&gt;
&lt;li&gt;500 one-page scanned invoices: $1.50&lt;/li&gt;
&lt;li&gt;A 200-page digital report: $0.60&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can set a maximum cost per run, and the tool stops when it reaches it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips and limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best results:&lt;/strong&gt; scans at 200–300 DPI, or sharp photos taken straight on with even light. Tilted scans are straightened automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Printed text only.&lt;/strong&gt; Handwriting isn't supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A table that continues onto the next page&lt;/strong&gt; comes back as one table per page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check &lt;code&gt;confidence&lt;/code&gt;&lt;/strong&gt; on faint or tiny print. Low values mean some characters may be wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-column pages&lt;/strong&gt; come out column by column, in reading order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password-protected PDFs&lt;/strong&gt; aren't supported yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your files are read inside your own run, and the results go only to your own Apify storage. Nothing is kept by the tool's maker.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tideline Data built this tool. This article was drafted with AI and checked against real runs. Questions or a file it gets wrong? Open an issue on the tool's Issues tab.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>pdf</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to get daily EU tender alerts by email (no code, a few cents a day)</title>
      <dc:creator>Tideline Data</dc:creator>
      <pubDate>Mon, 09 Nov 2026 19:07:18 +0000</pubDate>
      <link>https://dev.to/tidelinedata/how-to-get-daily-eu-tender-alerts-by-email-no-code-a-few-cents-a-day-1emf</link>
      <guid>https://dev.to/tidelinedata/how-to-get-daily-eu-tender-alerts-by-email-no-code-a-few-cents-a-day-1emf</guid>
      <description>&lt;p&gt;Every working day, public buyers across Europe post thousands of new contract notices on TED (Tenders Electronic Daily), the EU's official procurement journal. If you sell to governments, hospitals, universities or city councils, some of them are for you.&lt;/p&gt;

&lt;p&gt;The hard part is finding them. The notices come in 24 languages, sector codes (CPV) are hard to read, and most tender-alert services cost hundreds of euros a month.&lt;/p&gt;

&lt;p&gt;This guide sets up a morning email of &lt;strong&gt;new&lt;/strong&gt; tenders in your sector and countries, using a ready-made tool on Apify. No code, and usually a few cents a day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A free Apify account. The free plan includes $5 of usage every month.&lt;/li&gt;
&lt;li&gt;A Gmail account, for the alert email.&lt;/li&gt;
&lt;li&gt;About 10 minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open the tool
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://apify.com/tidelinedata/eu-tenders" rel="noopener noreferrer"&gt;EU Tender Alerts &amp;amp; Search&lt;/a&gt; on the Apify Store and click &lt;strong&gt;Try for free&lt;/strong&gt;. Sign up or log in, and the tool opens on its &lt;strong&gt;Input&lt;/strong&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Describe the tenders you want
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Categories:&lt;/strong&gt; pick one or more plain-English sectors, for example &lt;em&gt;IT, software and IT services&lt;/em&gt; or &lt;em&gt;Cleaning, waste and environmental services&lt;/em&gt;. You don't need to know CPV codes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keywords&lt;/strong&gt; (optional): narrow it down. Tenders are written in the buyer's language, so add local words too, for example &lt;code&gt;software&lt;/code&gt;, &lt;code&gt;logiciel&lt;/code&gt;, &lt;code&gt;Software&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buyer countries:&lt;/strong&gt; two-letter codes such as &lt;code&gt;IE&lt;/code&gt;, &lt;code&gt;NL&lt;/code&gt;, &lt;code&gt;DE&lt;/code&gt;. Leave it empty for all of Europe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum days left to bid:&lt;/strong&gt; set &lt;code&gt;10&lt;/code&gt; so you only see tenders you still have time to answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimum value (EUR):&lt;/strong&gt; for example &lt;code&gt;50000&lt;/code&gt;, to skip very small contracts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. In a few seconds you'll see a table of matching tenders from the last 7 days: buyer, country, category, value, deadline, days left and links to the notice. If there are too many or too few, change the filters and run it again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Turn on "Only new tenders"
&lt;/h2&gt;

&lt;p&gt;Switch on &lt;strong&gt;Only new tenders (for daily alerts)&lt;/strong&gt; and type a &lt;strong&gt;Monitor name&lt;/strong&gt;, such as &lt;code&gt;it-tenders-benelux&lt;/code&gt;. The tool now remembers what it has already shown you, so each run returns only tenders you haven't seen.&lt;/p&gt;

&lt;p&gt;Then click &lt;strong&gt;Save as a new task&lt;/strong&gt; (top right) and give it a name. A task is your saved search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Run it every morning
&lt;/h2&gt;

&lt;p&gt;In the left menu, open &lt;strong&gt;Schedules&lt;/strong&gt; and create a new schedule. Add your task, set it to run daily (for example at 7:00), and save. From now on it runs on its own every morning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Get the results by email
&lt;/h2&gt;

&lt;p&gt;Open your task's &lt;strong&gt;Integrations&lt;/strong&gt; tab and choose &lt;strong&gt;Send results email via Gmail&lt;/strong&gt;. Connect your Gmail account and save. Each morning's new tenders now arrive as an attachment you can open in Excel or Google Sheets.&lt;/p&gt;

&lt;p&gt;Prefer something else? The same tab has &lt;strong&gt;Send notification via Slack&lt;/strong&gt; and &lt;strong&gt;Upload results to GDrive&lt;/strong&gt;. To add rows straight to a Google Sheet, use the &lt;strong&gt;Google Sheets Import &amp;amp; Export&lt;/strong&gt; integration or connect Apify to Google Sheets through Zapier or Make.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The tool charges $3 per 1,000 tenders. A typical daily alert finds 10 to 30 new tenders, which is under $2 a month and fits inside Apify's free $5 monthly credit. You can also cap any run with &lt;strong&gt;Maximum tenders&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Make one task per sector or region. Different monitor names keep their "already seen" lists separate.&lt;/li&gt;
&lt;li&gt;Values in other currencies (PLN, SEK, CZK and others) are converted to approximate EUR, so the value filter works across countries.&lt;/li&gt;
&lt;li&gt;About half of notices don't publish a value. When you set a value filter, those are skipped. Turn off &lt;em&gt;Skip tenders without a stated value&lt;/em&gt; to see them too.&lt;/li&gt;
&lt;li&gt;The data comes from TED, the official EU source, and contains no personal contact details. Open the notice link to find how to bid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Data: TED – Tenders Electronic Daily, © European Union, reused under the Commission's reuse policy. Tideline Data built this tool; it is independent and not affiliated with the EU Publications Office. This article was drafted by AI and checked against the live tool.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>procurement</category>
      <category>nocode</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
