API-skanning
API-skanning gjør en PDF om til en troverdig skannet kopi med ett REST-kall, noe som passer automatiserte prosesser og integrasjoner i apper. Opprett jobben, last opp PDF-en og poll statusen eller vent på webhooken: tre steg, fra ethvert miljø og språk som kan sende en HTTP-forespørsel. Fargerom, oppløsning, rotasjon, uskarphet, støy, lysstyrke, kontrast og kantlinje kan alle stilles inn.
Slik foregår et kall
Opprett jobben
POST /v1/scan-jobs
Send din config og eventuelt en webhookUrl; du får tilbake en jobID og en forhåndssignert uploadURL.
Last opp PDF-en
PUT {uploadURL}
Gjør PUT av filen rett til den forhåndssignerte S3-adressen fra forrige steg — uten token.
Hent den skannede kopien
GET /v1/scan-jobs/{jobID}
Poll statusen eller vent på webhooken; når jobben er completed, laster du den ned fra downloadURL.
Der det passer
Masseproduksjon i backend
Avtaler, fakturaer og rapporter som lages på serveren går rett gjennom skanneeffekten, uten at noen gjentar det samme for hånd på nettsiden.
I et eksisterende system
Legg til en handling for å eksportere en skannet kopi i et CRM, et ERP eller et saksbehandlingssystem, og la den kalle API-et.
Automatiseringskjeder
CI, n8n, Zapier og lignende starter en jobb ved en hendelse, og webhooken sender stafettpinnen videre når den er ferdig.
Store filkøer
Jobbene er asynkrone: når de først er opprettet, behandles hver for seg, og framdriften kan følges via status og createdAfter.
Språk og miljøer
API-et er vanlig HTTP og JSON, så ethvert språk eller enhver automatiseringsplattform som kan sende en forespørsel, kan kalle det.
Kodeeksempler
Add Look Scanned API Scan to this project, so I can turn a PDF into a
realistic scanned copy from code.
API docs: https://lookscanned.io/en/scan/api
Write one function that:
1. POST https://api.lookscanned.io/v1/scan-jobs
Header: Authorization: Bearer $LOOKSCANNED_API_TOKEN
Body: {"config": {"colorspace": "gray", "resolution": 150, "rotate": 1}}
It returns jobID and a presigned uploadURL.
2. PUT the PDF bytes to uploadURL with Content-Type: application/pdf.
Send no Authorization header — that URL is already signed.
3. Poll GET /v1/scan-jobs/{jobID} until status is "completed" (or "failed"),
then return downloadURL.
Read the token from the LOOKSCANNED_API_TOKEN environment variable. Use the
language and HTTP client this project already uses, and add one test.interface ScanConfig {
rotate?: number // degrees to rotate the document
rotate_var?: number // degrees to rotate the document randomly
colorspace?: 'gray' | 'sRGB' // the colorspace of the output image
blur?: number // the amount of blur to apply to the image
noise?: number // the amount of noise to apply to the image
border?: boolean // whether to add a border to the image
brightness?: number // the brightness of the image. 1 is no change
contrast?: number // the contrast of the image. 1 is no change
resolution?: number // the resolution of the image in DPI
output_format?: 'image/png' | 'image/jpeg' // the format of the output image
}
interface ScanOptions {
config: ScanConfig
webhookUrl?: string // webhook URL to notify when job is completed
}
interface ScanResponse {
jobID: string // UUID of the scan job
userID: string // UUID of the user who created the job
createdAt: number // timestamp of job creation
status: 'pending' | 'processing' | 'completed' | 'failed'
config: ScanConfig
inputUploadedAt?: number // timestamp when input file was uploaded
completedAt?: number // timestamp when job was completed
webhookUrl?: string // webhook URL for notifications
uploadURL?: string // S3 presigned URL for file upload
downloadURL?: string // S3 presigned URL for file download
}
async function apiScan(pdfBlob: Blob, scanOptions: ScanOptions, token: string): Promise<ScanResponse> {
const response = await fetch('https://api.lookscanned.io/v1/scan-jobs', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(scanOptions)
})
const result: ScanResponse = await response.json()
// PUT PDF Blob to upload URL
const uploadURL = result.uploadURL
await fetch(uploadURL, {
method: 'PUT',
headers: {
'Content-Type': 'application/pdf',
'Content-Length': pdfBlob.size.toString()
},
body: pdfBlob
})
// get scan job status
const jobStatusResponse = await fetch(`https://api.lookscanned.io/v1/scan-jobs/${result.jobID}`, {
headers: {
'Authorization': `Bearer ${token}`
}
})
return await jobStatusResponse.json()
}import requests
def api_scan(pdf_file, scan_options, token):
# Create scan job
response = requests.post(
'https://api.lookscanned.io/v1/scan-jobs',
headers={'Authorization': f'Bearer {token}'},
json=scan_options
)
result = response.json()
# Upload PDF to presigned URL
upload_url = result['uploadURL']
requests.put(
upload_url,
headers={
'Content-Type': 'application/pdf',
'Content-Length': str(len(pdf_file))
},
data=pdf_file
)
# Get scan job status
job_status = requests.get(
f'https://api.lookscanned.io/v1/scan-jobs/{result["jobID"]}',
headers={'Authorization': f'Bearer {token}'}
)
return job_status.json()
# Example usage
if __name__ == "__main__":
with open('document.pdf', 'rb') as f:
pdf_content = f.read()
options = {
'config': {
# Optional parameters:
# 'rotate': 0, # degrees to rotate the document
# 'colorspace': 'gray', # gray or sRGB
# 'resolution': 300, # DPI
# 'rotate_var': 0, # random rotation variance in degrees
# 'blur': 0, # amount of blur
# 'noise': 0, # amount of noise
# 'border': False, # whether to add border
# 'brightness': 1, # 1 is no change
# 'contrast': 1, # 1 is no change
# 'output_format': 'image/png' # image/png or image/jpeg
},
'webhookUrl': 'https://example.com/webhook'
}
result = api_scan(pdf_content, options, 'your-api-token')
print(f"Scan job created with ID: {result['jobID']}")# Set your API token and PDF file as environment variables
export LOOKSCANNED_API_TOKEN='your_api_token_here'
# Create a new scan job
curl -X POST 'https://api.lookscanned.io/v1/scan-jobs' \
-H "Authorization: Bearer ${LOOKSCANNED_API_TOKEN}" \
-H 'Content-Type: application/json' \
-d '{
"config": {
"rotate": 0,
"rotate_var": 1,
"colorspace": "gray",
"blur": 0.2,
"noise": 0.1,
"border": true,
"brightness": 1.0,
"contrast": 1.0,
"resolution": 300,
"output_format": "image/jpeg"
},
"webhookUrl": "https://your-domain.com/webhook"
}'
# Response will include uploadURL and jobID
# {
# "jobID": "550e8400-e29b-41d4-a716-446655440000",
# "userID": "446655440000-e29b-41d4-a716-550e8400",
# "createdAt": 1616161616,
# "status": "created",
# "uploadURL": "...",
# "config": { ... }
# }
# Upload PDF file to the presigned URL
curl -X PUT 'PRESIGNED_UPLOAD_URL' \
-H 'Content-Type: application/pdf' \
-H "Content-Length: PDF_FILE_SIZE" \
--data-binary "@path/to/your/file.pdf"
# Check job status
curl 'https://api.lookscanned.io/v1/scan-jobs/JOB_ID' \
-H "Authorization: Bearer ${LOOKSCANNED_API_TOKEN}"
# Response will include status and downloadURL when completed
# {
# "jobID": "550e8400-e29b-41d4-a716-446655440000",
# "status": "completed",
# "downloadURL": "...",
# ...
# }
# Download the PDF
curl -o scanned.pdf 'DOWNLOAD_URL'API Bearer Token
Tokenet hører til kontoen din og kan lages på nytt når som helst. API-skanning krever en Pro-konto: uten et gyldig token svarer API-et 401, og uten Pro-rollen svarer det 403.
API-skanning er en Pro-funksjon
Denne kontoen har ikke Pro ennå; etter oppgraderingen ligger tokenet her. Uten token, eller uten rollen, svarer API-et 401 / 403.
Prøv det
Still inn parameterne, se hvordan innholdet i forespørselen følger med, og kjør så de tre kallene mot API-et.
Skanneparametere
En prøvekjøring kaller API-et med tokenet ditt og krever en Pro-konto; parameterne og innholdet i forespørselen er fritt å se på.
{
"config": {
"rotate": 1,
"rotate_var": 0.5,
"colorspace": "gray",
"blur": 0,
"noise": 0,
"border": false,
"brightness": 1.3,
"contrast": 1.3,
"resolution": 150,
"output_format": "image/jpeg"
}
}Skann Jobbinformasjon
eksempel{
"jobID": "3f9c1e64-0000-4000-8000-00000000a71b",
"userID": "8f21c4b0-0000-4000-8000-000000004a17",
"createdAt": 1724409600,
"status": "completed",
"inputUploadedAt": 1724409601,
"completedAt": 1724409602,
"numPages": 6,
"downloadURL": "https://…/output/3f9c.pdf?X-Amz-…"
}API-referanse
| Metode | Sti | Beskrivelse |
|---|---|---|
| POST | /v1/scan-jobs | Oppretter en skannejobb. Send config og eventuelt webhookUrl; du får tilbake jobbobjektet med statusen created og en forhåndssignert uploadURL. |
| PUT | {uploadURL}Den forhåndssignerte S3-adressen fra forrige steg, som ikke ligger på api.lookscanned.io | Laster opp kilde-PDF-en med Content-Type: application/pdf og Content-Length. Adressen bærer sin egen signatur, så ikke legg til en Authorization-header. |
| GET | /v1/scan-jobs/{jobID} | Leser én jobb, til polling. Ved created inneholder den uploadURL, ved completed downloadURL. |
| GET | /v1/scan-jobs | Lister dine egne jobber, filtrert på jobID, status eller createdAfter. |
401ingen gyldig token403kontoen er ikke Pro404jobben finnes ikke
Innholdet i forespørselen
| Felt | Type | Standard | Beskrivelse |
|---|---|---|---|
| webhookUrl | string · — | — | Kalles én gang når jobben er ferdig, så du slipper å polle etter den. |
| config.colorspace | 'gray' | 'sRGB' · gray | gray | Fargerommet til bildet som lages; gray gir en svart-hvit skannet kopi. |
| config.resolution | number · 72 | 72 | Oppløsningen til bildet som lages, i dpi. |
| config.rotate | number · — | — | Rotasjon av hele dokumentet, i grader. |
| config.rotate_var | number · — | — | Spennet for den tilfeldige rotasjonen per side, i grader — inntrykket av et ark lagt skjevt. |
| config.blur | number · 0 | 0 | Mengden uskarphet. |
| config.noise | number · 0 | 0 | Mengden støy. |
| config.brightness | number · 1 | 1 | Lysstyrke; 1 lar den stå uendret. |
| config.contrast | number · 1 | 1 | Kontrast; 1 lar den stå uendret. |
| config.border | boolean · false | false | Om siden skal få en kantlinje fra skanningen. |
| config.output_format | 'image/png' | 'image/jpeg' · image/jpeg | image/jpeg | Bildeformatet sidene gjengis til. |
Alle felt kan utelates. Startverdiene i «Prøv det» — oppløsning 150, rotasjon 1, lysstyrke og kontrast 1,3 — er kombinasjonen nettappen anbefaler, ikke API-ets standardverdier.
Felt i jobbobjektet det er verdt å følge med på
- status
- created / processing / completed / failed — avgjør om de to adressene nedenfor er med.
- uploadURL
- Bare mens jobben er created. En forhåndssignert opplastingsadresse som utløper.
- downloadURL
- Først når jobben er completed. En forhåndssignert nedlastingsadresse som utløper.
- inputUploadedAt / completedAt
- Når opplastingen av kilden var ferdig og når jobben var ferdig; differansen er behandlingstiden.
Ofte stilte spørsmål
Krever API-skanning Pro?
Ja. Uten et gyldig token svarer API-et 401, og en konto uten Pro-rollen får 403. Når du har oppgradert og logget inn, ligger tokenet på denne siden.
Hvordan vet jeg at en jobb er ferdig?
På to måter: poll GET /v1/scan-jobs/{jobID}, eller send med en webhookUrl når du oppretter jobben og la tjenesten kalle deg opp én gang.
Blir resultatet det samme som når man skanner på nettsiden?
Ja. Begge bruker den samme implementasjonen av skanneeffekten, og fargerom, oppløsning, rotasjon, uskarphet, støy, lysstyrke, kontrast og kantlinje i config svarer til de likelydende valgene på nettsiden: samme parametere gir samme resultat. Det eneste som skiller, er hvor arbeidet skjer — lokalt på siden, eksternt via API-et.
Kan jeg lagre opplastings- og nedlastingsadressene og bruke dem om igjen?
Helst ikke. uploadURL og downloadURL er forhåndssignerte adresser med begrenset levetid; når de har utløpt, må du lese jobben på nytt for å få ferske.
Hvor lang tid tar en jobb?
Det kommer an på sidetallet og oppløsningen. Noen få sider er som regel ferdige på sekunder, mens høyere oppløsning og lengre dokumenter tar lengre tid. Differansen mellom inputUploadedAt og completedAt gir den faktiske tiden.
Hva gjør jeg hvis en jobb feiler?
Statusen blir failed. De vanlige årsakene er en fil som ikke er en gyldig PDF, kryptering som sperrer filen, eller en avbrutt opplasting. Sjekk at filen lar seg åpne, og opprett en ny jobb.
Kan jeg se tidligere jobber?
Ja. GET /v1/scan-jobs lister dine egne jobber og kan filtreres på jobID, status og createdAfter, noe som holder til avstemming eller en ny nedlasting.