Skip to content

Documentation

Lumos API documentation

Everything you need to make your first request: the key, an example, the answer format, the costs and the errors. The examples were run on our test version.

Lumos API is in preparation. Keys are not being issued yet; on the waiting list we will tell you when it opens. The base address will be https://api.lumosstudio.ro.

Quick start

Your first request, in three steps

  1. Get a key

    A key looks like lk_test_… for the test environment or lk_live_… for the real one. We show it to you once, when it is created, so keep it somewhere safe. During the pilot, we issue the keys.

  2. Send the request

    Put the key in the Authorization: Bearer … header or in X-API-Key. Requests with a body (POST) send JSON, and read requests (GET) use parameters in the address.

  3. Read the answer

    The result is in data, and meta tells you what the request cost, how many credits are left and where the rules or data come from.

For example, check a tax id (free)

curl -X POST 'https://api.lumosstudio.ro/v1/validatori/cui' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"cui":"RO18547290"}'
{
  "data": {
    "valid": true,
    "normalized": "18547290",
    "vat_prefix": true,
    "reason": null
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.cui",
    "credits_charged": 0,
    "credits_remaining": 98
  }
}

Format

What an answer looks like

Every successful answer has the same shape. The fields in meta appear where they apply.

request_id
The request identifier. Give it to us if you have a question about the request.
environment
test or live, depending on the key used.
credits_charged, credits_remaining
What the request cost and what is left in the account.
rules_version
The version of the calculation rules, separate from the API version. Tax calculations show it.
data_as_of, sources
The date the data is from and its sources, with the licence. Operations on open data show them.
disclaimer
The note that the result is informative, not advice. Tax calculations show it.

The shape of an error

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this operation.",
    "request_id": "req_01J9Z6K3N8X2"
  }
}

Costs

Credits and limits

  • Each operation has a fixed price in credits, written next to it. An invalid request costs nothing, and if we make the mistake, the credits are returned.
  • Validators and utilities are free up to 3,000 calls a month; after that you get 429 free_quota_exceeded. The free monthly credits and the price of a credit are set at launch.
  • The pilot rate limit is 20 requests a minute on the free plan and 120 on the paid one; it may change before launch. The RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers show what is left, and when you go over you get 429 with Retry-After.
  • On requests that cost credits, send the Idempotency-Key header (8 to 128 characters). If you repeat the same request, you get the same answer without a second charge; the same key with different content gives 409.
  • Any key can have a daily credit cap, so that a faulty program or an AI agent stuck in a loop does not empty your account.
  • We do not keep the content of requests. We keep only who called, which operation it was, what it cost and how long it took; the one exception is the answer to a request with an Idempotency-Key, kept for 24 hours so it can be repeated; message checking (scam_check_text) keeps nothing, not even the answer, so it has no idempotent replay. Your account and usage, free, at GET /v1/account.

When something fails

Errors

HTTPCodeWhat it means
400invalid_requestThe request does not match the schema: details names the field. It costs nothing.
400invalid_jsonThe body is not a valid JSON object.
401unauthorizedThe key is missing, malformed or unknown.
401key_revokedThe key was revoked or has expired.
402insufficient_creditsNot enough credits for the operation; nothing was taken.
403service_not_enabledThe service is not enabled for your organization or key.
403organization_suspendedThe organization is suspended.
403feature_not_availableThe operation is not available yet.
409idempotency_conflictThe same Idempotency-Key was used with a different request.
413payload_too_largeThe body is larger than 64 KB.
422not_applicableThe request is valid but does not apply (for example D212 for an employee). No credits are taken.
429rate_limitedToo many requests in a minute; wait as long as Retry-After says.
429free_quota_exceededThis month's 3,000 free validator calls are used up.
429daily_cap_reachedThe key reached its daily credit cap.
500internal_errorSomething went wrong on our side. Credits are returned automatically.

Reference

The available operations

There are 19 operations in four services. DosaRO is added once it is ready.

TaxaRO: tax calculations

The same rules as on taxaro.lumosstudio.ro, kept up to date, with their version in every answer. The texts in the answer (labels, notes) are in Romanian; amounts are in lei.

POST

/v1/taxaro/calculations

2 credits

Calculates taxes and contributions for employees, PFA, SRL, dividends, NGOs and other income.

ParameterTypeRequiredDefault
formemployee · pfa_real · pfa_norma · srl_micro · srl_profit · ong · pf_rent · pf_dividends · pf_stock · pf_crypto · pf_copyrightyes–
tax_year2025 · 2026no2026
annual_incomenumber, ≥ 0yes–
expensesnumber, ≥ 0no0
has_employment_contractbooleannofalse
voluntary_casbooleannofalse
carried_lossesnumber, ≥ 0no–
income_normnumber, ≥ 0no–
held_over_one_yearbooleanno–
short_term_tourist_rentalbooleanno–
economic_incomenumber, ≥ 0no–
economic_expensesnumber, ≥ 0no–
distributed_sharenumber, ≥ 0, ≤ 1no–
reference_salarynumber, ≥ 0no–
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/taxaro/calculations' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"form":"pfa_real","annual_income":120000,"expenses":30000}'
Response (shortened)
{
  "data": {
    "form": "pfa_real",
    "tax_year": 2026,
    "currency": "RON",
    "gross_income": 120000,
    "net_income": 90000,
    "total_taxes": 28035,
    "net_take_home": 61965,
    "effective_rate": 0.233625,
    "breakdown": [
      {
        "key": "impozit",
        "label": "Impozit pe venit (10%)",
        "amount": 6885,
        "detail": "10% × 68.850 lei venit impozabil"
      },
      {
        "key": "cas",
        "label": "CAS — pensie (25%)",
        "amount": 12150,
        "detail": "25% × baza de 12 salarii minime"
      },
      {
        "key": "cass",
        "label": "CASS — sănătate (10%)",
        "amount": 9000,
        "detail": "10% × 90.000 lei"
      }
    ],
    "notes": [
      "CAS calculat la baza de 12 salarii minime (48.600 lei)."
    ],
    "warnings": []
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.calculate",
    "credits_charged": 2,
    "credits_remaining": 98,
    "rules_version": "taxaro-2026.10.14",
    "data_as_of": "2026-10-14",
    "disclaimer": {
      "code": "fiscal_calculation",
      "text": "Calcul informativ, bazat pe regulile publicate la data indicată în rules_version. Nu este consultanță fiscală; verifică suma finală cu un contabil sau cu ANAF."
    }
  }
}
POST

