Skip to content

REST API Reference

Viglet Dumont exposes a REST API for triggering indexing operations, monitoring progress, managing sources, and configuring indexing rules. All endpoints use JSON and support CORS.


Base path: /api/v2/connector

GET /api/v2/connector/status

Returns {"status": "ok"} if the service is running.


GET /api/v2/connector/index/{name}/all

Triggers a full indexing operation for all content in the specified source.

Parameter Location Description
name Path Source name

Response: {"status": "sent"}

Status Meaning
200 The run started.
404 No connector plugin manages a source with this name: {"status": "unknown source", "reason": "..."}. Create the source first.
409 A run for this source is already in progress: {"status": "already running"}.

POST /api/v2/connector/index/{name}

Indexes specific documents by their IDs.

Parameter Location Description
name Path Source name
(body) JSON Array of content IDs: ["id-1", "id-2"]

Response: {"status": "sent"}


GET /api/v2/connector/reindex/{name}/all

Deletes the existing index and reindexes all content from the source.

Parameter Location Description
name Path Source name

Response: {"status": "sent"}. Answers 404 and 409 exactly as Index All Content does.


GET /api/v2/connector/reindex/{name}

Deletes and reindexes specific documents.

Parameter Location Description
name Path Source name
(body) JSON Array of content IDs

Response: {"status": "sent"}


GET /api/v2/connector/validate/{source}

Validates content differences between the source and the search index. Used by the Viglet Turing Double Check feature.

Parameter Location Description
source Path Source name

Response: DumConnectorValidateDifference: lists missing and extra documents.


Base path: /api/v2/connector/orphans

An orphan is a document the search index still holds after it left the source. The content audit never deletes one, because an orphan is only an orphan if the discovery pass that failed to mention it was complete: a gateway that timed out, or a listing that paginated short, makes every unlisted id look like a ghost. Deleting on that evidence would take live content out of the index.

So each audit pass writes the ids it found into a dated report and stops there. You read the report, decide whether it describes content that genuinely went away, and then apply or discard it. Applying goes through the connector’s own de-index path, so the indexing ledger and the search index stay in step.

The console has an Orphan Reports screen over these endpoints, which is the easier way to do the review: it shows each report’s id count against how many documents the site indexes, so a report naming most of the index reads as a failed discovery pass rather than a cleanup. The endpoints below are for scripting it.

A report is per source and per site, and only the newest one stands: a later pass supersedes the report it replaces, and a pass that finds no orphan retracts it. A report also expires (see dumont.audit.index.orphanTtl), because applying evidence that a reindex has since overtaken would delete live documents.

To produce a report on demand rather than waiting for the cron, run the audit:

GET /api/v2/connector/audit/{source}
GET /api/v2/connector/orphans
GET /api/v2/connector/orphans?source={source}
GET /api/v2/connector/orphans/{id}

Newest evidence first. Each report carries its source, provider, site, the objectIds it found, discoveredAt, expiresAt, whether it has already expired, and a status of pending, applied or discarded.

POST /api/v2/connector/orphans/{id}/apply

De-indexes every id in the report from its site and drops the matching ledger rows, then closes the report. Response: { "status": "applied", "deindexed": 12 }.

Status Meaning
200 Applied: deindexed says how many delete jobs were queued
404 No report carries that id, or a later pass superseded it
409 Already applied or discarded: a decision is made once
410 The evidence aged past dumont.audit.index.orphanTtl; re-run the audit
POST /api/v2/connector/orphans/{id}/discard

Closes the report without deleting anything: the right answer when the source was unreachable during the pass that produced it. Response: { "status": "discarded" }.


Base path: /api/v2/connector/logging

The indexing log records every status a document passes through: prepared, sent to the queue, delivered to the search engine. Each row names the document, the source that produced it and the transaction id of the run it belonged to, so you can ask what one source did or replay a single run end to end.

It needs a store: see Indexing Log configuration. With no engine configured the endpoints below answer with an empty page.

GET /api/v2/connector/logging/status

Response: { "engine": "mongodb", "configured": true, "enabled": true, "writing": true }.

The three flags answer different questions, and the ways a log goes wrong are exactly where they disagree:

Field Answers Read from
configured Is an engine named and switched on? dumont.logging.* properties
enabled Does that engine actually answer? a ping, at request time
writing Is an appender attached that would accept a row? the live Logback configuration

Read them together:

State Means Fix
configured: false The log is not part of this deployment Nothing, unless you wanted it
enabled: false The store is named but unreachable Check the URI and the credentials
writing: false The store answers, but nothing writes to it Remove any logging.config override; the engine derives it (before 2026.3.7 the Docker image pinned one)
all three true The log is on, reachable and being written n/a

writing exists because the first two describe only the reader: this endpoint’s own client. Rows are written by a Logback appender, and since 2026.3.7 the profile that declares it is derived from dumont.logging.engine, so the two cannot drift apart unless you override logging.config yourself. Gate a screen on enabled, and use writing to tell an empty history apart from one that nothing is filling.

GET /api/v2/connector/logging/indexing
Parameter Description
source Everything one source did
transactionId Everything that happened in one run
contentId One document’s whole history
status PREPARE_INDEX, SENT_TO_QUEUE, RECEIVED_AND_SENT_TO_TURING, DEINDEXED, …
resultStatus SUCCESS or ERROR
url Case-insensitive substring match on the document URL
dateFrom, dateTo YYYY-MM-DD, inclusive
page, pageSize Default 0 and 100
sort desc (default) or asc, by date

Filters combine, and any you omit is simply not applied. Response: { content, page, pageSize, totalElements, totalPages, unreadable }.

