Art Authentication (ArtScan)
This recipe walks through assessing an oil painting using the ArtScan vertical: from catalog lookup to a museum-grade AIC condition report covering all four physical layers.
What you will build
An art condition assessment workflow that locates a painting in the catalog, creates an inspection with the AIC condition schema, uploads four standardised photo types, and delivers per-layer grades covering canvas, paint film, coating, and frame.
1. Set up the client
import { KliqClient } from '@kliq-ai/sdk';
const kliq = new KliqClient({ apiKey: process.env.KLIQ_API_KEY! });
const tenant = kliq.forTenant('t_abc123');
2. Browse the catalog for oil paintings
// Browse painting types in the ArtScan catalog
const types = await kliq.catalog.types.list({ verticalSlug: 'art-scan' });
console.log(types.map(t => t.slug));
// ["oil-paintings", "watercolors", "prints-drawings", "sculpture", "photographs"]
// Look up the specific work by catalog slug
const artwork = await kliq.catalog.items.get('rembrandt-self-portrait-1659');
console.log(artwork.name);
// "Self-Portrait, 1659 — Rembrandt van Rijn"
console.log(artwork.attributes);
// { artist: 'Rembrandt van Rijn', year: 1659, medium: 'Oil on canvas',
// dimensions: '84.5 × 66 cm', institution: 'National Gallery of Art' }
console.log(artwork.type.gradingSchemaSlug);
// "aic-condition-1-5"
3. Create the inspection
const inspection = await tenant.inspections.create({
catalogItemSlug: artwork.slug,
gradingSchemaSlug: artwork.type.gradingSchemaSlug,
notes: 'Pre-loan condition check. Borrowing institution: Rijksmuseum, Amsterdam.',
metadata: { conservator: 'dr.elena.marchetti', loanRef: 'NGA-LOAN-2026-11' },
});
console.log(inspection.id); // "insp_art001"
4. Upload photos
AIC condition assessment requires four standardised photo types. Raking-light and UV images are especially important for detecting in-painting and surface deformation.
const photoAngles = [
{ file: overallImage, angle: 'overall', notes: 'Full-face, even lighting' },
{ file: detailImage, angle: 'detail', notes: 'Close-up of craquelure center' },
{ file: rakingLightImage, angle: 'raking-light', notes: '45° side-lighting, reveals deformation' },
{ file: uvImage, angle: 'uv', notes: 'UV fluorescence, reveals in-painting' },
];
const observations = await Promise.all(
photoAngles.map(async ({ file, angle, notes }) => {
const { uploadUrl, imageUrl } = await tenant.observations.getUploadUrl({
filename: `rembrandt-1659-${angle}.jpg`,
contentType: 'image/jpeg',
});
await fetch(uploadUrl, {
method: 'PUT',
body: file,
headers: { 'Content-Type': 'image/jpeg' },
});
return tenant.observations.create({
locationId: 'loc_conservation_studio',
imageUrl,
metadata: { inspectionId: inspection.id, angle, notes },
});
})
);
console.log(`Uploaded ${observations.length} photos`);
5. Trigger AI grading
await tenant.inspections.grade(inspection.id);
The platform loads AIC condition descriptors for oil-paintings and passes them alongside all four photo types to the vision model.
6. Poll for results
let result = await tenant.inspections.get(inspection.id);
while (result.status === 'grading') {
await new Promise(r => setTimeout(r, 3000));
result = await tenant.inspections.get(inspection.id);
}
console.log('AI grades:', result.aiGrades);
// {
// canvas: 2, // Good — stable, minor planar deformation upper-right
// paint_film: 2, // Good — age craquelure throughout, no active flaking
// coating: 3, // Fair — yellowed natural resin varnish, partially blanched
// frame: 4, // Fair — losses to gilding at corners, structural crack right side
// restoration_extent: 'minor',
// stability: 'stable',
// overall: 2
// }
AIC Condition Grades
| Grade | Label | Description |
|---|---|---|
| 1 | Excellent | No problems; well-preserved |
| 2 | Good | Minor problems not requiring treatment |
| 3 | Fair | Problems requiring monitoring or treatment |
| 4 | Poor | Significant problems requiring prompt treatment |
| 5 | Critical | Urgent treatment required to prevent further loss |
7. Human review and override
// Conservator reviews under magnification and confirms or adjusts
const finalized = await tenant.inspections.submitHumanGrades(inspection.id, {
grades: {
canvas: 2, // confirmed
paint_film: 2, // confirmed
coating: 3, // confirmed — varnish removal recommended within 5 years
frame: 4, // confirmed — gilding consolidation required before loan
restoration_extent: 'minor',
stability: 'stable',
},
notes: 'Frame requires gilding consolidation before any loan movement. Paint film stable.',
});
console.log('Final grade:', finalized.finalGrades.overall); // 2
console.log('Status:', finalized.status); // "completed"
8. Read the final report
const report = await tenant.inspections.get(inspection.id);
console.log(`Artwork: ${report.catalogItem.name}`);
console.log(`Schema: ${report.gradingSchema.name}`);
console.log(`Canvas: AIC ${report.finalGrades.canvas}`);
console.log(`Paint film: AIC ${report.finalGrades.paint_film}`);
console.log(`Coating: AIC ${report.finalGrades.coating}`);
console.log(`Frame: AIC ${report.finalGrades.frame}`);
console.log(`Stability: ${report.finalGrades.stability}`);
console.log(`Human reviewed: ${report.humanReviewed}`);
console.log(`Completed: ${report.completedAt}`);
// Artwork: Self-Portrait, 1659 — Rembrandt van Rijn
// Schema: AIC Condition Rating Scale (1–5)
// Canvas: AIC 2
// Paint film: AIC 2
// Coating: AIC 3
// Frame: AIC 4
// Stability: stable
// Human reviewed: true
// Completed: 2026-04-28T17:00:00Z
Next steps
- Grading Schemas — Explore other fine art schemas (TMS, RKD)
- Catalog Registry — Browse all ArtScan catalog types
- Machine Assessment — Assess industrial equipment with ASA standards