/v1/taxaro/comparisons

3 credits

Compares a PFA with an SRL for the same income.

ParameterTypeRequiredDefault
gross_incomenumber, ≥ 0yes–
expensesnumber, ≥ 0yes–
has_employment_contractbooleanno–
reference_salarynumber, ≥ 0no–
include_seriesbooleannofalse
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/taxaro/comparisons' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"gross_income":200000,"expenses":40000}'
Response (shortened)
{
  "data": {
    "pfa": {
      "form": "pfa_real",
      "tax_year": 2026,
      "currency": "RON",
      "gross_income": 200000,
      "net_income": 160000,
      "total_taxes": 52270,
      "net_take_home": 107730,
      "effective_rate": 0.26135,
      "breakdown": [
        {
          "key": "impozit",
          "label": "Impozit pe venit (10%)",
          "amount": 11970,
          "detail": "10% × 119.700 lei venit impozabil"
        },
        {
          "key": "cas",
          "label": "CAS — pensie (25%)",
          "amount": 24300,
          "detail": "25% × baza de 24 salarii minime"
        },
        {
          "key": "cass",
          "label": "CASS — sănătate (10%)",
          "amount": 16000,
          "detail": "10% × 160.000 lei"
        }
      ],
      "notes": [
        "CAS calculat la baza de 24 salarii minime (97.200 lei)."
      ],
      "warnings": []
    },
    "srl": {
      "form": "srl_micro",
      "tax_year": 2026,
      "currency": "RON",
      "gross_income": 200000,
      "net_income": 160000,
      "total_taxes": 50311.54,
      "net_take_home": 109688.45999999999,
      "effective_rate": 0.2515577,
      "breakdown": [
        {
          "key": "impozit",
          "label": "Impozit micro (1% din CA)",
          "amount": 2000,
          "detail": "1% × 200.000 lei"
        },
        {
          "key": "salariu",
          "label": "Taxe salariat obligatoriu",
          "amount": 21262.5,
          "detail": "CAS + CASS + impozit + CAM pentru salariul obligatoriu"
        },
        {
          "key": "dividende",
          "label": "Impozit dividende (16%)",
          "amount": 17329.04,
          "detail": "16% × 108.307 lei distribuiți"
        },
        "… (+1)"
      ],
      "notes": [
        "Salariat obligatoriu: 4.050 lei brut/lună → cost total angajator 49.694 lei/an.",
        "Salariul net al asociatului-angajat e inclus în „net în buzunar\"."
      ],
      "warnings": []
    },
    "difference": -1958.4599999999919,
    "winner": "srl",
    "breakeven_income": 130000,
    "verdict": "La venitul tău de 200.000 lei, SRL micro îți lasă cu 1.958 lei mai mult în buzunar."
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.compare",
    "credits_charged": 3,
    "credits_remaining": 98,
    "rules_version": "taxaro-2026.10.14",
    "data_as_of": "2026-10-14",
    "disclaimer": {
      "code": "fiscal_calculation",
      "text": "Calcul informativ, bazat pe regulile publicate la data indicată în rules_version. Nu este consultanță fiscală; verifică suma finală cu un contabil sau cu ANAF."
    }
  }
}
POST

/v1/taxaro/aggregations

3 credits

For several income sources: CAS and CASS on the total, income tax on each source.

