Upload a PDF and import with AI (JavaScript)
This guide shows how to upload a PDF to IMPARGO storage and trigger an AI-based import to create a transport order. The flow has three steps:
- Get a signed upload URL via GraphQL
- Upload the file to the signed URL
- Trigger the AI import with the uploaded file
Prerequisites
- Your IMPARGO API token in the
authorizationheader - GraphQL endpoint:
https://backend.impargo.eu/ - JavaScript runtime: Node.js 18+ (global
fetch)
1) Get a signed upload URL
Use this GraphQL operation.
query GetSignedUrl($filename: String!, $setContentDisposition: Boolean) {
getSignedUrl(filename: $filename, setContentDisposition: $setContentDisposition)
}
- NodeJS
async function getSignedUrl(token, fileName) {
const res = await fetch('https://backend.impargo.eu/', {
method: 'POST',
headers: {
authorization: token,
'content-type': 'application/json',
},
body: JSON.stringify([
{
operationName: 'GetSignedUrl',
variables: {
filename: fileName,
setContentDisposition: true,
},
query: `query GetSignedUrl($filename: String!, $setContentDisposition: Boolean) {
getSignedUrl(filename: $filename, setContentDisposition: $setContentDisposition)
}`,
},
]),
})
const data = await res.json()
const signedUrl = data[0]?.data?.getSignedUrl
return signedUrl
}
- Response
[
{
"data": {
"getSignedUrl": "https://impargo-gmbh.s3-accelerate.amazonaws.com/Transport.pdf?X-Amz-..."
}
}
]
2) Upload the file to the signed URL
Use Node 18+ global fetch to PUT the file to the S3 signed URL.
async function uploadToSignedUrl(signedUrl, file) {
const body = Buffer.isBuffer(file.descriptor)
? file.descriptor
: file.descriptor instanceof ArrayBuffer
? Buffer.from(file.descriptor)
: file.descriptor
await fetch(signedUrl, {
method: 'PUT',
headers: {
'Content-Type': file.contentType,
'Content-Length': file.size,
},
body,
})
return signedUrl.split('?')[0]
}
3) Trigger the AI import
Call the mutation with an OrderFilesInput describing the uploaded file. Default visibility is internal if you omit visibility.
OrderFilesInputdocs: /docs/Schema/types/inputs/order-files-inputFileTypeenum: /docs/Schema/types/enums/file-type
mutation ImportOrderFromFile($file: OrderFilesInput!) {
importOrderFromFile(file: $file) {
_id
order {
reference
route {
distance
time
}
}
importOrderFromFileMetadata {
inputFileUrl
}
}
}
- NodeJS
async function importOrderFromFile(token, uploadedUrl, file) {
const variables = {
file: {
url: uploadedUrl,
name: file.name,
size: file.size,
type: 'ATTACHMENT_UPLOAD',
contentType: file.contentType,
},
}
const res = await fetch('https://backend.impargo.eu/', {
method: 'POST',
headers: {
authorization: token,
'content-type': 'application/json',
},
body: JSON.stringify([
{
operationName: 'ImportOrderFromFile',
variables,
query: `mutation ImportOrderFromFile($file: OrderFilesInput!) {
importOrderFromFile(file: $file) {
_id
order {
reference
route {
distance
time
}
}
importOrderFromFileMetadata {
inputFileUrl
}
}
}`,
},
]),
})
const data = await res.json()
return data[0]?.data?.importOrderFromFile
}
- Response
[
{
"data": {
"importOrderFromFile": {
"_id": "6710c7...",
"order": {
"reference": "INV-2025-123",
"route": {
"distance": 534120,
"time": 22680
}
},
"importOrderFromFileMetadata": {
"inputFileUrl": "https://impargo-gmbh.s3-accelerate.amazonaws.com/Transport.pdf"
}
}
}
}
]