When you submit a piece of technical content to Mindloom, far more happens than a simple database write. TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/No-Country-simulation/G9-LATAM-Team-58/llms.txt
Use this file to discover all available pages before exploring further.
POST /content endpoint orchestrates a four-layer pipeline: it forwards the body text to the inference service, receives a full semantic analysis, persists the result across two distinct database writes, and queries the five nearest semantic neighbors — all within a single HTTP request. By the time the 201 response arrives in your client, the content is classified, embedded, and wired into the knowledge graph.
What happens during ingestion
Request received by the API
Your client sends a JSON body with exactly two fields —
title and body — to POST /content. Both are required; a blank value on either field returns 400 VALIDATION_ERROR before any downstream service is called.Inference service call — /predict
The API POSTs the The inference service returns everything the API needs in a single response:
body text (and only the body) to the inference service’s /predict endpoint under the key text:Two-phase database write
The API writes the content to Oracle ADB in two separate statements — not one. JPA handles all structured fields, but cannot map Oracle’s The
VECTOR(384, FLOAT32) column type. A second, explicit JDBC UPDATE stores the embedding by passing the float array as a bracket-delimited string into TO_VECTOR(?, 384, FLOAT32):? placeholder receives the embedding as a bracket-delimited string produced by VectorUtils.toVectorString() (e.g. [0.021,-0.118,…]), which Oracle’s TO_VECTOR function parses into the native VECTOR column type.If the JDBC
UPDATE is ever omitted (for example, in a custom ingestion path that only calls JPA), the row is inserted without a vector. It will appear in listing endpoints but will be completely invisible to all semantic searches and all related lookups — with no error and no log entry.Related content query
Still within the same transaction, the API immediately uses the newly written embedding to find the five most semantically similar items already in the corpus:These become the
related array in the response. No second API call is required.Response fields explained
category
One of the 8 fixed taxonomy values, always returned in Spanish. Determined by the inference service classifier.
probability
Classifier confidence for the assigned category, expressed as a float between 0 and 1 (e.g.
0.91 = 91 % confidence).keywords
Salient terms extracted from the body by the inference service. Used for display and discovery.
explanation
TF-IDF terms from the baseline classifier that drove the category decision. Distinct from
keywords — these are the discriminative features, not the most frequent words.related
Up to 5 semantically nearest items, computed at ingestion time using the new embedding. Free — no extra API call needed.
id
Auto-generated string in the format
usr-{UUID}. The usr- prefix identifies content submitted by users, as opposed to seeded corpus items.The 8 content categories
All content is classified into one of these fixed categories. The inference service returns them in Spanish; they are stored and returned as-is throughout the system.Backend
Frontend
Móvil
Datos e IA
DevOps y Cloud
Bases de datos
Seguridad
Fundamentos
Request reference
| Field | Type | Required | Constraints |
|---|---|---|---|
title | string | Yes | Non-blank (@NotBlank) |
body | string | Yes | Non-blank (@NotBlank) |
id, category, source ("user"), and language ("es") fields are assigned by the API — they cannot be set by the caller.
Key behaviours to remember
- The two-write pattern
- explanation vs keywords
Every ingestion issues an
INSERT (JPA) followed by an UPDATE (JDBC). This is by design: JPA’s entity model does not include the embedding field because the VECTOR column type is not supported by the JPA provider. The JDBC UPDATE passes the embedding as a bracket-delimited string via VectorUtils.toVectorString() into TO_VECTOR(?, 384, FLOAT32). Any alternative write path that skips the JDBC UPDATE silently produces orphaned rows.