Collection Creation

Creating collections with outcomes and AI models in the MediaViz API.

Overview

Outcomes and Models

Collections are created via POST /api/v1/project_outcome/. You must specify at least one outcome or model as query parameters.

Outcomes are high-level analysis goals that automatically enable the required set of AI models. These enable complex processing, including running prerequisite models followed by summary analysis.

Models are individual AI capabilities — some can be requested directly, while others have prerequisites and must be requested through an outcome.

  • Outcomes — curation, similar_moments, high_similarity, near_duplicates, portraits, persons, normalize
  • Direct models — blur, colors, face_recognition, image_classification, image_comparison, image_describe, ocr

Continuous upload collections (type 2) currently support only blur, colors, face_recognition (basic face detection), image_classification, ocr, and image_describe models, plus the normalize outcome. Other outcomes require a standard collection (type 1).

Curation

Curation

The curation outcome runs the full curation pipeline. It flags blurry photos, extracts colors, detects faces, classifies image content, and groups similar photos, then gives each photo an evidence_score used to rank photos by overall quality.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Curation Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'curation'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Curation Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'curation'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Curation Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'curation'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Curation Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'curation'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Curation Collection',
    1,     # type — 1 = standard collection only
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    outcomes='curation'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Curation Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'curation'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?outcomes=curation' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Curation Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

Similar Photos & Duplicate Detection

Outcomes — similar_moments / high_similarity / near_duplicates / portraits

The similarity outcomes group images by visual likeness. Each variant applies a different sensitivity level that controls how closely images must match to be grouped.

  • similar_moments — low sensitivity; broadly groups related scenes
  • high_similarity — medium sensitivity; groups clearly similar images
  • near_duplicates — high sensitivity; groups near-identical shots
  • portraits — portrait-optimized sensitivity; designed for grouping headshots

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Similarity Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'similar_moments'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Similarity Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'similar_moments'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Similarity Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'similar_moments'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Similarity Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'similar_moments'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Similarity Collection',
    1,     # type — 1 = standard collection only
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    outcomes='similar_moments'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Similarity Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'similar_moments'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?outcomes=similar_moments' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Similarity Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

Persons

Outcome — persons

The persons outcome detects and identifies human subjects across your collection.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Persons Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'persons'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Persons Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'persons'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Persons Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'persons'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Persons Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'persons'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Persons Collection',
    1,     # type — 1 = standard collection only
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    outcomes='persons'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Persons Collection',
  1,     // type — 1 = standard collection only
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'persons'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?outcomes=persons' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Persons Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

Normalize

Outcome — normalize

The normalize outcome standardizes photo data in a collection for consistent downstream processing.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Normalize Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'normalize'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Normalize Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'normalize'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Normalize Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'normalize'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Normalize Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    outcomes: 'normalize'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Normalize Collection',
    1,     # type — 1 = standard collection, 2 = continuous upload
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type (1 or 2)
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    outcomes='normalize'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Normalize Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'normalize'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?outcomes=normalize' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Normalize Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

Standalone Models

Direct Models

Direct models can be requested on their own via the models query parameter, without an outcome. Some are also included in outcomes such as curation. See examples below.

Image Classification

Applies labels with confidence values to all photos in the collection. Enables custom album generation, natural-language search, and other metadata-driven processing.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Labeled Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_classification'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Labeled Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_classification'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Labeled Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_classification'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Labeled Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_classification'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Labeled Collection',
    1,     # type — 1 = standard collection, 2 = continuous upload
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type (1 or 2)
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    models='image_classification'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Labeled Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'image_classification'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?models=image_classification' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Labeled Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

Captions

Generates a natural-language caption describing the content of each photo. Aliases: caption, describe, description.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Captions Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_describe'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My Captions Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_describe'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My Captions Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_describe'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My Captions Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'image_describe'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My Captions Collection',
    1,     # type — 1 = standard collection, 2 = continuous upload
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type (1 or 2)
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    models='image_describe'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My Captions Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'image_describe'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?models=image_describe' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My Captions Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON

OCR (Optical Character Recognition)

Extracts text content from images using optical character recognition. Alias: optical_content_recognition.

Request Sample

const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My OCR Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'ocr'
  }
);
import type { ProjectRunDisplay } from '@mediaviz/sdk';

const { project_table_name }: ProjectRunDisplay = await mediaviz.projects.createProjectAndRun(
  'My OCR Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'ocr'
  }
);
const { project_table_name } = await mediaviz.projects.createProjectAndRun(
  'My OCR Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'ocr'
  }
);
const { client } = useMediaViz();

const { project_table_name } = await client.projects.createProjectAndRun(
  'My OCR Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  {
    models: 'ocr'
  }
);
result = mediaviz.projects.create_project_and_run(
    'My OCR Collection',
    1,     # type — 1 = standard collection, 2 = continuous upload
    None,  # private — optional; defaults to false
    None,  # description — optional
    None,  # directory — optional folder path
    1,     # photoUploadVector — should match type (1 or 2)
    None,  # thumbnail — optional cover image URL
    None,  # runName — optional label for this run
    models='ocr'
)
# result['project_table_name']
$result = $mediaviz->projects->createProjectAndRun(
  'My OCR Collection',
  1,     // type — 1 = standard collection, 2 = continuous upload
  null,  // private — optional; defaults to false
  null,  // description — optional
  null,  // directory — optional folder path
  1,     // photoUploadVector — should match type (1 or 2)
  null,  // thumbnail — optional cover image URL
  null,  // runName — optional label for this run
  'ocr'
);
// $result['project_table_name']
curl -X POST 'https://api.mediaviz.ai/api/v1/project_outcome/?models=ocr' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoidXNyXzAxYWJjMTIzIiwiZXhwIjoxNzQzNjMwMzI5fQ.RwJF-KLLr8K5JgEtIeFiKWELcv-FDLNzMPHJ2St_wAo' \
  -H 'Content-Type: application/json' \
  --data @- <<'JSON'
{
  "name": "My OCR Collection",
  "private": null,
  "type": 1,
  "description": null,
  "directory": null,
  "photo_upload_vector": 1,
  "thumbnail": null,
  "run_name": null
}
JSON