KLIQ|Developers

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

GradeLabelDescription
1ExcellentNo problems; well-preserved
2GoodMinor problems not requiring treatment
3FairProblems requiring monitoring or treatment
4PoorSignificant problems requiring prompt treatment
5CriticalUrgent 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