unreadable counts rows the engine skipped because it could not read them. It is normally 0. On a Redis log carrying rows written before 2026.3.6 it will not be: those rows are not valid JSON, and they are skipped one at a time rather than failing the query. They clear as the list rolls past its maxEntries, or immediately if you delete the key.

Rows written by a connector older than 2026.3.6 carry no source or transaction id. They still appear in an unfiltered listing (an unattributed row is a fact about an old message, not something to hide), but they cannot answer a query that names a source.


Base path: /api/v2/connector/source/infer

Proposes a structured source from a URL, previews what indexing it would produce, and indexes the draft a human has confirmed. Nothing here publishes on its own: infer and preview write nothing, and infer/index runs only on a draft you send back.

POST /api/v2/connector/source/infer

Fetches a sample of the URL, classifies its shape (SITEMAP, HTML_LISTING, TABULAR_LISTING, or UNKNOWN) and proposes an editable draft: the strategy configuration plus a field manifest with a type per field.

Body: { "url": "https://example.com/courses" }

Response: DumSourceDraft: the shape, the strategy configuration, and the inferred fields.

It proposes structure (selectors and field types), never content, and returns UNKNOWN rather than guessing when the sample gives it nothing to go on.

POST /api/v2/connector/source/infer/preview?sampleSize=20

Extracts a bounded sample through the same discover → extract → enrich path a real run uses, and reports what would happen: per-field coverage, records that would be skipped for a missing mandatory field, and a diff against the last full index (added, changed, removed, and fields that would go newly empty), plus a schema diff. Writes nothing.

Parameter Location Default Description
sampleSize Query 20 Records to extract for the preview

Body: the confirmed draft, as sent to infer/index below.

Response: { success, preview, message }.

On a source’s first onboarding there is no baseline, so everything reads as added.

POST /api/v2/connector/source/infer/index

Materialises the draft into a live structured source and indexes it. This is the only endpoint of the three that writes, and it acts on the draft in the request body: a proposal is never indexed without being sent back.

Body: { "url", "sourceName", "siteNames": [...], "locale", "draft" }

Response: { success, source, message }.


Base path: /api/v2/connector/monitoring

GET /api/v2/connector/monitoring/index/{source}

Returns indexing status records for a specific source. Returns 404 if no records found.


GET /api/v2/connector/monitoring/indexing

Returns all indexing monitoring data across all sources.


GET /api/v2/connector/monitoring/indexing/{source}

Returns monitoring data filtered by source name.


POST /api/v2/connector/monitoring/indexing/_search

Searches indexing monitoring records with pagination and filters.

Request body:

{
"source": "WKND",
"status": "INDEXED",
"page": 0,
"size": 20
}

POST /api/v2/connector/monitoring/indexing

Request body: Array of content IDs.


GET /api/v2/connector/monitoring/indexing/stats
GET /api/v2/connector/monitoring/indexing/stats/{source}

Returns indexing operation statistics (start time, document count, duration, throughput). Returns 404 if no stats found.


GET /api/v2/connector/system-info

Returns runtime system information consumed by the Turing Integration → System Information page:

  • Application name and version
  • Java version, vendor, and JVM details
  • Operating system name and version
  • Physical memory (total, used, free)
  • JVM heap memory (total, used, free)
  • Disk space (total, used, free)

Base path: /api/v2/connector/indexing-rule

CRUD operations for managing regex-based indexing rules that filter content during extraction.

GET /api/v2/connector/indexing-rule
GET /api/v2/connector/indexing-rule/source/{source}
GET /api/v2/connector/indexing-rule/{id}
POST /api/v2/connector/indexing-rule

Request body:

{
"name": "Exclude error pages",
"source": "WKND",
"attribute": "template",
"ruleType": "IGNORE",
"values": ["error-page", "redirect"]
}
PUT /api/v2/connector/indexing-rule/{id}

Request body: Same as create.

DELETE /api/v2/connector/indexing-rule/{id}

Response: true if deleted, false if not found.

GET /api/v2/connector/indexing-rule/structure

Returns an empty model for reference.


Base path: /api/v2/aem

These endpoints are available when the AEM plugin JAR is loaded via -Dloader.path.

GET /api/v2/aem/status

Returns {"status": "ok"}.


POST /api/v2/aem/index/{source}

Triggers indexing for specific AEM content paths. Includes built-in deduplication, repeated requests for the same paths within 30 seconds are ignored.

Parameter Location Description
source Path AEM source name (e.g., WKND)
(body) JSON DumAemPathList object

Request body:

{
"paths": ["/content/wknd/us/en/about"],
"event": "INDEXING",
"recursive": false,
"attribute": "ID"
}
Field Type Default Description
paths string[] (required) AEM content paths
event string INDEXING INDEXING, DEINDEXING, PUBLISHING, or UNPUBLISHING
recursive boolean false Traverse child nodes
attribute string ID ID (path-based) or URL (URL-based)

Response: {"status": "sent"}


CRUD operations for AEM source configurations.

GET /api/v2/aem/source
GET /api/v2/aem/source/{id}
POST /api/v2/aem/source

Request body: Full DumAemSource JSON (see Extending the AEM Connector, Configuration JSON).

PUT /api/v2/aem/source/{id}

Returns 400 if ID mismatch, 404 if not found.

DELETE /api/v2/aem/source/{id}
GET /api/v2/aem/source/{id}/indexAll

Triggers an asynchronous full indexing operation for the specified AEM source.

GET /api/v2/aem/source/structure

Returns an empty AEM source model for reference.


Page Description
AEM Connector AEM indexing flow, event listeners, and manual triggering
Connectors Overview All connectors and how they’re managed
Turing: Integration Turing admin console for managing connectors