ParameterTypeRequiredDefault
sourcesarrayyes–
voluntary_casbooleanno–
reference_salarynumber, ≥ 0no–
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/taxaro/aggregations' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"sources":[{"type":"employee","monthly_gross":8000},{"type":"pf_rent","annual_gross":30000}]}'
Response (shortened)
{
  "data": {
    "gross_income_total": 126000,
    "total_taxes": 42240,
    "net_take_home": 83760,
    "effective_rate": 0.3352380952380952,
    "breakdown": [
      {
        "key": "impozit",
        "label": "Impozit — Chirii",
        "amount": 2400,
        "detail": "10% din venitul net (deducere forfetară 20%)"
      },
      {
        "key": "cas",
        "label": "CAS — pensie (25%)",
        "amount": 24000,
        "detail": "25% din brut, reținut de angajator"
      },
      {
        "key": "cass",
        "label": "CASS — sănătate (10%)",
        "amount": 9600,
        "detail": "10% din brut, reținut de angajator"
      },
      "… (+1)"
    ],
    "sources": [
      {
        "form": "pf_rent",
        "tax_year": 2026,
        "currency": "RON",
        "gross_income": 30000,
        "net_income": 24000,
        "total_taxes": 2400,
        "net_take_home": 27600,
        "effective_rate": 0.08,
        "breakdown": [
          {
            "key": "impozit",
            "label": "Impozit — Chirii",
            "amount": 2400,
            "detail": "10% din venitul net (deducere forfetară 20%)"
          },
          {
            "key": "cass",
            "label": "CASS alocat — Chirii",
            "amount": 0
          }
        ],
        "notes": [],
        "warnings": []
      },
      {
        "form": "employee",
        "tax_year": 2026,
        "currency": "RON",
        "gross_income": 96000,
        "net_income": null,
        "total_taxes": 39840,
        "net_take_home": 56160,
        "effective_rate": 0.415,
        "breakdown": [
          {
            "key": "cas",
            "label": "CAS — pensie (25%)",
            "amount": 24000,
            "detail": "25% din brut, reținut de angajator"
          },
          {
            "key": "cass",
            "label": "CASS — sănătate (10%)",
            "amount": 9600,
            "detail": "10% din brut, reținut de angajator"
          },
          {
            "key": "impozit",
            "label": "Impozit pe venit (10%)",
            "amount": 6240,
            "detail": "10% după scăderea contribuțiilor (fără deduceri personale)"
          }
        ],
        "notes": [
          "Salariu: Estimare fără deduceri personale — netul real poate fi mai mare la salarii mici."
        ],
        "warnings": []
      }
    ],
    "savings_vs_separate": 0,
    "notes": []
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.aggregate",
    "credits_charged": 3,
    "credits_remaining": 98,
    "rules_version": "taxaro-2026.10.14",
    "data_as_of": "2026-10-14",
    "disclaimer": {
      "code": "fiscal_calculation",
      "text": "Calcul informativ, bazat pe regulile publicate la data indicată în rules_version. Nu este consultanță fiscală; verifică suma finală cu un contabil sau cu ANAF."
    }
  }
}
POST

/v1/taxaro/d212-mapping

5 credits

Tells you what to fill in on the single tax return (D212), based on a calculation.

ParameterTypeRequiredDefault
formemployee · pfa_real · pfa_norma · srl_micro · srl_profit · ong · pf_rent · pf_dividends · pf_stock · pf_crypto · pf_copyrightyes–
tax_year2025 · 2026no2026
annual_incomenumber, ≥ 0yes–
expensesnumber, ≥ 0no0
has_employment_contractbooleannofalse
voluntary_casbooleannofalse
carried_lossesnumber, ≥ 0no–
income_normnumber, ≥ 0no–
held_over_one_yearbooleanno–
short_term_tourist_rentalbooleanno–
economic_incomenumber, ≥ 0no–
economic_expensesnumber, ≥ 0no–
distributed_sharenumber, ≥ 0, ≤ 1no–
reference_salarynumber, ≥ 0no–
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/taxaro/d212-mapping' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"form":"pfa_real","annual_income":120000,"expenses":30000}'
Response (shortened)
{
  "data": {
    "chapter": "Capitolul I — Venituri realizate în 2026",
    "sections": [
      {
        "title": "Secțiunea I.1 — Venituri din activități independente (sistem real)",
        "fields": [
          {
            "label": "Venit brut realizat",
            "value": 120000
          },
          {
            "label": "Cheltuieli deductibile",
            "value": 30000
          },
          {
            "label": "Venit net anual",
            "value": 90000
          }
        ]
      },
      {
        "title": "Secțiunea — Contribuția de asigurări sociale (CAS)",
        "fields": [
          {
            "label": "Baza de calcul CAS",
            "value": 48600
          },
          {
            "label": "CAS datorat",
            "value": 12150
          }
        ]
      },
      {
        "title": "Secțiunea — Contribuția de asigurări sociale de sănătate (CASS)",
        "fields": [
          {
            "label": "Baza de calcul CASS",
            "value": 90000
          },
          {
            "label": "CASS datorat",
            "value": 9000
          }
        ]
      },
      "… (+1)"
    ],
    "notes": [
      "Cheltuielile deductibile trebuie să aibă documente justificative (facturi, contracte) — le păstrezi 5 ani pentru un eventual control.",
      "Dacă activitatea a fost pe pierdere, nu completezi impozit, dar poți reporta pierderea fiscală în anii următori — discută cu un contabil."
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.d212",
    "credits_charged": 5,
    "credits_remaining": 98,
    "rules_version": "taxaro-2026.10.14",
    "data_as_of": "2026-10-14",
    "disclaimer": {
      "code": "fiscal_calculation",
      "text": "Calcul informativ, bazat pe regulile publicate la data indicată în rules_version. Nu este consultanță fiscală; verifică suma finală cu un contabil sau cu ANAF."
    }
  }
}
GET

/v1/taxaro/deadlines

1 credit

Tax deadlines for a type of business or income.

ParameterTypeRequiredDefault
formemployee · pfa_real · pfa_norma · srl_micro · srl_profit · ong · pf_rent · pf_dividends · pf_stock · pf_crypto · pf_copyrightno–
fromstringno–
tostringno–
limitinteger, ≥ 1, ≤ 200no100
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/taxaro/deadlines?form=srl_micro&from=2026-12-01&to=2026-12-31&limit=2' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": [
    {
      "id": "d100-dividende-2026-12-21",
      "date": "2026-12-21",
      "nominal_date": "2026-12-25",
      "title": "D100 — impozit pe dividende",
      "description": "Declararea și plata impozitului pe dividende (16%) reținut la sursă, pentru dividendele plătite în luna precedentă.",
      "declaration": "D100",
      "recurrence": "monthly",
      "forms": [
        "srl_micro",
        "srl_profit"
      ],
      "period": "luna noiembrie 2026",
      "condition": "Doar în lunile în care plătești dividende asociaților.",
      "confirmed_by_anaf": false,
      "source": {
        "label": "ANAF, Calendarul obligațiilor fiscale 2026",
        "url": "https://static.anaf.ro/static/10/Anaf/AsistentaContribuabili_r/Calendar/Calendar_obligatii_fiscale_2025.htm"
      }
    },
    {
      "id": "d112-2026-12-21",
      "date": "2026-12-21",
      "nominal_date": "2026-12-25",
      "title": "D112 — contribuții și impozit pe salarii",
      "description": "Declarația și plata contribuțiilor sociale (CAS, CASS), a contribuției asiguratorii pentru muncă și a impozitului pe venit reținut, pentru toți angajații lunii precedente.",
      "declaration": "D112",
      "recurrence": "monthly",
      "forms": [
        "srl_micro",
        "srl_profit",
        "ong",
        "… (+2)"
      ],
      "period": "luna noiembrie 2026",
      "condition": "Dacă ai angajați sau un administrator plătit cu salariu (la PFA, doar dacă ai angajați).",
      "confirmed_by_anaf": false,
      "source": {
        "label": "ANAF, Calendarul obligațiilor fiscale 2026",
        "url": "https://static.anaf.ro/static/10/Anaf/AsistentaContribuabili_r/Calendar/Calendar_obligatii_fiscale_2025.htm"
      }
    }
  ],
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.deadlines",
    "credits_charged": 1,
    "credits_remaining": 98,
    "data_as_of": "2026-10-14",
    "disclaimer": {
      "code": "fiscal_calculation",
      "text": "Calcul informativ, bazat pe regulile publicate la data indicată în rules_version. Nu este consultanță fiscală; verifică suma finală cu un contabil sau cu ANAF."
    }
  }
}
GET

