oneapi
Sign in
Business v1 / Nomenclatoare

Semantic CAEN matching

Takes a free text describing an activity (e.g. „I want to repair bicycles") and returns the NACE (Rev. 3) codes closest in MEANING, with a confidence score — not a word search but a meaning search (it catches paraphrases, synonyms, different wordings). ?text= (required), ?limita= (how many, 5 by default, 20 at most).

GET
https://oneapi.ro/api/business/v1/caen/potriveste

Query parameters

NameTypeDescriptionAccepted values
limitaoptional string | null How many suggestions to return (default 5, max 20). e.g. 3
textoptional string | null The free text to classify (required). E.g. "I want to repair bicycles". e.g. vreau sa repar bicicletee.g. transport rutier de marfae.g. cabinet stomatologic
niveloptional string | null

How it behaves

  • Takes a free-text description of an activity and returns the CAEN codes closest in meaning, each with a confidence score. It is not word search (like /caen?q=) but meaning search — it catches paraphrases, synonyms and wordings completely different from the official name.
  • Example: "I want to repair bicycles" returns 9529 ("Repair of personal and household goods…") first — even though the word "bicycles" is not in the code's name, only in its notes. A word search would miss this or return "Manufacture of bicycles" (the wrong sense).
  • Under the hood: the text is turned into a meaning vector (bge-m3 model, self-hosted) and compared against the precomputed index of CAEN codes. The result is a ranked list of suggestions, not a verdict — use the score and take the top few, leaving the final choice to the user or a threshold rule.
  • ?text= is required. ?limita= chooses how many suggestions (default 5, max 20). Matching is done against CAEN Rev.3 (the current edition).

What it is for

  • A "describe what you do" field that suggests the CAEN code when registering a company.
  • Bulk-classifying activity descriptions into CAEN codes.
  • Help choosing the right code when the official names are hard to search.

Response structure

All fields below live inside data.

FieldTypeDescription
text string The text.
nivel string The nomenclature level requested; clasa by default, because a 4-digit class is what gets declared at the Trade Register.
potrivire_sigura boolean There is at least one row we trust: either the term is explicitly tied to a class (sursa: sinonim), or the returned code contains the searched words themselves (ancora_lexicala). False does NOT mean the rows are wrong — it means nothing confirms them beyond closeness of meaning.
potriviri[].cod string The code.
potriviri[].denumire string The name.
potriviri[].nivel string The level of the code: sectiune, diviziune, grupa or clasa.
potriviri[].versiune string The CAEN edition the code is expressed in. The same code means different things across editions, so this field is needed to tie the code to its page.
potriviri[].scor number The match score (0–1).
potriviri[].ancora_lexicala boolean The code contains THE VERY words searched for, in its official name or notes. A verifiable signal, not a calibrated one.
potriviri[].sursa string sinonim (a term explicitly tied to a class) or semantic (closeness of meaning).

Response examples

GEThttps://oneapi.ro/api/business/v1/caen/potriveste?text=vreau+sa+repar+biciclete&limita=3
{
    "data": {
        "text": "vreau sa repar biciclete",
        "potriviri": [
            {
                "cod": "9529",
                "denumire": "Repararea și întreținerea articolelor de uz personal și gospodăresc n.c.a.",
                "scor": 0.6010549664497375
            }
        ]
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareThe text parameter is missing.
429cota_depasitaThe plan's monthly quota has been exceeded (see Retry-After).
503mentenantaThe semantic index is not built for the requested version, or the embeddings service is temporarily unavailable.

All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.

{
    "eroare": {
        "cod": "validare",
        "mesaj": "The text parameter is missing.",
        "detalii": {
            "limita": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}