Getting started

Public API overview

How the Katalo public API is structured: auth, job lifecycle, delivery, and operations.

Overview

Integrate Katalo from your backend

Submit one source image, create a job, wait for completion, and read back one primary output plus an optional approved alternate.

This documentation is for backend and platform engineers. It covers request contracts, authentication, webhook delivery, operational limits, and the OpenAPI source contract.

The public API is server-to-server only. Your backend owns the API key, ingests source assets, creates jobs, receives results by webhook or polling, and decides whether to persist signed output assets.

1

source image per job

5

core public endpoints

2

delivery modes: polling or webhook

One source imageOne job with signed outputs

Input

One original image per request.

Result

A job plus signed output URLs.

Delivery

Poll or receive a webhook.

Scope

When this API is a good fit

Use the public API when Katalo needs to run inside your own product, queue, or operational workflow.

Integration patternWhy it fits
CRM and brokerage softwareCreate or regenerate listing imagery without sending agents into the Katalo UI.
Marketplace and portal backendsAttach generation jobs to listing ingestion, moderation, or merchandising flows.
Batch and queue workersCreate jobs from your own workers and fan results back into storage, search, or product UI.
White-label product featuresExpose staging to your users while keeping credentials, policy, and delivery logic on your backend.
Internal reportingRead usage summaries and billing ledger entries for reconciliation and support tooling.

Flow

Request flow

A normal integration has five steps: authenticate, ingest the source, create the generation, wait for completion, and consume outputs.

1

Ingest the source image

Call `POST /api/v1/source-assets` with either one multipart `file` or `source_url`, then poll `GET /api/v1/source-assets/{ingest_id}` until `source_asset_id` is ready.
2

Create a job

Call `POST /api/v1/generations` with `source_asset_id` and the workflow fields that are valid for that request shape.
3

Wait for a terminal status

Use a webhook in production or poll `GET /api/v1/generations/{job_id}` until the job reaches `succeeded` or `failed`.
4

Read the outputs

Consume the signed output URLs immediately or copy the assets into your own storage if you need longer retention.
5

Regenerate when needed

If you need another approved output from the same source image, call `POST /api/v1/generations/{job_id}/regenerate`.

Input

Source ingest is its own API step

The recommended production contract is two-step: create a reusable source asset first, then create generations from that asset.

1

Recommended path

Use `POST /api/v1/source-assets` and then `POST /api/v1/generations` with the returned `source_asset_id`. This keeps source fetch, decode, and dedupe work off the generation request path.
2

Compatibility path

Inline `file` and `source_url` submission on `POST /api/v1/generations` still works, but it is transitional. Those requests can return `status=ingesting` and `source_asset_id=null` until the source asset is ready.
3

Reuse

Once a source asset exists, regenerate requests and future create requests can reuse it without uploading or fetching the source image again.

Contract

Rules to design around

The public API is intentionally narrower than the internal generation pipeline. Build against the public contract, not internal assumptions.

1

One source image per job

A job is always tied to one original image. In production, that image should be represented by a `source_asset_id` created ahead of time.
2

Only publishable outputs are returned

The public API does not expose every internal attempt. It returns the primary approved output and, if requested, at most one approved alternate.
3

Signed URLs are temporary

Output URLs expire. If your workflow needs durable access, copy the asset into your own storage and do not rely on the original signed URL.
4

Request validity depends on workflow

Field validity changes with `workflow` and `capture_type`. Some fields are required, some optional, and some explicitly not allowed.

Surfaces

Product surfaces

Katalo has more than one product surface. This documentation covers only the public server-to-server API.

SurfaceWhat it is
Web appInteractive staging inside the Katalo product.
APIServer-to-server integration for your backend, workers, and webhooks.
Managed serviceManual or assisted workflows outside the public API path.

Integration

What your integration owns

Katalo handles generation. Your system still owns auth, correlation, delivery handling, and asset persistence.

1

Authentication

Store the organization API key on the server and send it as a bearer token on every protected request.
2

Asynchronous completion

Choose whether your system consumes signed webhook callbacks, polls job state, or uses polling only as fallback.
3

Correlation

Use `reference`, `metadata`, and your own internal ids so a completed job can be mapped back to the correct listing or workflow state.
4

Asset persistence

Signed output URLs are temporary. Copy assets into your own bucket if they need to remain available after the signed URL expires.
5

Retry policy

Use idempotency keys on writes, retry `429` and retryable `5xx` responses with backoff, and treat validation failures as terminal.
6

Usage reconciliation

Read the usage summary and billing ledger endpoints if you need internal reporting, support tooling, or customer chargeback.

Quick start

Ingest a source asset, then send your first job

Start by creating a source asset, wait until it is ready, then create the generation from `source_asset_id`.

curl https://app.katalo.ai/api/v1/source-assets \
  -H "Authorization: Bearer $KATALO_API_KEY" \
  -H "Idempotency-Key: listing-123-source-001" \
  -H "Content-Type: application/json" \
  -d '{
    "source_url": "https://cdn.example.com/listing.jpg"
  }'

# poll GET /api/v1/source-assets/{ingest_id} until source_asset_id is present

curl https://app.katalo.ai/api/v1/generations \
  -H "Authorization: Bearer $KATALO_API_KEY" \
  -H "Idempotency-Key: listing-123-generation-001" \
  -H "Content-Type: application/json" \
  -d '{
    "source_asset_id": "src_...",
    "workflow": "staging",
    "capture_type": "photo",
    "mode": "refurnish",
    "room_types": ["Living Room", "Kitchen"],
    "style_preset": "modern",
    "reference": "listing-123-lr-1"
  }'

Inline create is compatibility only

`POST /api/v1/generations` still accepts one multipart file or `source_url`, but that path is transitional and may return `status=ingesting` before the job reaches `queued`.

Multipart requests still take one image

Multipart requests carry one file field. The API does not accept an array of uploads.

Response shape

What comes back

Create and get return the same job envelope: public ids, workflow state, optional failure details, and signed output URLs.

job_id

Stable public id for the generation job. Use it to poll status or regenerate from the same source asset.

outputs

The returned images. Each output includes a signed URL that expires after 15 minutes.

failure

A terminal error payload with a machine-readable code and retry hint.

metadata

Your original metadata, echoed back without modification.

Dashboard

What lives in the dashboard

The dashboard owns credentials and webhook defaults. These docs own the request and response contract.

Keep the responsibilities separate

Use the dashboard to issue and rotate keys, set default webhook destinations, and manage organization-level API access. Use the docs and OpenAPI file for field-level behavior.

Supported flows

Supported operations

The public API has two workflows and one follow-up operation on an existing job.

FlowWhen to use itNotes
stagingUse this for virtual staging. Required and allowed fields depend on `capture_type`.This is the default path for most integrations.
pro_captureUse this for photo-only capture jobs with a narrower request shape.Rejects `mode`, `room_types`, and `style_preset`.
regenerateCreate a new job from an existing `job_id` while reusing the same source asset.Allowed overrides depend on the parent job’s workflow and capture type.

Next

Continue with these pages

Most teams read key management, generations, webhooks, and reliability in that order.

Postavke kolačića

Odaberite kako Katalo koristi kolačiće

Koristimo nužne kolačiće za rad web stranice i aplikacije. Analitički kolačići pomažu nam razumjeti korištenje i poboljšati Katalo. Ako želite ponovno vidjeti ovaj banner kasnije, izbrišite kolačiće preglednika i ponovno posjetite stranicu.