/v1/taxaro/rules

free

The rules version and the date it was updated, for each fiscal year.

ParameterTypeRequiredDefault
tax_yearinteger, ≥ -9007199254740991no2026
Request
curl 'https://api.lumosstudio.ro/v1/taxaro/rules?tax_year=2026' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "tax_year": 2026,
    "rules_version": "taxaro-2026.10.14",
    "updated_at": "2026-10-14",
    "available_years": [
      2025,
      2026
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "taxaro.rules",
    "credits_charged": 0,
    "credits_remaining": 98
  }
}

FonduRO: funding programs

The same programs and rules as on fonduro.lumosstudio.ro: a program is shown as “open” only if it was checked in the last 90 days and its deadline has not passed. Every answer shows the date it was checked and the official source.

GET

/v1/fonduro/programs

1 credit

Published funding programs, filtered by type of applicant, category, county, status and text.

ParameterTypeRequiredDefault
qstringno–
statusOPEN · UPCOMING · UNVERIFIED · CLOSED · SUSPENDED · ARCHIVEDno–
user_typeINDIVIDUAL · BUSINESS · NGO · LOCAL_AUTHORITY · MIXEDno–
categorystringno–
countystringno–
budget_minnumberno–
budget_maxnumberno–
sortdefault · closing_soon · amount_desc · newestnodefault
limitinteger, ≥ 1, ≤ 50no20
offsetinteger, ≥ 0no0
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/fonduro/programs?status=OPEN&user_type=INDIVIDUAL&limit=2' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "total": 3,
    "offset": 0,
    "results": [
      {
        "slug": "tineri-fermieri-dr12",
        "name": "Tineri fermieri – consolidarea exploatațiilor (AFIR, DR-12)",
        "short_description": "Până la 200.000 EUR pe proiect (maximum 80% din costuri la fermierii de până la 40 de ani) pentru investiții în exploatație. Sesiune deschisă 6 octombrie – 2 decembrie 2026.",
        "user_type": "INDIVIDUAL",
        "category": "Agricultură",
        "subcategory": "Tineri fermieri",
        "status": "OPEN",
        "funding_source": {
          "name": "Agenția pentru Finanțarea Investițiilor Rurale",
          "type": "GOVERNMENT"
        },
        "grant_amount_min": null,
        "grant_amount_max": 200000,
        "co_financing_percent": null,
        "currency": "EUR",
        "opening_date": "2026-10-05",
        "closing_date": "2026-12-01",
        "last_verified_at": "2026-10-12T21:00:00.000Z",
        "official_source_url": "https://www.afir.ro/domenii-de-interventie/detalii-si-anexe-dr-12/",
        "application_url": "https://www.afir.ro/comunicate/170-de-milioane-euro-pentru-exploatatiile-tinerilor-fermieri/"
      },
      {
        "slug": "rabla-auto-2026",
        "name": "Rabla Auto 2026 – persoane fizice",
        "short_description": "Ecotichete de 10.000–18.500 lei pentru un autovehicul nou, în schimbul unui autovehicul uzat predat la casare. Înscrieri până pe 31 decembrie 2026 sau până la epuizarea fondurilor.",
        "user_type": "INDIVIDUAL",
        "category": "Transport",
        "subcategory": "Vehicule",
        "status": "OPEN",
        "funding_source": {
          "name": "Administrația Fondului pentru Mediu",
          "type": "GOVERNMENT"
        },
        "grant_amount_min": 10000,
        "grant_amount_max": 18500,
        "co_financing_percent": null,
        "currency": "RON",
        "opening_date": "2026-07-19",
        "closing_date": "2026-12-30",
        "last_verified_at": "2026-10-18T21:00:00.000Z",
        "official_source_url": "https://www.afm.ro/rabla_auto_pf.php",
        "application_url": "https://inscrierionline.afm.ro"
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "fonduro.programs.list",
    "credits_charged": 1,
    "credits_remaining": 98,
    "data_as_of": "2026-11-15",
    "disclaimer": {
      "code": "funding_information",
      "text": "Informații orientative despre programe de finanțare, verificate la data din fiecare program. Condițiile se schimbă: confirmă oricând pe pagina oficială a programului înainte să apl…"
    }
  }
}
GET

