Process invoices faster than ever by extracting data and structuring it automatically with our advanced AI. Get quick and accurate data from any invoice, no matter the layout.
The AI Invoice parser automatically detects invoice layouts without the manual effort previously required to supply document parsing templates for reference.
Please ensure that your PDF file does not exceed 100 pages. Files containing more than 100 pages will not be processed.
Controls the encryption algorithm used for data encryption. See User-Controlled Encryption for more information. The available algorithms are: AES128, AES192, AES256.
DataEncryptionKey
string
No
-
Controls the encryption key used for data encryption. See User-Controlled Encryption for more information.
DataEncryptionIV
string
No
-
Controls the encryption IV used for data encryption. See User-Controlled Encryption for more information.
DataDecryptionAlgorithm
string
No
-
Controls the decryption algorithm used for data decryption. See User-Controlled Encryption for more information. The available algorithms are: AES128, AES192, AES256.
DataDecryptionKey
string
No
-
Controls the decryption key used for data decryption. See User-Controlled Encryption for more information.
DataDecryptionIV
string
No
-
Controls the decryption IV used for data decryption. See User-Controlled Encryption for more information.
curl -X POST \https://api.pdf.co/v1/ai-invoice-parser
curl -X POST \https://api.pdf.co/v1/ai-invoice-parser
var https = require("https");// The authentication key (API Key).// Get your own by registering at https://app.pdf.coconst API_KEY = "YOUR_API_KEY_HERE";// Direct URL of the source PDF file// You can also upload your own file into PDF.co and use it as url. Check "Upload File" samples for code snippets: https://github.com/bytescout/pdf-co-api-samples/tree/master/File%20Upload/const SourceFileUrl = "https://pdfco-test-files.s3.us-west-2.amazonaws.com/document-parser/sample-invoice.pdf";// Prepare request to `AI Invoice Parser` API endpointvar queryPath = `/v1/ai-invoice-parser`;// JSON payload for api requestvar jsonPayload = JSON.stringify({ url: SourceFileUrl});var reqOptions = { host: "api.pdf.co", method: "POST", path: queryPath, headers: { "x-api-key": API_KEY, "Content-Type": "application/json", "Content-Length": Buffer.byteLength(jsonPayload, 'utf8') }};var postRequest = https.request(reqOptions, (response) => { let responseData = ''; response.on("data", (chunk) => { responseData += chunk; }); response.on("end", () => { try { // Parse JSON response var data = JSON.parse(responseData); if (data.error == false) { console.log(`Job #${data.jobId} has been created!`); checkIfJobIsCompleted(data.jobId, data.url); } else { // Service reported error console.log(data.message); } } catch (error) { console.error("Error parsing JSON response:", error); } });}).on("error", (e) => { // Request error console.log(e);});// Write request datapostRequest.write(jsonPayload);postRequest.end();function checkIfJobIsCompleted(jobId, resultFileUrl) { let queryPath = `/v1/job/check`; // JSON payload for api request let jsonPayload = JSON.stringify({ jobid: jobId }); let reqOptions = { host: "api.pdf.co", path: queryPath, method: "POST", headers: { "x-api-key": API_KEY, "Content-Type": "application/json", "Content-Length": Buffer.byteLength(jsonPayload, 'utf8') } }; // Send request var postRequest = https.request(reqOptions, (response) => { let responseData = ''; response.setEncoding("utf8"); response.on("data", (chunk) => { responseData += chunk; }); response.on("end", () => { try { // Parse JSON response let data = JSON.parse(responseData); console.log(`Checking Job #${jobId}, Status: ${data.status}, Time: ${new Date().toLocaleString()}`); if (data.status == "working") { // Check again after 3 seconds setTimeout(function(){ checkIfJobIsCompleted(jobId, resultFileUrl);}, 3000); } else if (data.status == "success") { console.log("** Response **") console.log(data); } else { console.log(`Operation ended with status: "${data.status}".`); } } catch (error) { console.error("Error parsing JSON response:", error); } }); }); // Write request data postRequest.write(jsonPayload); postRequest.end();}
import osimport requests # pip install requestsimport timeimport datetime# The authentication key (API Key).# Get your own by registering at https://app.pdf.coAPI_KEY = "******************************************"# Base URL for PDF.co Web API requestsBASE_URL = "https://api.pdf.co/v1"# Direct URL of source PDF file.# You can also upload your own file into PDF.co and use it as url. Check "Upload File" samples for code snippets: https://github.com/bytescout/pdf-co-api-samples/tree/master/File%20Upload/SourceFileURL = "https://pdfco-test-files.s3.us-west-2.amazonaws.com/document-parser/sample-invoice.pdf"def main(args = None): getParsedInvoice(SourceFileURL)def getParsedInvoice(uploadedFileUrl): """AI Invoice Parser using PDF.co Web API""" # Prepare requests params as JSON # See documentation: https://apidocs.pdf.co parameters = {} parameters["url"] = uploadedFileUrl # Prepare URL for 'AI Invoice Parser' API request url = "{}/ai-invoice-parser".format(BASE_URL) # Execute request and get response as JSON response = requests.post(url, data=parameters, headers={ "x-api-key": API_KEY }) if (response.status_code == 200): json = response.json() if json["error"] == False: # Asynchronous job ID jobId = json["jobId"] # Check the job status in a loop. # If you don't want to pause the main thread you can rework the code # to use a separate thread for the status checking and completion. while True: status = checkJobStatus(jobId) # Possible statuses: "working", "failed", "aborted", "success". # Display timestamp and status (for demo purposes) print(datetime.datetime.now().strftime("%H:%M.%S") + ": " + status) if status == "success": break elif status == "working": # Pause for a few seconds time.sleep(3) else: print(status) break else: # Show service reported error print(json["message"]) else: print(f"Request error: {response.status_code} {response.reason}")def checkJobStatus(jobId): """Checks server job status""" url = f"{BASE_URL}/job/check?jobid={jobId}" response = requests.get(url, headers={ "x-api-key": API_KEY }) if (response.status_code == 200): json = response.json() if(json["status"]): print("** Response **") print(json) return json["status"] else: print(f"Request error: {response.status_code} {response.reason}") return Noneif __name__ == '__main__': main()
using Newtonsoft.Json;using Newtonsoft.Json.Linq;using System;using System.Collections.Generic;using System.Net;using System.Threading;namespace PDFcoApiExample{ class Program { // The authentication key (API Key). // Get your own by registering at https://app.pdf.co const String API_KEY = "***********************************"; // Direct URL of Source PDF file // You can also upload your own file into PDF.co and use it as url. Check "Upload File" samples for code snippets: https://github.com/bytescout/pdf-co-api-samples/tree/master/File%20Upload/ const string SourceFileURL = "https://pdfco-test-files.s3.us-west-2.amazonaws.com/document-parser/sample-invoice.pdf"; static void Main(string[] args) { // Create standard .NET web client instance WebClient webClient = new WebClient(); // Set API Key webClient.Headers.Add("x-api-key", API_KEY); // URL for `AI Invoice Parser` API call string url = "https://api.pdf.co/v1/ai-invoice-parser"; // Prepare requests params as JSON Dictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add("url", SourceFileURL); // Convert dictionary of params to JSON string jsonPayload = JsonConvert.SerializeObject(parameters); try { // Execute POST request with JSON payload string response = webClient.UploadString(url, jsonPayload); // Parse JSON response JObject json = JObject.Parse(response); if (json["error"].ToObject<bool>() == false) { // Asynchronous job ID string jobId = json["jobId"].ToString(); // Check the job status in a loop. // If you don't want to pause the main thread you can rework the code // to use a separate thread for the status checking and completion. do { string job_response = ""; string status = CheckJobStatus(jobId, out job_response); // Possible statuses: "working", "failed", "aborted", "success". // Display timestamp and status (for demo purposes) Console.WriteLine(DateTime.Now.ToLongTimeString() + ": " + status); if (status == "success") { Console.WriteLine("** Final Response **"); Console.WriteLine(job_response); break; } else if (status == "working") { // Pause for a few seconds Thread.Sleep(3000); } else { Console.WriteLine(status); break; } } while (true); } else { Console.WriteLine(json["message"].ToString()); } } catch (WebException e) { Console.WriteLine(e.ToString()); } webClient.Dispose(); Console.WriteLine(); Console.WriteLine("Press any key..."); Console.ReadKey(); } static string CheckJobStatus(string jobId, out string response) { using (WebClient webClient = new WebClient()) { // Set API Key webClient.Headers.Add("x-api-key", API_KEY); string url = "https://api.pdf.co/v1/job/check?jobid=" + jobId; response = webClient.DownloadString(url); JObject json = JObject.Parse(response); return Convert.ToString(json["status"]); } } }}
package com.company;import com.google.gson.JsonObject;import com.google.gson.JsonParser;import com.google.gson.JsonPrimitive;import okhttp3.*;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;public class Main { // The authentication key (API Key). // Get your own by registering at https://app.pdf.co final static String API_KEY = "********************************"; // (!) Make asynchronous job final static boolean Async = true; public static void main(String[] args) throws IOException { // Source PDF file // You can also upload your own file into PDF.co and use it as url. Check "Upload File" samples for code snippets: https://github.com/bytescout/pdf-co-api-samples/tree/master/File%20Upload/ final String SourceFileUrl = "https://pdfco-test-files.s3.us-west-2.amazonaws.com/document-parser/sample-invoice.pdf"; // Create HTTP client instance OkHttpClient webClient = new OkHttpClient(); // AI PARSE INVOICE ParseInvoice(webClient, SourceFileUrl); } public static void ParseInvoice(OkHttpClient webClient, String uploadedFileUrl) throws IOException { // Prepare POST request body in JSON format JsonObject jsonBody = new JsonObject(); jsonBody.add("url", new JsonPrimitive(uploadedFileUrl)); RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonBody.toString()); // Prepare URL for AI Invoice Parser API call. // See documentation: https://developer.pdf.co/api/ai-invoice-parser String query = "https://api.pdf.co/v1/ai-invoice-parser"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss"); // Prepare request to `Document Parser` API Request request = new Request.Builder() .url(query) .addHeader("x-api-key", API_KEY) // (!) Set API Key .addHeader("Content-Type", "application/json") .post(body) .build(); // Execute request Response response = webClient.newCall(request).execute(); if (response.code() == 200) { // Parse JSON response JsonObject json = new JsonParser().parse(response.body().string()).getAsJsonObject(); boolean error = json.get("error").getAsBoolean(); if (!error) { // Asynchronous job ID String jobId = json.get("jobId").getAsString(); System.out.println("Job#" + jobId + ": has been created. - " + dtf.format(LocalDateTime.now())); // Check the job status in a loop. // If you don't want to pause the main thread you can rework the code // to use a separate thread for the status checking and completion. do { String status = CheckJobStatus(webClient, jobId); // Possible statuses: "working", "failed", "aborted", "success" System.out.println("Job#" + jobId + ": " + status + " - " + dtf.format(LocalDateTime.now())); if (status.compareToIgnoreCase("success") == 0) { break; } else if (status.compareToIgnoreCase("working") == 0) { // Pause for a few seconds try { Thread.sleep(3000); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); // restore interrupted status } } else { System.out.println(status); break; } } while (true); } else { // Display service reported error System.out.println(json.get("message").getAsString()); } } else { // Display request error System.out.println(response.code() + " " + response.message()); } } // Check Job Status private static String CheckJobStatus(OkHttpClient webClient, String jobId) throws IOException { String url = "https://api.pdf.co/v1/job/check?jobid=" + jobId; String status = ""; // Prepare request Request request = new Request.Builder() .url(url) .addHeader("x-api-key", API_KEY) // (!) Set API Key .build(); // Execute request Response response = webClient.newCall(request).execute(); if (response.code() == 200) { // Parse JSON response JsonObject json = new JsonParser().parse(response.body().string()).getAsJsonObject(); status = json.get("status").getAsString(); if(status.equals("success")){ System.out.println(json); } return status; } else { // Display request error System.out.println(response.code() + " " + response.message()); } return "Failed"; }}
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>AI Invoice Parser example.</title></head><body><?php// PDF.co "AI Invoice Parser" code snippet.// The authentication key (API Key).// Get your own by registering at https://app.pdf.co$apiKey = "YOUR_API_KEY";// Direct URL of Source PDF file// You can also upload your own file into PDF.co and use it as url. Check "Upload File" samples for code snippets: https://github.com/bytescout/pdf-co-api-samples/tree/master/File%20Upload/$sourceFileUrl = "https://pdfco-test-files.s3.us-west-2.amazonaws.com/document-parser/sample-invoice.pdf";// Prepare URL for `AI Invoice Parser` API call$url = "https://api.pdf.co/v1/ai-invoice-parser";// Prepare requests params$parameters = array();$parameters["url"] = $sourceFileUrl;// Create Json payload$data = json_encode($parameters);// Create request$curl = curl_init();curl_setopt($curl, CURLOPT_HTTPHEADER, array("x-api-key: " . $apiKey, "Content-type: application/json"));curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_POST, true);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);// Execute request$result = curl_exec($curl);echo $result . "<br/>";if (curl_errno($curl) == 0){ $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($status_code == 200) { $json = json_decode($result, true); if (!isset($json["error"]) || $json["error"] == false) { // Asynchronous job ID $jobId = $json["jobId"]; // Check the job status in a loop do { $status = CheckJobStatus($jobId, $apiKey); // Possible statuses: "working", "failed", "aborted", "success". // Display timestamp and status (for demo purposes) echo "<p>" . date(DATE_RFC2822) . ": " . $status . "</p>"; if ($status == "success") { break; } else if ($status == "working") { // Pause for a few seconds sleep(3); } else { echo $status . "<br/>"; break; } } while (true); } else { // Display service reported error echo "<p>Error: " . $json["message"] . "</p>"; } } else { // Display request error echo "<p>Status code: " . $status_code . "</p>"; echo "<p>" . $result . "</p>"; }}else{ // Display CURL error echo "Error: " . curl_error($curl);}// Cleanupcurl_close($curl);function CheckJobStatus($jobId, $apiKey){ $status = null; // Create URL $url = "https://api.pdf.co/v1/job/check"; // Prepare requests params $parameters = array(); $parameters["jobid"] = $jobId; // Create Json payload $data = json_encode($parameters); // Create request $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, array("x-api-key: " . $apiKey, "Content-type: application/json")); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Execute request $result = curl_exec($curl); if (curl_errno($curl) == 0) { $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($status_code == 200) { $json = json_decode($result, true); if (!isset($json["error"]) || $json["error"] == false) { $status = $json["status"]; echo "<br/><br/><p>== Final Response ==</p>"; echo $result; } else { // Display service reported error echo "<p>Error: " . $json["message"] . "</p>"; } } else { // Display request error echo "<p>Status code: " . $status_code . "</p>"; echo "<p>" . $result . "</p>"; } } else { // Display CURL error echo "Error: " . curl_error($curl); } // Cleanup curl_close($curl); return $status;}?></body></html>