/v1/fonduro/programs/{slug}

1 credit

The details of a program: amount, co-financing, eligibility, official source and the date it was checked.

ParameterTypeRequiredDefault
slugstringyes–
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/fonduro/programs/tineri-fermieri-dr12' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "slug": "tineri-fermieri-dr12",
    "name": "Tineri fermieri – consolidarea exploatațiilor (AFIR, DR-12)",
    "short_description": "Până la 200.000 EUR pe proiect (maximum 80% din costuri la fermierii de până la 40 de ani) pentru investiții în exploatație. Sesiune deschisă 6 octombrie – 2 decembrie 2026.",
    "user_type": "INDIVIDUAL",
    "category": "Agricultură",
    "subcategory": "Tineri fermieri",
    "status": "OPEN",
    "funding_source": {
      "name": "Agenția pentru Finanțarea Investițiilor Rurale",
      "type": "GOVERNMENT"
    },
    "grant_amount_min": null,
    "grant_amount_max": 200000,
    "co_financing_percent": null,
    "currency": "EUR",
    "opening_date": "2026-10-05",
    "closing_date": "2026-12-01",
    "last_verified_at": "2026-10-12T21:00:00.000Z",
    "official_source_url": "https://www.afir.ro/domenii-de-interventie/detalii-si-anexe-dr-12/",
    "application_url": "https://www.afir.ro/comunicate/170-de-milioane-euro-pentru-exploatatiile-tinerilor-fermieri/",
    "full_description": "Intervenția DR-12 din Planul Strategic PAC 2023–2027 finanțează investiții în consolidarea exploatațiilor tinerilor fermieri instalați și ale fermierilor de până la 45 de ani. Vech…",
    "eligibility_summary": "Fermieri care sunt șefi ai exploatației și au cel mult 40 de ani (înainte de a împlini 41) la depunere; beneficiari ai submăsurii 6.1 din PNDR (la orice vârstă); fermieri de cel mu…",
    "eligible_expenses": "Investițiile eligibile sunt listate în Ghidul solicitantului DR-12 (afir.ro, Finanțare > Exploatații agricole > DR-12).",
    "ineligible_expenses": null,
    "application_process": "Cererea de finanțare se depune online în sistemul informatic AFIR, în perioada sesiunii, pe baza Ghidului solicitantului DR-12.",
    "required_documents": "Lista este în Ghidul solicitantului DR-12, pe afir.ro.",
    "application_method": "PLATFORM",
    "application_difficulty": "HIGH",
    "competition_level": "HIGH",
    "estimated_preparation_time": "6–10 săptămâni",
    "recommended_for_beginners": false,
    "counties": [],
    "tags": [
      "tineri fermieri",
      "PNDR",
      "instalare fermier",
      "… (+4)"
    ],
    "faq": [],
    "eligibility_rules": [
      {
        "type": "age",
        "operator": "less_than_or_equal",
        "value": "45",
        "description": "Fermier de până la 45 de ani (80% sprijin până la 40 de ani)"
      },
      {
        "type": "userType",
        "operator": "in",
        "value": "INDIVIDUAL,BUSINESS",
        "description": "Tineri fermieri (PF sau PFA/SRL)"
      }
    ],
    "verification": {
      "last_verified_at": "2026-10-12T21:00:00.000Z",
      "months_ago": 1,
      "fresh": true
    }
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "fonduro.programs.get",
    "credits_charged": 1,
    "credits_remaining": 98,
    "data_as_of": "2026-11-15",
    "disclaimer": {
      "code": "funding_information",
      "text": "Informații orientative despre programe de finanțare, verificate la data din fiecare program. Condițiile se schimbă: confirmă oricând pe pagina oficială a programului înainte să apl…"
    }
  }
}
POST

/v1/fonduro/matches

3 credits

The programs that fit a profile (type, county, turnover, employees).

ParameterTypeRequiredDefault
user_typeINDIVIDUAL · BUSINESS · NGO · LOCAL_AUTHORITY · ALLyes–
countystringno–
citystringno–
project_typestringno–
is_homeownerbooleanno–
company_sizestringno–
sectorstringno–
annual_revenuenumber, ≥ 0no–
employee_countinteger, ≥ 0no–
ageinteger, ≥ 0, ≤ 130no–
property_typestringno–
business_agenumber, ≥ 0, ≤ 200no–
limitinteger, ≥ 1, ≤ 50no20
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/fonduro/matches' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"user_type":"INDIVIDUAL","county":"Neamț","is_homeowner":true,"limit":2}'
Response (shortened)
{
  "data": {
    "total_candidates": 10,
    "results": [
      {
        "score": 1,
        "matched_rules": [
          "userType"
        ],
        "unmatched_rules": [],
        "program": {
          "slug": "afm-baterii-prosumatori",
          "name": "Baterii de stocare pentru prosumatori (AFM 2026)",
          "short_description": "Până la 75% din costul unui sistem de stocare cu baterii (minimum 10 kWh), maximum 15.000 lei, pentru persoane fizice care sunt prosumatori. Sesiunea de înscriere nu a fost încă an…",
          "user_type": "INDIVIDUAL",
          "category": "Energie",
          "subcategory": "Stocare energie",
          "status": "UPCOMING",
          "funding_source": {
            "name": "Administrația Fondului pentru Mediu",
            "type": "GOVERNMENT"
          },
          "grant_amount_min": null,
          "grant_amount_max": 15000,
          "co_financing_percent": 25,
          "currency": "RON",
          "opening_date": null,
          "closing_date": null,
          "last_verified_at": "2026-10-18T21:00:00.000Z",
          "official_source_url": "https://www.afm.ro/baterii.php",
          "application_url": null
        }
      },
      {
        "score": 1,
        "matched_rules": [
          "userType"
        ],
        "unmatched_rules": [],
        "program": {
          "slug": "rabla-auto-2026",
          "name": "Rabla Auto 2026 – persoane fizice",
          "short_description": "Ecotichete de 10.000–18.500 lei pentru un autovehicul nou, în schimbul unui autovehicul uzat predat la casare. Înscrieri până pe 31 decembrie 2026 sau până la epuizarea fondurilor.",
          "user_type": "INDIVIDUAL",
          "category": "Transport",
          "subcategory": "Vehicule",
          "status": "OPEN",
          "funding_source": {
            "name": "Administrația Fondului pentru Mediu",
            "type": "GOVERNMENT"
          },
          "grant_amount_min": 10000,
          "grant_amount_max": 18500,
          "co_financing_percent": null,
          "currency": "RON",
          "opening_date": "2026-07-19",
          "closing_date": "2026-12-30",
          "last_verified_at": "2026-10-18T21:00:00.000Z",
          "official_source_url": "https://www.afm.ro/rabla_auto_pf.php",
          "application_url": "https://inscrierionline.afm.ro"
        }
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "fonduro.match",
    "credits_charged": 3,
    "credits_remaining": 98,
    "data_as_of": "2026-11-15",
    "disclaimer": {
      "code": "funding_information",
      "text": "Informații orientative despre programe de finanțare, verificate la data din fiecare program. Condițiile se schimbă: confirmă oricând pe pagina oficială a programului înainte să apl…"
    }
  }
}
GET

/v1/fonduro/calendar

1 credit

When calls open and when they close.

ParameterTypeRequiredDefault
fromstringno–
tostringno–
user_typeINDIVIDUAL · BUSINESS · NGO · LOCAL_AUTHORITY · MIXEDno–
limitinteger, ≥ 1, ≤ 200no100
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/fonduro/calendar?from=2026-11-16&to=2026-12-31&user_type=LOCAL_AUTHORITY&limit=3' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "from": "2026-11-16",
    "to": "2026-12-31",
    "events": [
      {
        "date": "2026-11-19",
        "kind": "closes",
        "slug": "fm-stocare-energie-entitati-publice",
        "name": "Baterii de stocare a energiei – entități publice (Fondul pentru Modernizare)",
        "status": "OPEN",
        "user_type": "LOCAL_AUTHORITY"
      },
      {
        "date": "2026-11-19",
        "kind": "closes",
        "slug": "fm-autoconsum-solar-entitati-publice",
        "name": "Panouri solare cu stocare pentru autoconsum – entități publice (Fondul pentru Modernizare)",
        "status": "OPEN",
        "user_type": "LOCAL_AUTHORITY"
      },
      {
        "date": "2026-11-26",
        "kind": "closes",
        "slug": "peo-diversificarea-serviciilor-educatie-timpurie",
        "name": "Diversificarea serviciilor de educație timpurie – relansare 2026",
        "status": "OPEN",
        "user_type": "LOCAL_AUTHORITY"
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "fonduro.calendar",
    "credits_charged": 1,
    "credits_remaining": 98,
    "data_as_of": "2026-11-15",
    "disclaimer": {
      "code": "funding_information",
      "text": "Informații orientative despre programe de finanțare, verificate la data din fiecare program. Condițiile se schimbă: confirmă oricând pe pagina oficială a programului înainte să apl…"
    }
  }
}

Scam Alert: fraud checks

The same rules as on scamalert.lumosstudio.ro. The text sent for checking is not kept, and the verdict is indicative: it does not replace an investigation.

POST

/v1/scam/checks

1 credit

Checks a text, a link or a number (up to 4000 characters) and returns a verdict, a score and the reasons.

ParameterTypeRequiredDefault
contentstringyes–
localero · enno–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/scam/checks' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"content":"Va informam ca coletul dumneavoastra a fost retinut. Actualizati datele aici: https://fan-courier-livrare.top/ro"}'
Response (shortened)
{
  "data": {
    "verdict": "red",
    "score": 100,
    "category": "sms-false",
    "reasons": [
      {
        "id": "delivery",
        "points": 55,
        "label": "Mesaj despre un colet „reținut” sau „nelivrat”, cu o taxă de plătit. Curierii reali nu cer taxe prin link.",
        "icon": "package",
        "evidence": "retinut",
        "informational": false
      },
      {
        "id": "brandInAddress",
        "points": 50,
        "label": "Adresa „fan-courier-livrare.top” folosește numele FAN Courier, dar nu e adresa oficială (fancourier.ro).",
        "icon": "link",
        "informational": false
      },
      {
        "id": "suspiciousTld",
        "points": 20,
        "label": "Terminația „.top” e ieftină și foarte rar folosită de servicii oficiale.",
        "icon": "link",
        "informational": false
      },
      "… (+2)"
    ],
    "detected": {
      "primary_type": "link",
      "phones": [],
      "domains": [
        "fan-courier-livrare.top"
      ],
      "links": [
        "https://fan-courier-livrare.top/ro"
      ]
    }
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "scam.check",
    "credits_charged": 1,
    "credits_remaining": 98,
    "disclaimer": {
      "code": "fraud_verification",
      "text": "Verdictul e orientativ: se bazează pe reguli și pe ce a confirmat echipa Scam Alert, nu pe o investigație. Un mesaj „verde” nu garantează că e sigur; în caz de dubiu, nu da bani, c…"
    }
  }
}
GET

/v1/scam/numbers/{number}

1 credit

The status of a phone number: reported or confirmed by the team.

ParameterTypeRequiredDefault
numberstringyes–
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/scam/numbers/0711111111' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "number": "+40711111111",
    "status": "unknown",
    "reporter_count": 0,
    "first_reported": null,
    "last_reported": null,
    "explanation": "Nu avem informații verificate despre acest număr. Asta nu înseamnă că e sigur."
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "scam.number",
    "credits_charged": 1,
    "credits_remaining": 98,
    "disclaimer": {
      "code": "fraud_verification",
      "text": "Verdictul e orientativ: se bazează pe reguli și pe ce a confirmat echipa Scam Alert, nu pe o investigație. Un mesaj „verde” nu garantează că e sigur; în caz de dubiu, nu da bani, c…"
    }
  }
}
GET

/v1/scam/domains/{domain}

1 credit

The status of a domain: its age, whether it looks like a known brand, and whether it is confirmed.

ParameterTypeRequiredDefault
domainstringyes–
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/scam/domains/anaf-rambursare.com' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "domain": "anaf-rambursare.com",
    "registrable": "anaf-rambursare.com",
    "official_brand": null,
    "status": "unknown",
    "reporter_count": 0,
    "registered_recently": null,
    "signals": [
      {
        "id": "brandInAddress",
        "points": 50,
        "brand": "ANAF"
      },
      {
        "id": "riskyPath",
        "points": 15
      }
    ],
    "link_score": 65
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "scam.domain",
    "credits_charged": 1,
    "credits_remaining": 98,
    "disclaimer": {
      "code": "fraud_verification",
      "text": "Verdictul e orientativ: se bazează pe reguli și pe ce a confirmat echipa Scam Alert, nu pe o investigație. Un mesaj „verde” nu garantează că e sigur; în caz de dubiu, nu da bani, c…"
    }
  }
}
GET

/v1/scam/alerts

1 credit

Active alerts (the national cybersecurity agency, the community, our team).

ParameterTypeRequiredDefault
sourcednsc · community · manualno–
limitinteger, ≥ 1, ≤ 50no20
localero · enno–
Request
curl 'https://api.lumosstudio.ro/v1/scam/alerts?limit=2' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": [
    {
      "id": "e230455d-9646-4ff1-ac9a-d6f1f6caf9bc",
      "title": "Reclame cu vedete false care „recomandă” platforme de trading",
      "description": "Reclame pe rețele sociale cu imagini ale unor persoane publice, folosite fără acord, care promovează platforme de investiții cu „profit garantat”.",
      "source": "manual",
      "scam_type": "investitii-false",
      "source_url": null,
      "created_at": "2026-11-14T22:16:19.558Z"
    },
    {
      "id": "948541eb-64e4-40e6-850f-ba6d64460ce5",
      "title": "Apeluri false „de la bancă” cu numărul mascat (spoofing)",
      "description": "Escroci care sună pretinzând a fi de la banca ta, cu numărul afișat identic cu cel real. Cer transfer „într-un cont sigur”. Băncile nu cer niciodată asta telefonic.",
      "source": "manual",
      "scam_type": "apeluri-telefonice",
      "source_url": null,
      "created_at": "2026-11-14T22:16:19.557Z"
    }
  ],
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "scam.alerts",
    "credits_charged": 1,
    "credits_remaining": 98,
    "data_as_of": "2026-11-14",
    "disclaimer": {
      "code": "fraud_verification",
      "text": "Verdictul e orientativ: se bazează pe reguli și pe ce a confirmat echipa Scam Alert, nu pe o investigație. Un mesaj „verde” nu garantează că e sigur; în caz de dubiu, nu da bani, c…"
    }
  }
}

Validators and utilities

Small checks and open data, free up to 3,000 calls a month. The sources (INS, ONRC) and their licence are in the answer.

POST

/v1/validatori/cui

free within the monthly limit

Checks whether a tax ID (CUI) has the correct form.

ParameterTypeRequiredDefault
cuistringyes–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/validatori/cui' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"cui":"RO18547290"}'
Response (shortened)
{
  "data": {
    "valid": true,
    "normalized": "18547290",
    "vat_prefix": true,
    "reason": null
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.cui",
    "credits_charged": 0,
    "credits_remaining": 98
  }
}
POST

/v1/validatori/iban

free within the monthly limit

Checks whether a Romanian IBAN has the correct form (structure and check digits).

ParameterTypeRequiredDefault
ibanstringyes–
Request
curl -X POST 'https://api.lumosstudio.ro/v1/validatori/iban' \
  -H 'Authorization: Bearer lk_test_…' \
  -H 'Content-Type: application/json' \
  -d '{"iban":"RO49 AAAA 1B31 0075 9384 0000"}'
Response (shortened)
{
  "data": {
    "valid": true,
    "normalized": "RO49 AAAA 1B31 0075 9384 0000",
    "bank_code": "AAAA",
    "reason": null
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.iban",
    "credits_charged": 0,
    "credits_remaining": 98
  }
}
GET

/v1/validatori/localitati

free within the monthly limit

Search localities and counties by name, with their official code (SIRUTA).

ParameterTypeRequiredDefault
qstringyes–
countystringno–
limitinteger, ≥ 1, ≤ 50no20
Request
curl 'https://api.lumosstudio.ro/v1/validatori/localitati?q=piatra%20neamt&limit=2' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "total": 1,
    "results": [
      {
        "siruta": 120735,
        "name": "Piatra-Neamț",
        "county": "Neamț",
        "county_code": 27,
        "postal_code": "610004",
        "parent_siruta": 120726
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.localitati",
    "credits_charged": 0,
    "credits_remaining": 98,
    "sources": [
      {
        "name": "SIRUTA, Institutul Național de Statistică",
        "dataset": "SIRUTA_s1 2026",
        "url": "https://data.gov.ro/dataset/siruta_s1-2026",
        "licence": "CC-BY-4.0",
        "as_of": "2026-08-11"
      }
    ],
    "data_as_of": "2026-08-11"
  }
}
GET

/v1/validatori/caen

free within the monthly limit

Look up a CAEN code by number or name.

ParameterTypeRequiredDefault
codestringno–
qstringno–
versionstringno–
limitinteger, ≥ 1, ≤ 50no20
Request
curl 'https://api.lumosstudio.ro/v1/validatori/caen?code=6201&limit=2' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "total": 1,
    "results": [
      {
        "code": "6201",
        "name": "Activități de realizare a soft-ului la comandă (software orientat client)",
        "section": "J",
        "version": "Versiunea 2008"
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.caen",
    "credits_charged": 0,
    "credits_remaining": 98,
    "sources": [
      {
        "name": "Nomenclatorul CAEN, Oficiul Național al Registrului Comerțului",
        "dataset": "Nomenclatoare utilizate în decodificarea stării firmei, a obiectului de activitate și a versiunii CAEN - 04.11.2026",
        "url": "https://data.gov.ro/dataset/nomenclatoare-04-11-2026",
        "licence": "CC-BY-4.0",
        "as_of": "2026-11-06"
      }
    ],
    "data_as_of": "2026-11-06"
  }
}
GET

/v1/validatori/zile-lucratoare

free within the monthly limit

Working days and public holidays in a period.

ParameterTypeRequiredDefault
fromstringyes–
tostringyes–
Request
curl 'https://api.lumosstudio.ro/v1/validatori/zile-lucratoare?from=2026-12-01&to=2026-12-31' \
  -H 'Authorization: Bearer lk_test_…'
Response (shortened)
{
  "data": {
    "from": "2026-12-01",
    "to": "2026-12-31",
    "working_days": 21,
    "weekend_days": 8,
    "public_holidays": [
      {
        "date": "2026-12-01",
        "names": [
          "Ziua Națională a României"
        ],
        "weekday": true
      },
      {
        "date": "2026-12-25",
        "names": [
          "Crăciunul"
        ],
        "weekday": true
      },
      {
        "date": "2026-12-26",
        "names": [
          "A doua zi de Crăciun"
        ],
        "weekday": false
      }
    ]
  },
  "meta": {
    "request_id": "req_01J9Z6K3N8X2",
    "environment": "test",
    "operation": "validatori.zile_lucratoare",
    "credits_charged": 0,
    "credits_remaining": 98
  }
}

MCP

From AI assistants, through MCP

The same operations are tools for AI assistants. They use the same key, the same checks and the same costs as REST.

Add the server to Claude Code

claude mcp add --transport http lumos-api https://api.lumosstudio.ro/mcp \
  --header "Authorization: Bearer lk_test_…"

The server answers with JSON, without a session. An MCP client asks it for the list of tools, then calls them one by one.

ToolREST
taxaro_calculatePOST /v1/taxaro/calculations
taxaro_compare_pfa_srlPOST /v1/taxaro/comparisons
taxaro_aggregate_incomesPOST /v1/taxaro/aggregations
taxaro_d212_fieldsPOST /v1/taxaro/d212-mapping
taxaro_deadlinesGET /v1/taxaro/deadlines
taxaro_rules_versionGET /v1/taxaro/rules
fonduro_search_programsGET /v1/fonduro/programs
fonduro_get_programGET /v1/fonduro/programs/{slug}
fonduro_match_programsPOST /v1/fonduro/matches
fonduro_deadlinesGET /v1/fonduro/calendar
scam_check_textPOST /v1/scam/checks
scam_lookup_numberGET /v1/scam/numbers/{number}
scam_lookup_domainGET /v1/scam/domains/{domain}
scam_list_alertsGET /v1/scam/alerts
validatori_cuiPOST /v1/validatori/cui
validatori_ibanPOST /v1/validatori/iban
validatori_localitatiGET /v1/validatori/localitati
validatori_caenGET /v1/validatori/caen
validatori_zile_lucratoareGET /v1/validatori/zile-lucratoare

Want a key when it opens?

Leave us your email address and we will let you know once.